我知道以前曾多次被问过,我认为我知道答案,但我似乎仍然没有完美的解决方案。
我正在尝试使用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个日志文件。只有适当的一个填充了程序的日志消息,但仍会为另一个创建一个0长度的日志文件。这显然不是我想要的。
任何人都可以告诉我我做错了什么吗?
答案 0 :(得分:1)
您的问题似乎与log4j
实例化日志文件的方式有关,而不是与实际的" 多个应用程序 - 多个日志文件"部分。因此,如果我理解正确,那么您真正想要实现的是设计一个文件追加器定义,该定义指示以更加懒惰的方式创建日志文件(而不是默认,即即时形成)。据我所知,后者只是log4j
的工作方式,并没有快速简便的方法。
编辑:有关更详细的讨论,请参阅对this SO question的回复。可能解决您的问题。
另一个快速解决方法是将您的log4j.properties
文件切割成多个子程序特定的部分,但根据约束条件,这可能会变得不是最理想的。您的申请所采用的要求。 (再次,请参阅this SO question以获取有关该特定解决方案的更多信息)。