Java log4j:在文件中写入logs语句时出错

Java log4j:在文件中写入logs语句时出错,java,log4j,Java,Log4j,我创建了一个名为Project1的java项目。对于这个项目,我创建了一个log4j.properties文件。为了在日志文件中写入日志语句,我使用了DailyRollingFileAppender。我正在使用log4j-1.2.16.jar。日志文件为: log4j.logger.com.gridsense.server.automode=DEBUG, stdout,Rollfile log4j.rootLogger=off log4j.logger.com.gridsense.server.

我创建了一个名为Project1的java项目。对于这个项目,我创建了一个log4j.properties文件。为了在日志文件中写入日志语句,我使用了DailyRollingFileAppender。我正在使用log4j-1.2.16.jar。日志文件为:

log4j.logger.com.gridsense.server.automode=DEBUG, stdout,Rollfile
log4j.rootLogger=off
log4j.logger.com.gridsense.server.automode=debug,Rollfile,stdout

log4j.appender.Rollfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.Rollfile.ImmediateFlush=false
log4j.appender.Rollfile.Append=true
log4j.appender.Rollfile.Threshold=DEBUG
log4j.appender.Rollfile.bufferedIO = true
log4j.appender.Rollfile.File=D:/logs/AutoGS.log
log4j.appender.Rollfile.layout=org.apache.log4j.PatternLayout
log4j.appender.Rollfile.layout.ConversionPattern=[%t] %-5p %c %d{dd/MM/yyyy HH:mm:ss}     %m%n

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Threshold=DEBUG
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-4r [%t] %-5p %c %x  %m%n
当我运行项目时,我得到以下错误

log4j:ERROR Could not close org.apache.log4j.helpers.QuietWriter@1105348
java.io.IOException: The handle is invalid
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:282)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:202)
at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:263)
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:106)
at java.io.OutputStreamWriter.write(OutputStreamWriter.java:190)
at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:111)
at java.io.BufferedWriter.close(BufferedWriter.java:246)
at java.io.FilterWriter.close(FilterWriter.java:87)
at org.apache.log4j.FileAppender.closeFile(FileAppender.java:185)
at org.apache.log4j.FileAppender.reset(FileAppender.java:343)
at org.apache.log4j.WriterAppender.close(WriterAppender.java:207)
at org.apache.log4j.AppenderSkeleton.finalize(AppenderSkeleton.java:144)
at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83)
at java.lang.ref.Finalizer.access$100(Finalizer.java:14)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160)
    log4j:ERROR Failed to write [[DefaultQuartzScheduler_Worker-2] DEBUG   com.gridsense.server.automode.backgroundWorker.TimerTaskToBeFired 03/05/2013 17:34:45 ? TimerTaskToBeFired.execute - firing timer job with Key [DropBoxFileFetchingSchedulerGroup.JobDetail-ID-1]].

我不明白问题出在哪里。

我对stacktrace的理解是,某个FileAppender对象泄漏了,appender的
finalize
方法正在尝试清理它。但这似乎失败了,因为相关资源已经关闭

这是最简单的部分。最困难的部分是确定泄漏源。我想是这是由这条线引起的:

    log4j.logger.com.gridsense.server.automode=debug,Rollfile,stdout

它似乎正在配置第二个记录器树,与前面几行中配置的日志树重复。

我修改了代码并删除了第二条语句log4j.logger.com.gridsense.server.automode=debug、Rollfile、stdout,但仍然收到相同的错误。