我在日志中发现了这个异常:
log4j:ERROR转换日期时出错。 显示java.lang.NullPointerException 在java.lang.System.arraycopy(本机方法) at java.lang.AbstractStringBuilder.getChars(AbstractStringBuilder.java:328) 在java.lang.StringBuffer.getChars(StringBuffer.java:201) 在org.apache.log4j.helpers.ISO8601DateFormat.format(ISO8601DateFormat.java:130) at java.text.DateFormat.format(DateFormat.java:316) 在org.apache.log4j.helpers.PatternParser $ DatePatternConverter.convert(PatternParser.java:443) 在org.apache.log4j.helpers.PatternConverter.format(PatternConverter.java:65) 在org.apache.log4j.PatternLayout.format(PatternLayout.java:506) 在org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:310) 在org.apache.log4j.WriterAppender.append(WriterAppender.java:162) 在org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251) 在org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66) 在org.apache.log4j.Category.callAppenders(Category.java:206) 在org.apache.log4j.Category.forcedLog(Category.java:391) 在org.apache.log4j.Category.info(Category.java:666) at org.obliquid.db.ConnectionManager.releaseConnection(ConnectionManager.java:313) at org.obliquid.db.ConnectionManager.finalize(ConnectionManager.java:331) at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method) 在java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83) at java.lang.ref.Finalizer.access $ 100(Finalizer.java:14) 在java.lang.ref.Finalizer $ FinalizerThread.run(Finalizer.java:160)
我认为这可能是由我的log4j.properties文件引起的,特别是由ConversionPattern引起的。有关如何修复的想法吗?
#Updated at Wed Sep 14 21:57:51 CEST 2011
#Wed Sep 14 21:57:51 CEST 2011
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.rootLogger=INFO, stdout
log4j.appender.R.File=yamweb.log
log4j.appender.R.MaxFileSize=1000KB
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.logger.yamweb=DEBUG
log4j.logger.org.springframework=INFO
log4j.logger.org.springframework.beans=DEBUG
log4j.logger.com.amazonaws=WARN
更新:实际上,查看PatternLayout JavaDoc,我甚至没有提及日期格式。
d 用于输出日志记录事件的日期。日期转换说明符后面可能跟在大括号之间的日期格式说明符。例如,%d {HH:mm:ss,SSS}或%d {dd MMM yyyy HH:mm:ss,SSS}。如果没有给出日期格式说明符,则假定为ISO8601格式。
我添加了一个明确的转换模式:%d{yyyy-MM-dd HH:mm:ss} [%t] %p %c - %m%n
- 查看日志,如果有帮助,我会通知您。
更新2 :问题不再发生了。
答案 0 :(得分:4)
这似乎是一种非常罕见的情况。谷歌搜索错误发现了2006年的以下讨论,与课程卸载有关:
http://comments.gmane.org/gmane.comp.jakarta.log4j.user/13835
我确实看过有问题的代码。如果lastTimeString以某种方式 没有在课程重新加载时初始化,那么可能会有一个NPE 调用getChars()。但是,没有VM或者一些故障 class reloading hack,我看不到lastTimeString如何为null。
编辑:请参阅上面的问题寻找解决方案:
我添加了一个明确的转换模式:%d {yyyy-MM-dd HH:mm:ss} [%t]%p%c - %m%n
这似乎也适用于以下问题:NPE with Perf4j and Log4j。
答案 1 :(得分:0)
我偶然发现了这个异常,它是通过从portlet(或servlet,无论如何)文件夹中删除log4j.jar
来解决的。
答案 2 :(得分:0)
我知道这是一个旧线程,但我通过重新启动服务器解决了这个问题。是的,陈词滥调,但值得一试