Search code examples
springspring-bootlogbackspring-logback

Empty log file created for every profile which is configured in spring logback


I am using the below logback-spring.xml file in my spring boot application. Profile-specific Configuration is enabled in the xml file. But when my environment is test it is writing the the entries in example-wsrest_test.log file , but then also it is creating the other two log files example-wsrest_prod.log and example-wsrest_acc.log when server starts. Is it possible to create only single log file based on the profile.

<!-- <include resource="org/springframework/boot/logging/logback/base.xml" 
    /> -->
<!-- use Spring default values @see https://github.com/spring-projects/spring-boot/blob/master/spring-boot/src/main/resources/org/springframework/boot/logging/logback/defaults.xml -->
<include resource="org/springframework/boot/logging/logback/defaults.xml" />

<!-- <property name="LOG_PATH" value="." /> -->
<property name="LOG_ARCHIVE" value="${LOG_PATH}/archive" />
<property name="LOG_PATH_PROD" value="${LOG_PATH}" />
<property name="LOG_PATH_TEST" value="${LOG_PATH}" />
<property name="LOG_PATH_ACC" value="${LOG_PATH}" />
<property name="LOG_ARCHIVE_PROD" value="${LOG_PATH_PROD}/archive" />
<property name="LOG_ARCHIVE_TEST" value="${LOG_PATH_TEST}/archive" />

<property name="GLOBAL_TEST_LOG_LEVEL" value="INFO" />
<property name="GLOBAL_ACC_LOG_LEVEL" value="INFO" />
<property name="GLOBAL_PROD_LOG_LEVEL" value="ERROR" />
<property name="LOG_FILE_NAME" value="example-wsrest" />

<appender name="RollingFile-Appender-acc"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_PATH_ACC}/${LOG_FILE_NAME}_acc.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    <fileNamePattern>${LOG_PATH_ACC}/${LOG_FILE_NAME}_acc_%d{dd-MM-yyyy}_%i.log</fileNamePattern>
    <maxFileSize>10MB</maxFileSize>
    <maxHistory>30</maxHistory>
    <totalSizeCap>300MB</totalSizeCap>
    </rollingPolicy>    
    <encoder>
        <pattern>${FILE_LOG_PATTERN}</pattern>
    </encoder>
</appender>

<appender name="RollingFile-Appender-prod"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_PATH_PROD}/${LOG_FILE_NAME}_prod.log</file>     
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    <fileNamePattern>${LOG_PATH_PROD}/${LOG_FILE_NAME}_prod_%d{dd-MM-yyyy}_%i.log</fileNamePattern>
    <maxFileSize>10MB</maxFileSize>
    <maxHistory>30</maxHistory>
    <totalSizeCap>300MB</totalSizeCap>
</rollingPolicy>
    <encoder>
        <pattern>${FILE_LOG_PATTERN}</pattern>
    </encoder>
</appender>

<appender name="RollingFile-Appender-test"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_PATH_TEST}/${LOG_FILE_NAME}_test.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    <fileNamePattern>${LOG_PATH_TEST}/${LOG_FILE_NAME}_test_%d{dd-MM-yyyy}_%i.log.zip</fileNamePattern>
    <maxFileSize>10MB</maxFileSize>
    <maxHistory>30</maxHistory>
    <totalSizeCap>300MB</totalSizeCap>
</rollingPolicy>
    <encoder>
        <pattern>${FILE_LOG_PATTERN}</pattern>
    </encoder>
</appender>

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        <charset>utf8</charset>
    </encoder>
</appender>

<springProfile name="test">
    <root level="${GLOBAL_TEST_LOG_LEVEL}">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="RollingFile-Appender-test" />
    </root>
    <logger name="org.springframework.security" level="${GLOBAL_TEST_LOG_LEVEL}"
        additivity="false">
        <appender-ref ref="CONSOLE" />
    </logger>
    <logger name="org.springframework.web" level="${GLOBAL_TEST_LOG_LEVEL}"
        additivity="false">
        <appender-ref ref="CONSOLE" />
    </logger>
    <logger name="org.hibernate" level="${GLOBAL_TEST_LOG_LEVEL}"
        additivity="false">
        <appender-ref ref="CONSOLE" />
    </logger>
</springProfile>

<springProfile name="acc">
    <root level="${GLOBAL_ACC_LOG_LEVEL}">
        <appender-ref ref="RollingFile-Appender-acc" />
    </root>
    <logger name="com.example.test" level="DEBUG"
        additivity="false">
        <appender-ref ref="RollingFile-Appender-acc" />
    </logger>
  <logger name="org.springframework.security" level="${GLOBAL_ACC_LOG_LEVEL}"
        additivity="false">
        <appender-ref ref="CONSOLE" />
    </logger>
    <logger name="org.springframework.web" level="${GLOBAL_ACC_LOG_LEVEL}"
        additivity="false">
        <appender-ref ref="CONSOLE" />
    </logger>
    <logger name="org.hibernate" level="${GLOBAL_ACC_LOG_LEVEL}"
        additivity="false">
        <appender-ref ref="CONSOLE" />
    </logger>

</springProfile>

<springProfile name="prod">
    <root level="${GLOBAL_PROD_LOG_LEVEL}">
        <appender-ref ref="RollingFile-Appender-prod" />
    </root>
    <!-- To know when the application is ready -->
    <logger name="com.example.test" level="INFO"
        additivity="false">
        <appender-ref ref="RollingFile-Appender-prod" />
    </logger>
    <!-- To know about the API endpoints scanned, found & available -->
    <logger name=" org.springframework.data.rest" level="INFO"
        additivity="false">
        <appender-ref ref="RollingFile-Appender-prod" />
    </logger>
    <!-- To know when and if the application is started on th eembedded Tomcat -->
    <logger name="org.springframework.boot.context.embedded.tomcat"
        level="INFO" additivity="false">
        <appender-ref ref="RollingFile-Appender-prod" />
    </logger>
    <!-- To know about filters set, amongst other things -->
    <logger name="org.springframework.data.rest.webmvc" level="INFO"
        additivity="false">
        <appender-ref ref="RollingFile-Appender-prod" />
    </logger>
    <logger name="com.example.test" level="INFO"
        additivity="false">
        <appender-ref ref="RollingFile-Appender-prod" />
    </logger>
    <logger name="org.springframework.security" level="${GLOBAL_PROD_LOG_LEVEL}"
        additivity="false">
        <appender-ref ref="RollingFile-Appender-prod" />
    </logger>
    <logger name="org.springframework.web" level="${GLOBAL_PROD_LOG_LEVEL}"
        additivity="false">
        <appender-ref ref="RollingFile-Appender-prod" />
    </logger>
    <logger name="org.hibernate" level="${GLOBAL_PROD_LOG_LEVEL}"
        additivity="false">
        <appender-ref ref="RollingFile-Appender-prod" />
    </logger>
</springProfile>


Solution

  • You have to define appender inside spring profile tag. All appenders inside configuration tag are initialized but log is written to files based on spring profiles only. But to have a single log file per profile, each profile should have its own appender. Example below might help :

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
    
        <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    
        <springProfile name="test">
            <appender name="FILE_APPENDER_TEST" class="ch.qos.logback.core.rolling.RollingFileAppender">
                <encoder>
                    <pattern>${FILE_LOG_PATTERN}</pattern>
                    <charset>utf8</charset>
                </encoder>
                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                    <fileNamePattern>%d{yyyy-MM-dd}-test.log</fileNamePattern>
                    <maxHistory>30</maxHistory>
                </rollingPolicy>
            </appender>
            <root level="TRACE">
                <appender-ref ref="FILE_APPENDER_TEST"/>
            </root>
        </springProfile>
    
        <springProfile name="prod">
            <appender name="FILE_APPENDER_PROD" class="ch.qos.logback.core.rolling.RollingFileAppender">
                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                    <fileNamePattern>%d{yyyy-MM-dd}-prod.log</fileNamePattern>
                    <maxHistory>30</maxHistory>
                </rollingPolicy>
                <encoder>
                    <pattern>${FILE_LOG_PATTERN}</pattern>
                    <charset>utf8</charset>
                </encoder>
            </appender>
            <root level="INFO">
                <appender-ref ref="FILE_APPENDER_PROD"/>
            </root>
        </springProfile>
    
    </configuration>