Reputation: 13509
I have two log4j loggers in each of my classes in my code :
logA = Logger.getLogger(com.some.class.in.my.project);
logB = Logger.getLogger('perf');
I want these two loggers to output data into two COMPLETELY different files. I can't seem to get it to work.
Here are my log4j properties :
log4j.rootLogger = myAppenderA
# A
log4j.appender.myAppenderA=org.apache.log4j.RollingFileAppender
log4j.appender.myAppenderA.File=../logs/mylogfileA.log
log4j.appender.myAppenderA.additivity=false
log4j.appender.myAppenderA.Threshold=DEBUG
log4j.appender.myAppenderA.layout=org.apache.log4j.PatternLayout
log4j.appender.myAppenderA.layout.ConversionPattern=%d{ISO8601} %-5p 0 %m%n
# perf
log4j.appender.perf=org.apache.log4j.RollingFileAppender
log4j.appender.perf.File=..logs/perf.log
log4j.appender.perf.additivity=false
log4j.appender.perf.Threshold=DEBUG
log4j.appender.perf.layout=org.apache.log4j.PatternLayout
log4j.appender.perf.layout.ConversionPattern=%d{ISO8601} %-5p 0 %m%n
log4j.logger.myAppenderB = perf
Both myLogfileA.log and perf.log contain the same data. Supposedly setting additivity to false fixes this, but i have tried it and it has little affect.
Upvotes: 1
Views: 386
Reputation: 3580
Additivity is a property of the logger not the appender so you have to remove additivity
property from appender and add it to your loggers configuration.
Currently you have only the rootLogger configuration in the file (and you are not defining the logging level for it) so all your loggers will extend the appenders from it. To stop logging messages propagation to ancestors you have to use the additivity property on the logger. So to achieve what you want you have:
root
) for rootLogger
. It will be the default one and inherited by other loggers which don't have additivity = false
myAppenderA
appender to mypackage.MyClass
loggerpref
appender to pref
loggeradditivity
of myAppenderA
and pref
loggers to false
to stop log message propagation to ancestor loggers.There is the hole properties file:
log4j.rootLogger = DEBUG, root
# Root
log4j.appender.root=org.apache.log4j.RollingFileAppender
log4j.appender.root.File=logs/mainLogInheritable.log
log4j.appender.root.Threshold=DEBUG
log4j.appender.root.layout=org.apache.log4j.PatternLayout
log4j.appender.root.layout.ConversionPattern=%d{ISO8601} %-5p 0 %m%n
# A
log4j.appender.myAppenderA=org.apache.log4j.RollingFileAppender
log4j.appender.myAppenderA.File=logs/mylogfileA.log
#log4j.appender.myAppenderA.additivity=false
log4j.appender.myAppenderA.Threshold=DEBUG
log4j.appender.myAppenderA.layout=org.apache.log4j.PatternLayout
log4j.appender.myAppenderA.layout.ConversionPattern=%d{ISO8601} %-5p 0 %m%n
# perf
log4j.appender.perf=org.apache.log4j.RollingFileAppender
log4j.appender.perf.File=logs/perf.log
#log4j.appender.perf.additivity=false
log4j.appender.perf.Threshold=DEBUG
log4j.appender.perf.layout=org.apache.log4j.PatternLayout
log4j.appender.perf.layout.ConversionPattern=%d{ISO8601} %-5p 0 %m%n
log4j.logger.mypackage.MyClass = DEBUG, myAppenderA
log4j.logger.perf = DEBUG, perf
log4j.additivity.perf = false
log4j.additivity.mypackage.MyClass = false
To test if it is logging to three different files you can try this:
Logger.getLogger("mypackage.MyClass").debug("1111");
Logger.getLogger("perf").debug("2222");
Logger.getLogger("anyName").debug("3333");
Upvotes: 2