Amirak
Amirak

Reputation: 63

Logback : add new log with different level for Dev and Prod environment

I want to add new log file myNewLog.log, I wont to use different logger level in different environment without infect the existing log. The levels of the dev environment and the prod environment are mentioned in below description :

  1. for Dev env
    • level error is active
    • level info is active
    • level debug is active (default level for the dev)

I added a new appender myNewLog and I setted the default level to DEBUG then I create a 3 loggers with name myNewLog each one has a different level.

logback.xml for the dev env:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true" scan="true" scanPeriod="2 seconds">
    <property resource="logback.properties" />

    <appender name="apiLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${APPL_FULL_PATH}/logs/mylog.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover -->
            <fileNamePattern>${APPL_FULL_PATH}/logs/mylog.log.%d{yyyy.MM.dd}</fileNamePattern>

            <maxHistory>60</maxHistory>
        </rollingPolicy>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%d{yyyy.MM.dd HH:mm:ss} %p %m%n</Pattern>
        </encoder>
    </appender>

    <appender name="myNewLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${APPL_FULL_PATH}/logs/myNewLog.log</file>
        <append>true</append>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover -->
            <fileNamePattern>${APPL_FULL_PATH}/logs/myNewLog%d{yyyy-MM-dd}.log</fileNamePattern>

            <maxHistory>60</maxHistory>
        </rollingPolicy>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <charset>UTF-8</charset>
            <Pattern>%d{yyyy.MM.dd HH:mm:ss} %p %m%n</Pattern>
        </encoder>

        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>

        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>


    <logger name="apiLog" level="INFO" additivity="false">
        <appender-ref ref="apiLog" />
    </logger>
    
    <logger name="myNewLog" level="DEBUG" additivity="true">
        <appender-ref ref="myNewLog" />
    </logger>
    <logger name="myNewLog" level="INFO" additivity="false">
        <appender-ref ref="myNewLog" />
    </logger>
    <logger name="myNewLog" level="ERROR" additivity="false">
        <appender-ref ref="myNewLog" />
    </logger>
    
    <root level="ERROR">
        <appender-ref ref="console" />
    </root>

</configuration>
  1. for Prod env
    • level error is active (default level for the prod)
    • level info will be activated in needs
    • level debug is deactivated

I added a new appender myNewLog and I setted the default level to ERROR then I create a 3 loggers with name myNewLog each one has a different level.

logback.xml for Prod env :

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true" scan="true" scanPeriod="2 seconds">
    <property resource="logback.properties" />

    <appender name="apiLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${APPL_FULL_PATH}/logs/mylog.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover -->
            <fileNamePattern>${APPL_FULL_PATH}/logs/mylog.log.%d{yyyy.MM.dd}</fileNamePattern>

            <maxHistory>60</maxHistory>
        </rollingPolicy>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%d{yyyy.MM.dd HH:mm:ss} %p %m%n</Pattern>
        </encoder>
    </appender>

    <appender name="myNewLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${APPL_FULL_PATH}/logs/myNewLog.log</file>
        <append>true</append>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover -->
            <fileNamePattern>${APPL_FULL_PATH}/logs/myNewLog%d{yyyy-MM-dd}.log</fileNamePattern>

            <maxHistory>60</maxHistory>
        </rollingPolicy>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <charset>UTF-8</charset>
            <Pattern>%d{yyyy.MM.dd HH:mm:ss} %p %m%n</Pattern>
        </encoder>

        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>

        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>


    <logger name="apiLog" level="INFO" additivity="false">
        <appender-ref ref="apiLog" />
    </logger>
    
    <logger name="myNewLog" level="ERROR" additivity="true">
        <appender-ref ref="myNewLog" />
    </logger>
    <logger name="myNewLog" level="DEBUG" additivity="false">
        <appender-ref ref="myNewLog" />
    </logger>
    <logger name="myNewLog" level="INFO" additivity="false">
        <appender-ref ref="myNewLog" />
    </logger>
    
    <root level="ERROR">
        <appender-ref ref="console" />
    </root>
</configuration>

My questions are :

Upvotes: 0

Views: 2345

Answers (2)

fascynacja
fascynacja

Reputation: 2826

What worked for me is to override the logkback.xml for different environemnts. I started application with different vm options. For instance

for dev:

-Dlogging.config=file:my_path/dev/logback.xml

for prod:

-Dlogging.config=file:my_path/prd/logback.xml

Upvotes: 0

jacky-neo
jacky-neo

Reputation: 853

  1. in application.yml, use different profile for each environment. and define level var my.log.level
logging:
  config: classpath:logback.xml

--- #dev
spring:
  profiles:
  - dev

my:
  log:
    level: DEBUG

--- #prod
spring:
  profiles:
  - prod

my:
  log:
    level: ERROR

  1. in logback.xml use "<springProperty>" to import this var. if logback.xml is not effective, please rename it to logback-spring.xml to try again.
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true" scan="true" scanPeriod="2 seconds">

    <!-- import var from application.yml -->
    <springProperty scope="context" name="logLevel" source="my.log.level" defaultValue="INFO"/>

    <property resource="logback.properties" />

    <appender name="apiLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${APPL_FULL_PATH}/logs/mylog.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover -->
            <fileNamePattern>${APPL_FULL_PATH}/logs/mylog.log.%d{yyyy.MM.dd}</fileNamePattern>

            <maxHistory>60</maxHistory>
        </rollingPolicy>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%d{yyyy.MM.dd HH:mm:ss} %p %m%n</Pattern>
        </encoder>
    </appender>

    <appender name="myNewLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${APPL_FULL_PATH}/logs/myNewLog.log</file>
        <append>true</append>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover -->
            <fileNamePattern>${APPL_FULL_PATH}/logs/myNewLog%d{yyyy-MM-dd}.log</fileNamePattern>

            <maxHistory>60</maxHistory>
        </rollingPolicy>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <charset>UTF-8</charset>
            <Pattern>%d{yyyy.MM.dd HH:mm:ss} %p %m%n</Pattern>
        </encoder>

        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>${logLevel}</level>
        </filter>

        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>${logLevel}</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>


    <logger name="apiLog" level="INFO" additivity="true">
        <appender-ref ref="apiLog" />
    </logger>
    <logger name="myNewLog" level="ERROR" additivity="false">
        <appender-ref ref="myNewLog" />
    </logger>
    <logger name="myNewLog" level="DEBUG" additivity="true">
        <appender-ref ref="myNewLog" />
    </logger>
    <logger name="myNewLog" level="INFO" additivity="true">
        <appender-ref ref="myNewLog" />
    </logger>
    <root level="ERROR">
        <appender-ref ref="console" />
    </root>



</configuration>

  1. use --spring.profiles.active to run. for instance, use dev to run
java -jar [mvn-created-jar-file-name] --spring.profiles.active=dev

Upvotes: 1

Related Questions