0
votes

I am trying to use log4j in my java app. I need to write only DEBUG logs to debug.log file, only INFO logs to info.log file and only ERROR logs to error.log file. I manage to write debug and error logs to their appropriate files, but info is not working. I could not understand why it is not working. And I would like to ask for your help whether it is possible also to write only debug and info logs to console at the same time. RESULT

3 files are created for each level of log(debug.log, info.log and error.log) DEBUG logs are written to debug.log, ERROR logs are written to error.log but INFO logs are not written to neither info.log nor debug.log or error.log !

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <!-- only DEBUG Appender -->
    <appender name="file1" class="org.apache.log4j.FileAppender"> 
            <param name="File" value="D:\\debugFile.log  "/> 
            <layout class="org.apache.log4j.PatternLayout"> 
                    <param name="ConversionPattern" value="%-4r %d{dd MMM yyyy HH:mm:ss} [%t] %-5p %c %x - %m%n"/> 
            </layout> 
            <!-- Use LevelMatchFilter to write only DEBUG messages to error.log -->
            <filter class="org.apache.log4j.varia.LevelMatchFilter">
                    <param name="LevelToMatch" value="debug" />
                    <param name="AcceptOnMatch" value="true"/>
            </filter>
            <filter class="org.apache.log4j.varia.DenyAllFilter" />
    </appender> 

    <!-- only INFO Appender -->
    <appender name="file2" class="org.apache.log4j.FileAppender"> 
            <param name="File" value="D:\\infoFile.log  "/> 
            <layout class="org.apache.log4j.PatternLayout"> 
                    <param name="ConversionPattern" value="%-4r %d{dd MMM yyyy HH:mm:ss} [%t] %-5p %c %x - %m%n"/> 
            </layout> 
            <!-- Use LevelMatchFilter to write only INFO messages to error.log -->
            <filter class="org.apache.log4j.varia.LevelMatchFilter">
                    <param name="LevelToMatch" value="info" />
                    <param name="AcceptOnMatch" value="true"/>
            </filter>
            <filter class="org.apache.log4j.varia.DenyAllFilter" />
    </appender>

    <!-- only ERROR Appender -->
    <appender name="file3" class="org.apache.log4j.FileAppender"> 
            <param name="File" value="D:\\errorFile.log  "/> 
            <layout class="org.apache.log4j.PatternLayout"> 
                    <param name="ConversionPattern" value="%-4r %d{dd MMM yyyy HH:mm:ss} [%t] %-5p %c %x - %m%n"/> 
            </layout> 
            <!-- Use LevelMatchFilter to write only ERROR messages to error.log -->
            <filter class="org.apache.log4j.varia.LevelMatchFilter">
                    <param name="LevelToMatch" value="error" />
                    <param name="AcceptOnMatch" value="true"/>
            </filter>
            <filter class="org.apache.log4j.varia.DenyAllFilter" />
    </appender> 

    <root> 
            <level value="info"/> 
            <appender-ref ref="file1" /> <!-- sadece DEBUG -->
            <appender-ref ref="file2" /> <!-- sadece INFO -->
            <appender-ref ref="file3" /> <!-- sadece ERROR -->
    </root> 
</log4j:configuration>
1
Seems all fine. What is happening when you log a message a INFO level? Is the file not getting created at all? If it is created, is it not logging any logs there, or is it logging the logs that it shouldn't have? Please add some more details. - Rohit Jain
I added extra info to my question. It is really as I said - Emilla

1 Answers

1
votes

I slightly amended it, and it works well

<?xml version="1.0" encoding="UTF-8"?>

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

<appender name="info" class="org.apache.log4j.RollingFileAppender">

    <param name="Threshold" value="INFO" />
    <param name="MaxFileSize" value="3KB" />
    <param name="MaxBackupIndex" value="10" />
    <param name="File" value="D:\\info.txt" />

    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{MMM-dd-yyyy HH:mm:ss:SSS} %-5p %m%n" />
    </layout>

    <filter class="org.apache.log4j.varia.LevelMatchFilter">
        <param name="LevelToMatch" value="info" />
        <param name="AcceptOnMatch" value="true"/>
    </filter>
    <filter class="org.apache.log4j.varia.DenyAllFilter" />
</appender>

<appender name="debug" class="org.apache.log4j.RollingFileAppender">

    <param name="Threshold" value="DEBUG" />
    <param name="MaxFileSize" value="3KB" />
    <param name="MaxBackupIndex" value="10" />
    <param name="File" value="D:\\debug.txt" />


    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{MMM-dd-yyyy HH:mm:ss:SSS} %-5p %m%n" />
    </layout>

    <filter class="org.apache.log4j.varia.LevelMatchFilter">
        <param name="LevelToMatch" value="debug" />
        <param name="AcceptOnMatch" value="true"/>
    </filter>
    <filter class="org.apache.log4j.varia.DenyAllFilter" />
</appender>

<appender name="error" class="org.apache.log4j.RollingFileAppender">

    <param name="Threshold" value="ERROR" />
    <param name="MaxFileSize" value="3KB" />
    <param name="MaxBackupIndex" value="10" />
    <param name="File" value="D:\\error.txt" />


    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{MMM-dd-yyyy HH:mm:ss:SSS} %-5p %m%n" />
    </layout>

    <filter class="org.apache.log4j.varia.LevelMatchFilter">
        <param name="LevelToMatch" value="error" />
        <param name="AcceptOnMatch" value="true"/>
    </filter>
    <filter class="org.apache.log4j.varia.DenyAllFilter" />
</appender>

<root>
    <level value="all"/>
    <appender-ref ref="info" />
    <appender-ref ref="debug" />
    <appender-ref ref="error" />
</root>