这是我的帖子PDFBox command line merge tool warnings的后续
以下是我在调查PDFBox合并命令行工具和记录器时的注意事项和问题。
我将在我的文章中引用以下jar文件:
pdfbox-app-2.0.26.jar -这是从PDFBox站点下载的正式jar文件。
pdfbox-app-3.0.0-alpha3.jar -这是从PDFBox站点下载的正式jar文件。
我从github源本地构建的pdfbox-app-3.0.0-SNAPSHOT.jar - jar文件
我最初的目标是能够使用文件配置通过PDFBox合并工具控制日志记录的级别。具体来说,能够抑制PDFBox在合并过程中记录的大量PDF电子邮件文件的警告。在调查期间,由于缺乏Java技能,我面临着许多挑战,不得不比我预期的还要多,技能差距仍然很大,-:(
默认Logger情况
首先,我在启动时启用了诊断,以发现默认情况下选择哪个记录器( Jdk14Logger还是Log4JLogger )。我运行了以下命令文件:
@echo off
set diag=-Dorg.apache.commons.logging.diagnostics.dest=STDOUT
del merge.pdf
echo "########## java %diag% -jar pdfbox-app-2.0.26.jar PDFMerger pdf1.pdf pdf2.pdf merge.pdf"
java %diag% -jar pdfbox-app-2.0.26.jar PDFMerger pdf1.pdf pdf2.pdf merge.pdf
del merge.pdf
echo "######### java %diag% -jar pdfbox-app-3.0.0-alpha3.jar merge -o merge.pdf -i pdf1.pdf -i pdf2.pdf"
java %diag% -jar pdfbox-app-3.0.0-alpha3.jar merge -o merge.pdf -i pdf1.pdf -i pdf2.pdf
del merge.pdf
echo "######## java %diag% -jar pdfbox-app-3.0.0-SNAPSHOT.jar merge -o merge.pdf -i pdf1.pdf -i pdf2.pdf"
java %diag% -jar pdfbox-app-3.0.0-SNAPSHOT.jar merge -o merge.pdf -i pdf1.pdf -i pdf2.pdfjar命令在所有pdfbox-app* jar文件中报告了包括Log4JLogger在内的同一组记录器。
$ jar -tf pdfbox-app-3.0.0-SNAPSHOT.jar|grep -i logger
org/apache/commons/logging/impl/AvalonLogger.class
org/apache/commons/logging/impl/Jdk13LumberjackLogger.class
org/apache/commons/logging/impl/Jdk14Logger.class
org/apache/commons/logging/impl/Log4JLogger.class
org/apache/commons/logging/impl/LogKitLogger.class但是,pdfbox 2.0.26.jar、pdfbox 3.0.0-app 3.jar和pdfbox 3.0.0-SNAPSHOT.jar都没有选择Log4JLogger,而是选择了Jdk14Logger。
[LogFactoryImpl@1524126153 from jdk.internal.loader.ClassLoaders$AppClassLoader@205029188] No user-specified Log implementation; performing discovery using the standard supported logging implementations...
[LogFactoryImpl@1524126153 from jdk.internal.loader.ClassLoaders$AppClassLoader@205029188] Attempting to instantiate 'org.apache.commons.logging.impl.Log4JLogger'
[LogFactoryImpl@1524126153 from jdk.internal.loader.ClassLoaders$AppClassLoader@205029188] Trying to load 'org.apache.commons.logging.impl.Log4JLogger' from classloader jdk.internal.loader.ClassLoaders$AppClassLoader@205029188
[LogFactoryImpl@1524126153 from jdk.internal.loader.ClassLoaders$AppClassLoader@205029188] Class 'org.apache.commons.logging.impl.Log4JLogger' was found at 'jar:file:/C:/Users/tata/Documents/PDFBox/pdfbox-app-3.0.0-alpha3.jar!/org/apache/commons/logging/impl/Log4JLogger.class'
[LogFactoryImpl@1524126153 from jdk.internal.loader.ClassLoaders$AppClassLoader@205029188] The log adapter 'org.apache.commons.logging.impl.Log4JLogger' is missing dependencies when loaded via classloader jdk.internal.loader.ClassLoaders$AppClassLoader@205029188: org/apache/log4j/Priority
[LogFactoryImpl@1524126153 from jdk.internal.loader.ClassLoaders$AppClassLoader@205029188] Attempting to instantiate 'org.apache.commons.logging.impl.Jdk14Logger'使用下面的Common-logging.properties基本配置文件运行任何PDFBox应用程序jar文件时,我能够控制日志记录的级别
@echo off
set diag=-Dorg.apache.commons.logging.diagnostics.dest=STDOUT
set properties=-Djava.util.logging.config.file=C:\Users\tata\Documents\PDFBox\commons-logging.properties
set logger=-Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
set xml=-Dlog4j.configurationFile=C:\Users\tata\Documents\PDFBox\log4j2.xml
del merge.pdf
set vmargs=%diag% %properties%
echo "########## java %vmargs% -jar pdfbox-app-2.0.26.jar PDFMerger pdf1.pdf pdf2.pdf merge.pdf"
java %vmargs% -jar pdfbox-app-2.0.26.jar PDFMerger pdf1.pdf pdf2.pdf merge.pdf
del merge.pdf
set vmargs=%diag% %properties%
echo "######### java %vmargs% -jar pdfbox-app-3.0.0-alpha3.jar merge -o merge.pdf -i pdf1.pdf -i pdf2.pdf"
java %vmargs% -jar pdfbox-app-3.0.0-alpha3.jar merge -o merge.pdf -i pdf1.pdf -i pdf2.pdf
del merge.pdf
set vmargs=%diag% %properties%
echo "######### java %vmargs% -jar pdfbox-app-3.0.0-alpha3.jar merge -o merge.pdf -i pdf1.pdf -i pdf2.pdf"
java %vmargs% -jar pdfbox-app-3.0.0-alpha3.jar merge -o merge.pdf -i pdf1.pdf -i pdf2.pdfCommon-logging.properties配置文件的内容:
#
# https://cyntech.wordpress.com/2009/01/09/how-to-use-commons-logging/
# commons-logging.properties
#The commons logging log levels correspond to the java.util.logging.Level levels like this:
#fatal = Level.SEVERE
#error = Level.SEVERE
#warn = Level.WARNING
#info = Level.INFO
#debug = Level.FINE
#trace = Level.FINEST
# So, if you want to set your class to log all debugs, you use LEVEL.FINE.
# These are also in order of priority, so, like in our example,
# if you set your class logger to FINE, then trace log messages will not be recorded.
# jdk handlers
# disable all logging
#handlers=
# enable file logging
#handlers=java.util.logging.FileHandler
# enable file and console logging
#handlers=java.util.logging.FileHandler, java.util.logging.ConsoleHandler
# default log level
.level=INFO
# Specific logger level
#PDFMergerUtility.level=SEVERE
# FileHandler level can be set to override the global level:
java.util.logging.FileHandler.level=SEVERE
# ConsoleHandler level can be set to override the global level:
java.util.logging.ConsoleHandler.level=INFO
# log file name for the File Handler
java.util.logging.FileHandler.pattern=javalog%u.log
# Specify the style of output (simple or xml)
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
# Optional - Limit the size of the file (in bytes)
#java.util.logging.FileHandler.limit=50000
# Optional - The number of files to cycle through, by
# appending an integer to the base file name:
java.util.logging.FileHandler.count=1对Log4JLogger的显式请求
我确实试图显式地请求Log4JLogger,但是它没有工作,PDFBox jar生成了异常。
java -Dorg.apache.commons.logging.diagnostics.dest=STDOUT -Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger -Dlog4j.configurationFile=file:C:\Users\tata\Documents\PDFBox\log4j2.xml -jar pdfbox-app-2.0.26.jar PDFMerger pdf1.pdf pdf2.pdf merge.pdf
[LogFactoryImpl@1480010240 from jdk.internal.loader.ClassLoaders$AppClassLoader@205029188] Attempting to load user-specified log class 'org.apache.commons.logging.impl.Log4JLogger'...
[LogFactoryImpl@1480010240 from jdk.internal.loader.ClassLoaders$AppClassLoader@205029188] Attempting to instantiate 'org.apache.commons.logging.impl.Log4JLogger'
[LogFactoryImpl@1480010240 from jdk.internal.loader.ClassLoaders$AppClassLoader@205029188] Trying to load 'org.apache.commons.logging.impl.Log4JLogger' from classloader jdk.internal.loader.ClassLoaders$AppClassLoader@205029188
[LogFactoryImpl@1480010240 from jdk.internal.loader.ClassLoaders$AppClassLoader@205029188] Class 'org.apache.commons.logging.impl.Log4JLogger' was found at 'jar:file:/C:/Users/tata/Documents/PDFBox/pdfbox-app-2.0.26.jar!/org/apache/commons/logging/impl/Log4JLogger.class'
[LogFactoryImpl@1480010240 from jdk.internal.loader.ClassLoaders$AppClassLoader@205029188] The log adapter 'org.apache.commons.logging.impl.Log4JLogger' is missing dependencies when loaded via classloader jdk.internal.loader.ClassLoaders$AppClassLoader@205029188: org/apache/log4j/Priority
Exception in thread "main" java.lang.ExceptionInInitializerError
at org.apache.pdfbox.tools.PDFMerger.merge(PDFMerger.java:61)
at org.apache.pdfbox.tools.PDFMerger.main(PDFMerger.java:49)
at org.apache.pdfbox.tools.PDFBox.main(PDFBox.java:81)
Caused by: org.apache.commons.logging.LogConfigurationException: User-specified log class 'org.apache.commons.logging.impl.Log4JLogger' cannot be found or is not useable.
at org.apache.commons.logging.impl.LogFactoryImpl.discoverLogImplementation(LogFactoryImpl.java:804)
at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:541)
at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:292)
at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:269)
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:655)
at org.apache.pdfbox.multipdf.PDFMergerUtility.<clinit>(PDFMergerUtility.java:90)
... 3 more将log4j的1.2.17添加到PDFBox项目中
我注意到C:\Users\tata.m2\repository\log4j\log4j\1.2.12目录中没有jar文件。因此,我试图安装最新的1.2.17版本。将下面的内容添加到F:\PDFBox2\pdfbox\tools\pom.xml中并重新构建了PDFBox。Maven安装了jar文件C:\Users\tata.m2\repository\log4j\log4j\1.2.17,但这并没有解决Log4JLogger的问题。不确定我是否正确地更新了PDFBox项目。
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>在这一点上,我不知道为什么我对Log4JLogger有问题,我做错了什么,以及如何解决这个问题。
发布于 2022-05-28 22:27:56
在https://stackoverflow.com/users/535646/tilman-hausherr的帮助下,我能够澄清我发布的问题。正式的PDFBox支持log4j,但是版本1不再受支持。官方PDFBox无法实例化Log4jLogger并实例化标准java记录器Jdk14Logger。对于典型的用法,Jdk14Logger工作得很好,而且似乎很容易配置。PDFBox用户需要意识到这一点,并创建和自定义Common-logging.properties文件来控制日志记录。参见我在提问后提供的例子。
对于开发人员和高级用户来说,正确的解决方案是将PDFBox升级到log4j版本2,我按照https://stackoverflow.com/users/535646/tilman-hausherr的建议更新了PDFBox /PDFBox/头for,并重新构建了PDFBox。现在,我可以通过提供如下所示的定制log4j2.xml文件来配置日志记录。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
<File name="FileAllLogs" fileName="logs/MyProj_all.txt" immediateFlush="true" append="true">
<PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
<!-- log level precedence ALL -> TRACE -> DEBUG -> INFO -> WARN -> ERROR -> FATAL -> OFF -->
<!-- if you set level to WARN , all messages with the level on the right site will be logged -->
<Loggers>
<Root level="error">
<AppenderRef ref="Console" />
</Root>
<!-- set different level for file logger -->
<Logger name="org.apache.pdfbox" level="warn" additivity="false">
<AppenderRef ref="FileAllLogs"/>
</Logger>
</Loggers>
</Configuration>log4j2的基本配置似乎比Jdk14Logger要复杂一些。
https://stackoverflow.com/questions/72387308
复制相似问题