javaloggingslf4jerror-logging

Sepatare different level logs to different files


I need to store logs in a way so,

  1. Info -> App.log
  2. Error -> Error.log.

I am using log4j for logging in my applicaion. I am trying to different level logs in different files but something going wrong. This code store all level logs to both files.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %d{HH:mm:ss.SSS} [%t] %-15level %logger{36} - %msg%n
            </Pattern>
        </layout>
    </appender>
    <appender name="FILE1" class="ch.qos.logback.core.FileAppender">
        <file>logs/Error.log</file>
        <append>true</append>
        <immediateFlush>true</immediateFlush>
        <encoder>
            <Pattern> %d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n </Pattern>
         </encoder>
    </appender>
    <appender name="FILE2" class="ch.qos.logback.core.FileAppender">
        <file>logs/App.log</file>
        <append>true</append>
        <immediateFlush>true</immediateFlush>
        <encoder>
            <Pattern> %d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n </Pattern>
         </encoder>
    </appender>
    <logger name="com" level="error" additivity="false">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE1"/>
    </logger>
   <logger name="com" level="info" additivity="false">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE2"/>
    </logger>
</configuration>

Solution

  • You can you logback's level filter mechanisms, like:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <appender name="FILE1" class="ch.qos.logback.core.FileAppender">
            <file>logs/Error.log</file>
            <encoder>
                <pattern>%d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n</pattern>
            </encoder>
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>ERROR</level>
            </filter>
        </appender>
        <appender name="FILE2" class="ch.qos.logback.core.FileAppender">
            <file>logs/App.log</file>
            <encoder>
                <pattern>%d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n</pattern>
            </encoder>
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>INFO</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
        </appender>
        <root level="INFO">
            <appender-ref ref="FILE1" />
            <appender-ref ref="FILE2" />
        </root>
    </configuration>
    

    Brief overview: