文章目录

  • 前言
  • 一、logback日志组件
  • 1.日志等级
  • 2.打印日志
  • 二、配置
  • 1.简单配置
  • 2.扩展配置
  • 3.代码测试
  • 三、启动过程的错位
  • 总结


前言

SpringBoot系列Demo代码,整合logback,设置输出日志。

一、logback日志组件

logback是一款开源日志组件,属于Log4j的升级版本,现在项目组使用的次数越来越多。

1.日志等级

日志级别有(从高到低):FATAL(致命),ERROR(错误),WARN(警告),INFO(信息),DEBUG(调试),TRACE(跟踪)或者 OFF(关闭),默认的日志配置在消息写入时将消息回显到控制台。默认情况下,将记录错误级别、警告级别和信息级别的消息。

2.打印日志

通过Class的方式初始化

private final static Logger LOGGER = LoggerFactory.getLogger(HelloLogback.class);

二、配置

1.简单配置

如果不需要进行复杂的日志配置,则在配置文件中进行简单的日志配置即可(默认情况下,SpringBoot日志只记录到控制台,不写日志文件)

#日志配置
logging:
  level:
    #日志级别 root表示所有包,也可以单独配置具体包 fatal error warn info debug trace off
    root: info
  file:
    path: /local/log/dev
    name: app.log

2.扩展配置

如果需要比较复杂的配置,建议使用扩展配置的方式,SpringBoot推荐我们使用带-spring后缀的 logback-spring.xml 扩展配置,因为默认的的logback.xml标准配置,Spring无法完全控制日志初始化。(spring扩展对springProfile节点的支持)

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- scan:程序运行时配置文件被修改,是否重新加载。true=重新加载;false=不重新加载;默认为true; -->
<!-- scanPeriod:监测配置文件被修改的时间间隔,scan属性必须设置为true才可生效;默认为1分钟,默认单位是毫秒; -->
<!-- debug:是否打印logback程序运行的日志信息。true=打印;false=不打印;默认为false; -->
<configuration scan="true" scanPeriod="60" debug="false">
    <!--日志文件主目录-->
    <property name="LOG_HOME" value="/local/log/dev"/>
    <!--日志格式-->
    <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
    <property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %X[%thread] %-5level %logger{50} %line - %msg%n"/>
    <!--日志文件名称 spring.application.name表示工程名称-->
    <property name="APP_NAME" value="app"/>
    <!--    <springProperty scope="context" name="APP_NAME" source="spring.application.name"/>-->

    <!--    <!–默认配置–>-->
    <!--    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>-->
    <!--    <!–配置控制台(Console)–>-->
    <!--    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>-->

    <!-- 配置磁盘文件滚动输出日志 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--设置策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件路径:这里%d{yyyyMMdd}表示按天分类日志-->
            <FileNamePattern>${LOG_HOME}/%d{yyyyMMdd}/${APP_NAME}.%i.log</FileNamePattern>
            <!--设置日志保留天数-->
            <MaxHistory>15</MaxHistory>
            <!--设置最大日志大小-->
            <MaxFileSize>14KB</MaxFileSize>
        </rollingPolicy>
        <!--设置日志输出格式-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!--此日志文件只记录 【debug / info / warn / error】 级别的-->
        <!--        <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
        <!--            <level>【debug / info / warn / error】</level>-->
        <!--            <onMatch>ACCEPT</onMatch>-->
        <!--            <onMismatch>DENY</onMismatch>-->
        <!--        </filter>-->
    </appender>

    <!--控制台输出日志 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 设置日志输出格式 -->
            <pattern>${pattern}</pattern>
            <!-- 设置输出字符集编码 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>
<!--    <root level="INFO">-->
<!--        <appender-ref ref="FILE"/>-->
<!--               <!–为了直观,在控制天中也输出info级别的日志–>-->
<!--        <appender-ref ref="CONSOLE"/>-->
<!--    </root>-->

    <!-- 把日志异步输出到磁盘文件中,避免每次都进行磁盘IO操作 -->
    <appender name="ASYNC-FILE" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <queueSize>256</queueSize>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="FILE"/>
    </appender>

    <!--多环境配置 按照active profile选择分支-->
    <springProfile name="dev">
        <!--root节点 全局日志级别,用来指定最基础的日志输出级别-->
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="ASYNC-FILE"/>
        </root>

        <!-- 子节点向上级传递 局部日志级别-->
        <!--        <logger level="WARN" name="org.springframework"/>-->
        <!--        <logger level="WARN" name="com.netflix"/>-->
        <!--        <logger level="DEBUG" name="org.hibernate.SQL"/>-->
    </springProfile>
    <springProfile name="prod">
        <root level="INFO">
            <!--生产环境,可以不需要再控制台输出日志-->
            <!--<appender-ref ref="CONSOLE"/>-->
        </root>
    </springProfile>
</configuration>

springProfile节点设置,application.yml

spring:
  profiles:
    active: dev

3.代码测试

springboot 指定日志输出到文件 springboot控制台日志输出到文件_logback

springboot 指定日志输出到文件 springboot控制台日志输出到文件_logback_02


springboot 指定日志输出到文件 springboot控制台日志输出到文件_spring boot_03


启动项目,调用接口,查看日志文件输出

springboot 指定日志输出到文件 springboot控制台日志输出到文件_xml_04


springboot 指定日志输出到文件 springboot控制台日志输出到文件_logback_05

三、启动过程的错位

在项目启动时,出现如下错误:

springboot 指定日志输出到文件 springboot控制台日志输出到文件_spring_06

发现时MaxFileSize出现错误,排查后发现是配置文件中错误:

springboot 指定日志输出到文件 springboot控制台日志输出到文件_logback_07


springboot 指定日志输出到文件 springboot控制台日志输出到文件_spring boot_08


TimeBasedRollingPolicy中并没有MaxFileSize属性,于是修改为SizeAndTimeBasedRollingPolicy

springboot 指定日志输出到文件 springboot控制台日志输出到文件_logback_09


启动正常,问题成功解决。

总结

以上就是今天要讲的内容,本文仅仅简单介绍了日志根据时间和大小输出到文件的实现,后续还会完善。