Java 使用log4j为每个应用程序创建单独的日志文件

Java 使用log4j为每个应用程序创建单独的日志文件,java,logging,log4j,log4j2,Java,Logging,Log4j,Log4j2,我知道以前有人问过很多次,我以为我知道答案,但我似乎仍然没有完美的解决方案 我正在尝试使用log4j将不同的程序记录到不同的文件。这些程序不一定在不同的包中,但有些是。我有以下设置: # Set root logger level to DEBUG and its only appender to A1. log4j.rootLogger=ERROR, A1 # A1 is set to be a ConsoleAppender. log4j.appender.A1=org.apache.lo

我知道以前有人问过很多次,我以为我知道答案,但我似乎仍然没有完美的解决方案

我正在尝试使用log4j将不同的程序记录到不同的文件。这些程序不一定在不同的包中,但有些是。我有以下设置:

# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=ERROR, A1

# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p (%F:%L) - %m%n

# Log to a file for the ProgA 
log4j.logger.com.foo.apps.research.ProgA=INFO, ProgALog
log4j.additivity.com.foo.apps.research.ProgA=false
log4j.appender.ProgALog=org.apache.log4j.FileAppender
log4j.appender.ProgALog.File=/tmp/ProgA.log
log4j.appender.ProgALog.ImmediateFlush=true
log4j.appender.ProgALog.Threshold=info
log4j.appender.ProgALog.Append=false
log4j.appender.ProgALog.layout=org.apache.log4j.PatternLayout
log4j.appender.ProgALog.layout.ConversionPattern=%d [%t] %-5p (%F:%L) - %m%n


# Log to a file for the ProgB program
log4j.logger.com.foo.apps.research.ProgB=INFO, ProgBLog
log4j.additivity.com.foo.apps.research.ProgB=false
log4j.appender.ProgBLog=org.apache.log4j.FileAppender
log4j.appender.ProgBLog.File=/tmp/ProgB.log
log4j.appender.ProgBLog.ImmediateFlush=true
log4j.appender.ProgBLog.Threshold=info
log4j.appender.ProgBLog.Append=false
log4j.appender.ProgBLog.layout=org.apache.log4j.PatternLayout
log4j.appender.ProgBLog.layout.ConversionPattern=%d [%t] %-5p (%F:%L) - %m%n

# Log to a file for the ProgC program
log4j.logger.com.foo.apps.blah.ProgC=INFO, ProgCLog
log4j.additivity.com.foo.apps.blah.ProgC=false
log4j.appender.ProgCLog=org.apache.log4j.FileAppender
log4j.appender.ProgCLog.File=/tmp/ProgC.log
log4j.appender.ProgCLog.ImmediateFlush=true
log4j.appender.ProgCLog.Threshold=info
log4j.appender.ProgCLog.Append=false
log4j.appender.ProgCLog.layout=org.apache.log4j.PatternLayout
log4j.appender.ProgCLog.layout.ConversionPattern=%d [%t] %-5p (%F:%L) - %m%n
问题是,每次我运行这3个程序中的任何一个,都会创建所有3个日志文件。只有适当的一个会被程序的日志消息填充,但是仍然会为其他2个创建一个0长度的日志文件。这显然不是我想要的


有人能告诉我我做错了什么吗?

你的问题似乎更多地与
log4j
如何实例化日志文件有关,而不是与实际的“多应用程序多日志文件”部分有关。因此,如果我理解正确的话,那么您真正想要实现的是设计一个文件附加器定义,它以一种更懒惰的方式(与默认方式相反,即即时形成)指示日志文件的创建。不过,据我所知,后者正是
log4j
的工作原理,没有快速简便的解决方法

编辑:有关问题的更详细讨论和可能的解决方案,请参阅对的答复

另一个快速修复方法是将
log4j.properties
文件切碎为多个特定于子程序的部分,但根据应用程序所采用的约束和要求,这可能是次优的。(同样,有关该特定解决方案的更多信息,请参阅)