log4j:ERROR转换日期时发生错误

sti*_*vlo 6 java log4j

我在日志中发现了这个异常:

log4j:ERROR转换日期时发生错误.java.lang.System.arraycopy(Native Method)的java.lang.NullPointerException,位于org的java.lang.StringBuffer.getChars(StringBuffer.java:201)的java.lang.AbstractStringBuilder.getChars(AbstractStringBuilder.java:328). apache.log4j.helpers.ISO8601DateFormat.format(ISO8601DateFormat.java:130)at java.text.DateFormat.format(DateFormat.java:316)at org.apache.log4j.helpers.PatternParser $ DatePatternConverter.convert(PatternParser.java: 443)org.apache.log4j.helpers.PatternConverter.format(PatternConverter.java:65)atg.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)atg.apache.log4j.helpers.AppenderAttachableImpl. appendLoopOnAppenders(AppenderAttachableImpl.java:66)org.apache.log4j.Category.callAppenders(Category.java:206)atg.apache.log4j.Category.forcedLog(Cat)egory.java:391)org.apache.log.Category.info(Category.java:666)org.obliquid.db.ConnectionManager.releaseConnection(ConnectionManager.java:313)org.obliquid.db.ConnectionManager.finalize上的org.apache.log4j.Category.info(Category.java:666) (ConnectionManager.java:331)位于java.lang.ref.Finalizer.run上的java.lang.ref.Finalizer.run中的java.lang.ref.Finalizer.invokeFinalizeMethod(本地方法)(Finalizer.java:83)$ 100( Finalizer.java:14)at 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
Run Code Online (Sandbox Code Playgroud)

更新:实际上,看看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:问题不再发生了.

JBe*_*ert 4

看来这是一种非常罕见的情况。谷歌搜索错误出现了以下 2006 年的讨论,与类卸载有关:
http://comments.gmane.org/gmane.comp.jakarta.log4j.user/13835

我确实查看了有问题的代码。如果 lastTimeString 在类重新加载时未以某种方式初始化,则 调用 getChars() 时
可能会出现 NPE 。
然而,如果没有虚拟机中的一些故障或
类重新加载黑客,我不明白lastTimeString怎么可能为空。

编辑:请参阅上面的问题以获取解决方案:

我添加了显式转换模式: %d{yyyy-MM-dd HH:mm:ss} [%t] %p %c - %m%n

这似乎也适用于以下问题:NPE with Perf4j and Log4j