Pregunta

I have 2 Java classes inside the same package. I want to log messages from these 2 classes into 2 different log files.

The log messages should not be repeated in any of these two files.

I am using the following log4j.properties file:

# Set root category priority to DEBUG and its appender to CONSOLE and LOGFILE_ENGINE.
log4j.rootCategory=DEBUG, LOGFILE_ENGINE, SYNC_HANDLER


log4j.additivity.LOGFILE_ENGINE = false
log4j.additivity.SYNC_HANDLER = false


log4j.category.org.jboss=ERROR
log4j.category.org.apache.axis=ERROR
log4j.category.org.springframework=ERROR
log4j.category.org.hibernate=ERROR
log4j.category.org.jgroups=ERROR
log4j.category.org.apache.catalina.loader.WebappClassLoader=OFF
log4j.logger.net.sourceforge.stripes=ERROR
log4j.logger.net.sf.ehcache=ERROR
log4j.additivity.org.jboss.cache=false
log4j.logger.org.quartz=ERROR

# LOGFILE_ENGINE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE_ENGINE=org.apache.log4j.RollingFileAppender
log4j.appender.LOGFILE_ENGINE.File=${catalina.home}/logs/file1.log
log4j.appender.LOGFILE_ENGINE.Append=true
log4j.appender.LOGFILE_ENGINE.maxBackupIndex=5
log4j.appender.LOGFILE_ENGINE.maxFileSize=10MB
log4j.appender.LOGFILE_ENGINE.Threshold=INFO
log4j.appender.LOGFILE_ENGINE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE_ENGINE.layout.ConversionPattern=%d{MMM dd, yyyy hh:mm:ss.SSS a} %-5p %c - %m%n


log4j.appender.SYNC_HANDLER=org.apache.log4j.RollingFileAppender
log4j.appender.SYNC_HANDLER.File=${catalina.home}/logs/file2.log
log4j.appender.SYNC_HANDLER.Append=true
log4j.appender.SYNC_HANDLER.maxBackupIndex=5
log4j.appender.SYNC_HANDLER.maxFileSize=10MB
log4j.appender.SYNC_HANDLER.Threshold=DISASTER#PackageName.className
log4j.appender.SYNC_HANDLER.layout=org.apache.log4j.PatternLayout
log4j.appender.SYNC_HANDLER.layout.ConversionPattern=%d{MMM dd, yyyy hh:mm:ss.SSS a} %-5p %c - %m%n

DISASTER#PackageName.className is custom level I have made by extending the Level class of the org.apache.log4j

My PROBLEM 1. log messages from file2.log are getting repeated into the file1.log file.

2. Is It possible to do class based logging through log4j.

No need to mention that I am naive in regard to Log4j....

¿Fue útil?

Solución 2

I found a solution to my problem.
I created a custom log level for my class for which I want separate logs.
I tried the following log4j configuration:

log4j.rootCategory=DEBUG, LOGFILE_ENGINE

log4j.category.packageName.className = DEBUG, packageName.className.syncLogger
log4j.additivity.packageName.className= false

log4j.appender.LOGFILE_ENGINE=org.apache.log4j.RollingFileAppender
log4j.appender.LOGFILE_ENGINE.File=${catalina.home}/logs/file1.log
.....................

log4j.appender.packageName.className.syncLogger=org.apache.log4j.RollingFileAppender
log4j.appender.packageName.className.syncLogger.File=${catalina.home}/logs/file2.log
log4j.appender.packageName.className.syncLogger.Threshold=DISASTER#packageName.SyncLogLevel
.....................

And, I created the logger reference as follows:

private static final String FQCN = className.class.getName();
private static final String SYNC_LOGGER_NAME = FQCN + ".syncLogger";
public static customLoggingClassName syncLogger = Logger.getLogger(SYNC_LOGGER_NAME);

Below is the Custom Level Class(SyncLogLevel) for creating a custom Level (DISASTER):

public class SyncLogLevel extends Level{

    private static final long serialVersionUID = 1L;

    public SyncLogLevel(int level, String levelStr, int syslogEquivalent) {
        super(level, levelStr, syslogEquivalent);
    }
    public static SyncLogLevel toLevel(int val, Level defaultLevel) {
        return DISASTER;
    }

    public static SyncLogLevel toLevel(String sArg, Level defaultLevel) {
        return DISASTER;
    }
    public static final SyncLogLevel DISASTER = new SyncLogLevel(60000, "DISASTER", 0);

}

After this you have to do your logging in the desired class as follows:

syncLogger.log(SyncLogLevel.DISASTER, "Log Message");

At the end all the log messages called from syncLogger with the log level "DISASTER" will go to a separate file(file2.log)

After doing all this, All my logs go into desired files separately.

Otros consejos

What you're looking for is something like:

log4j.rootLogger=DEBUG, file1, file2

log4j.appender.file1=org.apache.log4j.RollingFileAppender
...

log4j.appender.file2=org.apache.log4j.RollingFileAppender
...

log4j.logger.my.package.MyClassA=DEBUG, file1
log4j.additivity.my.package.MyClassA=false

log4j.logger.my.package.MyClassB=DEBUG, file2
log4j.additivity.my.package.MyClassB=false

Which means that you can use the class name in the logger. Hope this helps!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top