Oliver Watkins
Oliver Watkins

Reputation: 13509

How do i stop my log files adding to each other?

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

Answers (1)

jonasnas
jonasnas

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:

  1. Define one more appender (root) for rootLogger. It will be the default one and inherited by other loggers which don't have additivity = false
  2. Assign myAppenderA appender to mypackage.MyClass logger
  3. Assign pref appender to pref logger
  4. Set additivity 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

Related Questions