Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Different Logger in the same class using Log4J

Tags:

java

log4j

I want specific messages generated from within the same class to be logged separately. So, how can I create 2 different types of loggers within the same class. Currently, the Properties file looks like

log4j.rootCategory=DEBUG, O

# Stdout
log4j.appender.O=org.apache.log4j.ConsoleAppender
log4j.appender.O.layout=org.apache.log4j.PatternLayout
log4j.appender.O.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x - %C.%M(%F:%L) - %m%n

# File
log4j.appender.MESSAGE=org.apache.log4j.RollingFileAppender
log4j.appender.MESSAGE.File=target/logs/messages.log
# Control the maximum log file size
log4j.appender.MESSAGE.MaxFileSize=1000KB
# Archive log files (one backup file here)
log4j.appender.MESSAGE.MaxBackupIndex=100
log4j.appender.MESSAGE.layout=org.apache.log4j.PatternLayout
log4j.appender.MESSAGE.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x - %C.%M           (%        F:%    L) - %m%n
log4j.appender.MESSAGE.

log4j.category.failedMessagesLog=INFO, MESSAGE

I'm using the logging in my code as: – /** Logger. */

Logger logger = Logger.getLogger(MyClass.class);
Logger msgLogger = Logger.getLogger("MESSAGE");

Upon testing, I get an empty log file (messages.log) created. Any suggestions??

like image 338
Global Dictator Avatar asked Nov 22 '10 16:11

Global Dictator


People also ask

Is Logger part of log4j?

Common Log4J usage is to get an instance of the Logger interface from the LogManager and call the methods on this interface. However, the custom log Levels are not known in advance, so Log4J cannot provide an interface with convenience methods for these custom log Levels.

What is the alternative to log4j?

SLF4J, Logback, Logstash, Loki, and Castle Core are the most popular alternatives and competitors to Log4j.

Is log4j and Apache log4j different?

It is part of the Apache Logging Services, a project of the Apache Software Foundation. Log4j is one of several Java logging frameworks.


2 Answers

Create two loggers with different names. You can configure them on a per name basis. A simple way to do this is to add a suffix to you class name. e.g.

Log log1 = LogFactory.getLog(getClass().getName()+".log1");
Log log2 = LogFactory.getLog(getClass().getName()+".log2");

in your properties file.

log4j.category.mypackage.myclass.log1=INFO, MESSAGE1
log4j.category.mypackage.myclass.log2=INFO, MESSAGE2
like image 164
Peter Lawrey Avatar answered Oct 05 '22 08:10

Peter Lawrey


log4j.rootCategory=DEBUG, O

log4j.appender.O=org.apache.log4j.ConsoleAppender
log4j.appender.O.layout=org.apache.log4j.PatternLayout
log4j.appender.O.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x - %C.%M(%F:%L) - %m%n

log4j.appender.MESSAGE=org.apache.log4j.RollingFileAppender
log4j.appender.MESSAGE.File=target/logs/messages.log
log4j.appender.MESSAGE.MaxFileSize=1000KB
log4j.appender.MESSAGE.MaxBackupIndex=100
log4j.appender.MESSAGE.layout=org.apache.log4j.PatternLayout
log4j.appender.MESSAGE.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x - %C.%M


log4j.appender.**MESSAGE2**=org.apache.log4j.RollingFileAppender
log4j.appender.**MESSAGE2**.File=target/logs/**messages2**.log
log4j.appender.**MESSAGE2**.MaxFileSize=1000KB
log4j.appender.**MESSAGE2**.MaxBackupIndex=100
log4j.appender.**MESSAGE2**.layout=org.apache.log4j.PatternLayout
log4j.appender.**MESSAGE2**.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x - %C.%M    

log4j.category.failedMessagesLog=INFO, MESSAGE , **MESSAGE2**

"failedMessagesLog" is the java file to which appender (INFO,MESSAGE, MESSAGE1) is applied. I have just reused existing RollingFileAppender. you can use any other appender ( like fileAppender).

You should use the right Class name Logger logger = Logger.getLogger(MyClass.class) should be changed to private static final Logger log = Logger.getLogger( **failedMessagesLog.class** );

Make sure you are using log4j's logging ie

import **org.apache.log4j.Logger**;
like image 36
tejaspillai Avatar answered Oct 05 '22 08:10

tejaspillai