【问题标题】:Logback : add new log with different level for Dev and Prod environmentLogback :为 Dev 和 Prod 环境添加不同级别的新日志
【发布时间】:2021-03-01 06:26:44
【问题描述】:

我想添加新的日志文件myNewLog.log,我不会在不同的环境中使用不同的记录器级别而不影响现有的日志。 dev 环境和 prod 环境的级别在下面的描述中提到:

  1. 用于开发环境
    • 级别错误处于活动状态
    • 级别信息处于活动状态
    • 级别调试处于活动状态(开发人员的默认级别)

我添加了一个新的附加程序 myNewLog 并将默认级别设置为 DEBUG 然后我创建了 3 个名为 myNewLog 的记录器,每个记录器都有不同的级别。

用于开发环境的 logback.xml:

<?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. 用于生产环境
    • 级别错误处于活动状态(prod 的默认级别)
    • 等级信息将在需要时激活
    • 级别调试已停用

我添加了一个新的附加程序 myNewLog 并将默认级别设置为 ERROR 然后我创建了 3 个名为 myNewLog 的记录器,每个记录器都有不同的级别。

生产环境的 logback.xml:

<?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>

我的问题是:

  • 如何管理每个环境的日志级别?
  • 我可以在一个 logback 文件中管理 2 个环境的级别吗?

【问题讨论】:

    标签: java spring log4j logback spring-logback


    【解决方案1】:
    1. 在 application.yml 中,为每个环境使用不同的配置文件。并定义级别 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. 在 logback.xml 中使用“”来导入这个变量。 如果logback.xml无效,请将其重命名为logback-spring.xml重试
    <?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. 使用 --spring.profiles.active 运行。例如,使用 dev 运行
    java -jar [mvn-created-jar-file-name] --spring.profiles.active=dev
    

    【讨论】:

    • 感谢您的提议,这不是 Spring Boot 项目我没有 application.yml 我也无法将 logback.xml 更改为 logback-spring.xml
    • 如果不使用spring-boot,请使用环境变量定义“my.log.level”。在 logback.xml 中,${my.log.level:-INFO。 INFO 是默认值。您的应用程序启动方式如下: java -Dmy.log.level=DEBUG -jar [your-jar]
    猜你喜欢
    • 2019-05-13
    • 2015-08-10
    • 2020-11-30
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    相关资源
    最近更新 更多