这是跟进我的帖子
”以及调查PDFBox合并命令行工具和登录器的问题。
我将在我的帖子中参考以下JAR文件:
pdfbox-app-2.0.26.jar - 这是从pdfbox站点下载的官方jar文件
pdfbox-app-3.0.0.0-alpha3 。
使用文件配置通过PDFBox合并工具来控制日志记录级别的能力。特别是在以PDF格式的大量PDF电子邮件文件合并过程中,可以抑制PDFBox记录的大量警告的能力。在调查期间,由于缺乏Java技能,我面临许多挑战,被迫学习比我预期的更多,技能差距仍然很大 - :(
默认记录器案例
首先,我在启动期间启用了诊断。 下选择了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.pdf
为了发现哪个记录器,
$ 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
默认情况 app-2.0.26.jar,pdfbox-3.0.0.0-alpha3.jar和pdfbox-app-3.0.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'
。 配置文件运行任何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.pdf
使用下面的conson-loging.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
。
基本 但是它不起作用,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的v1.2.17添加到pdfbox project
我注意到,c:\ users \ tata.m2 \ repository \ log4j \ log4j \ log4j \ log4j \ log4j \ 1.2.12目录中没有JAR文件。因此,我尝试安装最新的V1.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有问题,我在做错了什么以及如何解决问题。
This is to follow up my post
PDFBox command line merge tool warnings
Here are my notes and questions from investigation into PDFBox merge command line tool and loggers.
I will refer to the following jar files in my post:
pdfbox-app-2.0.26.jar - this is official jar file downloaded from PDFBox site
pdfbox-app-3.0.0-alpha3.jar - this is official jar file downloaded from PDFBox site
pdfbox-app-3.0.0-SNAPSHOT.jar - jar file built locally from github source by me
My initial goal was to have ability to control level of logging by PDFBox merge tool using the file configuration. Specifically the ability to suppress large volume of WARNINGS logged by PDFBox during merge process of large number of PDF email files in PDF format. During the investigation I faced a number of challenges due my lack of Java skills and was forced to learn more than I anticipated, skills gap is still huge -:(
Default Logger Case
First, I enabled diagnostics during startup to discover which logger, Jdk14Logger or Log4JLogger, is being selected by default. I did run the following command file:
@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.pdf
The jar command reported the same set of loggers present, including Log4JLogger, in all pdfbox-app* jar files.
$ 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
However, pdfbox-app-2.0.26.jar, pdfbox-app-3.0.0-alpha3.jar and pdfbox-app-3.0.0-SNAPSHOT.jar all failed to select the Log4JLogger and selected the Jdk14Logger instead.
[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'
I am able to control the level of logging when running any of PDFBox app jar file using the below commons-logging.properties basic configuration file
@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.pdf
The content of commons-logging.properties configuration file:
#
# 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
Explicit Request for Log4JLogger
I did try to explicitly request Log4JLogger but it didn't work, PDFBox jar generated exceptions.
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
Adding v1.2.17 of log4j to PDFBox project
I noticed that that there no jar file in C:\Users\tata.m2\repository\log4j\log4j\1.2.12 directory. Therefore , I attempted to install the latest v1.2.17. Added the below to F:\PDFBox2\pdfbox\tools\pom.xml and rebuilt PDFBox. Maven installed jar files C:\Users\tata.m2\repository\log4j\log4j\1.2.17 but that didn't resolve the issue with Log4JLogger. Not sure I updated PDFBox project correctly.
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
At this point, I am not sure why I am having problem with Log4JLogger, what I am doing wrong and how I can resolve the issue.
发布评论
评论(1)
我能够在。官方PDFBox支持Log4J,但版本1不再支持。官方的PDFBox无法实例化log4jlogger,并实例化标准Java Logger JDK14Logger。对于典型的用法,JDK14Logger工作正常,并且似乎很容易配置。 PDFBox用户需要意识到这一点,并创建和自定义Commons-Loging.properties文件以控制日志记录。请参阅我在问题帖子中提供的示例。
开发人员和电源用户的适当解决方案是将PDFBOX升级到Log4J版本2。我更新了PDFBox/pdfbox/pom.xml.xml,如 https://stackoverflow.com/users/535646/tilman-hausherr 和重建PDFBox。现在,我能够通过提供以下自定义Log4j2.xml文件来配置日志记录。
Log4J2的基本配置似乎比JDK14Logger更棘手。
I was able to clarify questions I posted with the help from https://stackoverflow.com/users/535646/tilman-hausherr. Official PDFBox supports log4j but version 1 which is no longer supported. Official PDFBox fails to instantiate Log4jLogger and instantiate standard java logger Jdk14Logger instead. For typical usage, Jdk14Logger works just fine and it seems to be easy to configure. PDFBox Users need to be aware of that and create and customize commons-logging.properties file to control logging. See example I provided in my Questions post.
The proper solution for developers and power users is to upgrade PDFBox to log4j version 2. I updated pdfbox/pdfbox/pom.xml as suggested by https://stackoverflow.com/users/535646/tilman-hausherr and rebuilt PDFBox. Now I am able to configure logging by providing custom log4j2.xml file as below.
Basic configuration of log4j2 seems to be a bit more tricky than for Jdk14Logger.