4

I want to use a default logger as well as a specific logger that will log only the ones defined by me. I got the following by referring to another SO question.

Eg:

  1. log.log - include all logs
  2. foo.log - include logs defined by foo.info(..)

I have set the following properties

log4j.rootLogger = INFO, FOO, file

log4j.logger.FOO=DEBUG, FOO 
log4j.logger.file=DEBUG, file 

log4j.additivity.FOO=false 
log4j.additivity.file=false 

log4j.appender.FOO = org.apache.log4j.RollingFileAppender 
log4j.appender.FOO.layout = org.apache.log4j.PatternLayout
log4j.appender.FOO.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
log4j.appender.FOO.File = foo.log

log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=log.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

And my code includes the following:

private static final Logger foo = Logger.getLogger("FOO");

private static final Logger log = Logger.getLogger(App.class); //NOTE I can't change this

public static void main(String[] args) { 
    log.info("info");
    foo.info("fooo");
}

But this gives the opposite of what I want

log.log has only "info" while foo.log has both.

Note that I cannot change the default log instantiating code segment.

S.Dan
  • 1,826
  • 5
  • 28
  • 55

1 Answers1

2

Change your properties file like below. fileAppender will be added to both FOO logger and root logger to log all messages. FOOAppender will only be added to FOO logger to only log it's messages. Giving loggers and appenders different names, helps understanding log property files.

log4j.rootLogger = INFO,fileAppender
log4j.logger.FOO=DEBUG,FOOAppender,fileAppender
log4j.additivity.FOO=false 

log4j.appender.FOOAppender = org.apache.log4j.RollingFileAppender 
log4j.appender.FOOAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.FOOAppender.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
log4j.appender.FOOAppender.File = foo.log

log4j.appender.fileAppender=org.apache.log4j.FileAppender
log4j.appender.fileAppender.File=log.log
log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.fileAppender.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
miskender
  • 7,460
  • 1
  • 19
  • 23
  • 1
    The above worked, thanks. The logs does not have the class name (because logger was initiated as `getLogger("Foo")`). If I were to add the class name to the logs, do I need to explicitly pass it when logging or is there a way to add it in the properties file? – S.Dan Mar 07 '18 at 03:49
  • @SachiDangalla Probably you already know, %c parameter will take the name you are passing to the getLogger method. If you have to pass "Foo" text and still want to print current class name on the logs, the only way I know like you said passing it expilicty. – miskender Mar 07 '18 at 15:59