Springboot 整合 logback

674人浏览 / 0人评论

依赖

<!-- 如果已经添加了 spring-boot-starter 就不用再添加 spring-boot-starter-logging -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

logback-spring.xml

<?xml version="1.0" encoding="utf-8"?>
<!--配置文件说明:
共有一个父标签、两种属性、三个节点:
1.一个父标签:configuration
2. 两种属性:contextName和property
3. 三个节点:appender、root、logger
主要就是appender追加到哪里:控制台/文件,然后采用哪种pattern(在property定义了pattern格式)
然后就是logger和root配置,指定日志输出级别,以及引用哪种appender
-->
<configuration>
    <!--根节点<configuration>包含的属性:
        scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
        scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
        debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
    -->
    <contextName>spring-data-jpa-dev</contextName>
    <property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n"/>
    <property name="pattern-color"
              value="%yellow(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %green(%logger{50}) - %highlight(%msg) %n"/>
    <!--文件路径输出说明,会在项目根目录下自动生成文件夹及log文件,也可以指定其他磁盘:D://-->
    <property name="LOG_HOME" value="./logs/info"/>
    <property name="LOG_HOME_ERR" value="./logs/err"/>
    <!-- 控制台输出-无颜色、只输出error级别 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--ThresholdFilter为系统定义的拦截器,例如我们用ThresholdFilter来过滤掉ERROR级别以下的日志不输出到文件中。
        如果不用记得注释掉,不然你控制台会发现没日志~-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!-- 控制台输出-带颜色 -->
    <appender name="CONSOLE-WITH-COLOR" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern-color}</pattern>
        </encoder>
    </appender>

    <!-- 文件输出 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/%d.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!-- 文件输出 ERR-->
    <appender name="FILE_ERR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME_ERR}/%d.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志保留天数-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!--只输出error级别-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!-- 单配置文件 — 全局配置 — 只有一个application.yml文件时使用 -->
    <root level="info">
        <appender-ref ref="CONSOLE-WITH-COLOR"/>
    </root>
    <!--单配置文件 - 局部配置 - 只有一个application.yml文件时使用-->
    <!--additivity="true" LogTest类下的日志会输出两遍-->
    <!--additivity="false" 会覆盖root的配置,只输出一遍-->
    <!--<logger name="com.jbritian.springdatajpa.schedule.LogTest" level="INFO" additivity="true">-->
    <!--    <appender-ref ref="CONSOLE"/>-->
    <!--</logger>-->

    <!-- 多配置文件 — 开发 — application-local.yml、application-dev.yml -->
    <springProfile name="local,dev">
        <root level="INFO">
            <appender-ref ref="CONSOLE-WITH-COLOR"/>
            <appender-ref ref="FILE_ERR"/>
        </root>
        <!--<logger level="WARN" name="org.springframework"/>-->
        <!--<logger level="WARN" name="com.netflix"/>-->
        <!--<logger level="DEBUG" name="org.hibernate.SQL"/>-->
    </springProfile>

    <!-- 多配置文件 — 部署 — application-prod.yml -->
    <springProfile name="prod">
        <root level="INFO">
            <appender-ref ref="CONSOLE-WITH-COLOR"/>
            <appender-ref ref="FILE"/>
            <appender-ref ref="FILE_ERR"/>
        </root>
        <!--<logger level="WARN" name="org.springframework"/>-->
        <!--<logger level="WARN" name="com.netflix"/>-->
        <!--<logger level="DEBUG" name="org.hibernate.SQL"/>-->
    </springProfile>
    <!--1. root和logger是父子的关系。
       Logger的appender根据参数additivity决定是否要叠加root的appender,logger的级别是其自身定义的级别,和root的级别没什么关系。
        2. logger对单个包或类添加配置,相当于局部配置,root相当于全局配置
       如果logger里面配置了additivity="false",就会覆盖root的,只打印一遍;
       但是additivity="true",就会向上层再次传递,不会覆盖,而是打印两遍!
    -->
</configuration>

测试

@Component
@Configuration
@EnableScheduling
public class LogTest {
    private static final Logger logger = LoggerFactory.getLogger(LogTest.class);
    @Scheduled(fixedRate = 5000)
    public void log(){
        logger.info("info");
        logger.warn("warn");
        logger.error("error");
    }
}

全部评论