0
votes

I'm using 2 appenders :

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

log4j.appender.MapRDB=com.A.B.maprdblogger.Appender

stdout writes in console. MapRDB in MapRDB. It's a custom appender.

My application is on this package : com.A.B

For my log, I need :

  • error from all application in stdout
  • warn from com.A package in MapRDB
  • info from com.A.B package in stdout

So I write :

log4j.rootLogger=ERROR, stdout
log4j.logger.com.A=WARN, MapRDB
log4j.logger.com.A.B=INFO, stdout
log4j.additivity.com.A=false

With this conf, my console log are good but nothing is written in MapRDB.

Without additivity false, I have double log in console and info log in MapRDB. I tried a lot of combinaison, but nothing doed what I need...

I think I haven't understand how to use log4j, any body has the solution ?

1

1 Answers

0
votes

The solution :

# root logger option
log4j.rootLogger=WARN, stdout

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# Log sent to MapRDB
log4j.appender.MapRDB=com.ingenico.datalake.maprdblogger.Appender
log4j.appender.MapRDB.Threshold=WARN
log4j.logger.com.ingenico=INFO
log4j.logger.com.ingenico.datalake=INFO, MapRDB

thanks to this answer : https://stackoverflow.com/a/23877814/8357778 which allows me to understand how log4j works. I needed to define the threshold for MapRDB appender at the good level. It permits me to set MapRDB as the appender for an info level, but just keep warn and above.