uthaman
uthaman

Reputation: 1

Logging based on levels on log4j in Java

Below is the log4j properties and the Java code. All the logs are getting logged only in Debug. I even tried with adding Threshold, no luck yet. I need to log the log statements in a separate file based on log levels.

All the logs are getting logged only in debug log file, and if I remove debug log, then it is getting logged in info log file.

Giving Threshold option also doesn't work.

log4j.rootLogger = OFF

#define the console appender
log4j.appender.consoleAppender = org.apache.log4j.ConsoleAppender
# now define the layout for the appender
log4j.appender.consoleAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

# now define the rollingFIle appender
log4j.category.com=error, myErrorappender
log4j.additivity.com=false
log4j.appender.myErrorappender=org.apache.log4j.RollingFileAppender
log4j.appender.myErrorappender.File=/Users/uthaman/Documents/workspace/Logging/myErrorlog.log
log4j.appender.myErrorappender.MaxFileSize=2MB
log4j.appender.myErrorappender.MaxBackupIndex=2
log4j.appender.myErrorappender.layout = org.apache.log4j.PatternLayout
log4j.appender.myErrorappender.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c (%F:%L) - %m%n


log4j.category.com=info,myInfoappender
log4j.additivity.com=false
log4j.appender.myInfoappender=org.apache.log4j.RollingFileAppender
log4j.appender.myInfoappender.File=/Users/user/Documents/workspace/Logging/myInfolog.log
log4j.appender.myInfoappender.MaxFileSize=2MB
log4j.appender.myInfoappender.MaxBackupIndex=2
log4j.appender.myInfoappender.layout = org.apache.log4j.PatternLayout
log4j.appender.myInfoappender.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c (%F:%L) - %m%n

log4j.category.com=debug,myDebugappender
log4j.additivity.com=false
log4j.appender.myDebugappender=org.apache.log4j.RollingFileAppender
log4j.appender.myDebugappender.File=/Users/user/Documents/workspace/Logging/myDebuglog.log
log4j.appender.myDebugappender.MaxFileSize=2MB
log4j.appender.myDebugappender.MaxBackupIndex=2
log4j.appender.myDebugappender.layout = org.apache.log4j.PatternLayout
log4j.appender.myDebugappender.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c (%F:%L) - %m%n

This is the java code where the log statements are logged:

public class Logging {

    private static Logger logger = Logger.getLogger(Logging.class);

    public static void main(String[] args) {
        logger.error("This is error");
        logger.info("This is info");
        logger.debug("This is debug");
    }

}

Upvotes: 0

Views: 3051

Answers (3)

Sam
Sam

Reputation: 1328

You can try using filter in your configuration file to specify a specific level to written written to the appender . Please the sample code attached

    <appender name="DEBUG" class="org.apache.log4j.ConsoleAppender">
            <layout class="org.apache.log4j.PatternLayout">
                    <param name="ConversionPattern" value="[%t] %-5p %c - %m%n" />
            </layout>
            <filter class="org.apache.log4j.varia.LevelRangeFilter">
                    <param name="levelMin" value="DEBUG" />
                    <param name="levelMax" value="DEBUG" />
            </filter>
    </appender>

Upvotes: 1

Jintian DENG
Jintian DENG

Reputation: 3202

Problem:

You have defined duplicate key in the log4j configuration:

    log4j.category.com=error, myErrorappender
    log4j.additivity.com=false

    log4j.category.com=info,myInfoappender
    log4j.additivity.com=false

    log4j.category.com=debug,myDebugappender
    log4j.additivity.com=false
  • Log4j only use the last one which is the debug appender ---> "All the logs are getting logged only in debug log file"
  • When you remove the debug appender, info appender will be the last one ---> " if I remove debug log, then it is getting logged in info log file."

Solution:

    log4j.category.com=debug,myDebugappender,myInfoappender,myErrorappender
    log4j.additivity.com=false
    log4j.appender.myDebugappender.Threshold=DEBUG
    log4j.appender.myInfoappender.Threshold=INFO
    log4j.appender.myErrorappender.Threshold=ERROR

If you must filter events by exact level match:

     log4j.appender.myDebugappender.filter=org.apache.log4j.varia.LevelMatchFilter
     log4j.appender.myDebugappender.filter.levelToMatch=DEBUG
     ...

Upvotes: 1

user219882
user219882

Reputation: 15834

I prefer using log4j.xml configuration instead of the log4j.properties. The following configuration (a basic one) works as desired...

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration>
    <appender name="fileAppender" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="log.info" />
        <param name="datePattern" value="'.'yyyy-MM-dd" />
        <param name="append" value="true" />
        <param name="threshold" value="info"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-5p %C{6} - %m%n" />
        </layout>
    </appender>

    <appender name="fileAppenderDebug" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="log.debug" />
        <param name="datePattern" value="'.'yyyy-MM-dd" />
        <param name="append" value="true" />
        <param name="threshold" value="debug"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-5p %C{6} - %m%n" />
        </layout>
    </appender>

    <appender name="fileAppenderError" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="log.error" />
        <param name="datePattern" value="'.'yyyy-MM-dd" />
        <param name="append" value="true" />
        <param name="threshold" value="error"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-5p %C{6} - %m%n" />
        </layout>
    </appender>

    <root>
        <priority value="debug" />
        <appender-ref ref="fileAppender" />
        <appender-ref ref="fileAppenderDebug" />
        <appender-ref ref="fileAppenderError" />
    </root>
</log4j:configuration>

Upvotes: 1

Related Questions