SpringBoot项目中使用Logback进行日志管理

Logback简介

logback是由log4j创始人设计的又一个开源日志组件 , 优化了log4j存在的性能问题。

logback包含了三个模块:logback-core、logback-classic、logback-access。

  • logback-core 是其它模块的基础设施,其它模块基于它构建,显然,logback-core 提供了一些关键的通用机制。
  • logback-classic 的地位和作用等同于 Log4J,它也被认为是 Log4J 的一个改进版,并且它实现了简单日志门面 SLF4J
  • logback-access 主要作为一个与 Servlet 容器交互的模块,比如说tomcat或 jetty,提供一些与 HTTP 访问相关的功能。

SpringBoot的日志模块

当需要配置日志信息时,可以在application.properties、application.yaml中进行简单的配置,比如日志级别。 SpringBoot默认为我们输出的日志级别为infowarnerror,如果还使用其他级别的日志,可以在配置中进行配置 。

支持的日志级别有: ERROR, WARN, INFO, DEBUG , TRACE (Logback中没有FATAL级别,等同于ERROR)。

日志级别 trace < debug < info < warn < error < fatal,高级别的日志会输出低级别的日志信息,反之不行,不区分大小写。

在application.properties中配置:

#配置根logger的输出级别,也可以直接使用大写的 LEVEL=WARN指定
logging.level.root=WARN

#指定logger的name属性为org.springframework.web,即该包下的日志级别为DEBUG
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR

#指定日志输出的文件路径,/在windows下是直接定位到当前工作文件磁盘下的
logging.path=/logs
#指定日志文件的名称
logging.file=logs.log

在application.yaml中:

loggin: 
    level: 
        root: WARN

Logback配置示例

?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    <logger name="org.springframework.web" level="INFO"/>
    <logger name="org.springboot.sample" level="TRACE" />

    <!-- 开发、测试环境 -->
    <springProfile name="dev,test">
        <logger name="org.springframework.web" level="INFO"/>
        <logger name="org.springboot.sample" level="INFO" />
        <logger name="com.xx.projectName" level="DEBUG" />
    </springProfile>

    <!-- 生产环境 -->
    <springProfile name="prod">
        <logger name="org.springframework.web" level="ERROR"/>
        <logger name="org.springboot.sample" level="INFO" />
        <logger name="com.xx.projectName" level="INFO" />
    </springProfile>

    <!-- root用来指定最基础的日志输出级别 -->
    <root level="INFO">
    </root>
</configuration>

Logback详细配置示例:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds" debug="false">
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <contextName>logback</contextName>

    <property name="log_path" value="/log"/><!-- 如果在Windows环境下使用/开头的路径,将会被指定到项目所在的盘符 -->
    <!-- %d{yyyy-MM-dd HH:mm:ss.SSS}:日志输出时间,精确到分按天切割; -->
    <!-- %-5level:日志级别,并且使用5个字符靠左对齐; %thread:输出日志的进程名字 -->
    <!-- %logger{50}:日志输出者的名字; %msg:日志消息; %n:换行符 -->
    <property name="log_pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%thread] %logger{50} - %msg%n"/>
    <property name="log_fileNamePattern" value="-%d{yyyy-MM-dd}.%i.log"/>
    <property name="log_maxFileSize" value="100MB"/>
    <property name="log_maxHistory" value="15"/>

    <!-- 输出到控制台,一般生产环境都是后台启动,这个没太大作用 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <encoder charset="UTF-8">
            <pattern>${log_pattern}</pattern>
        </encoder>
    </appender>

    <!-- 输出到app.log文件 -->
    <appender name="APP" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log_path}/app.log</file>
        <encoder charset="UTF-8">
            <pattern>${log_pattern}</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log_path}/app${log_fileNamePattern}</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${log_maxFileSize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>${log_maxHistory}</maxHistory>
        </rollingPolicy>
    </appender>

    <!-- 输出到sql.log文件 -->
    <appender name="SQL" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log_path}/sql.log</file>
        <encoder charset="UTF-8">
            <pattern>${log_pattern}</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log_path}/sql-${log_fileNamePattern}</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${log_maxFileSize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>${log_maxHistory}</maxHistory>
        </rollingPolicy>
    </appender>

    <!-- 自定义包日志级别要加上additivity="false",表示不会向上传递 -->
    <logger name="org.springframework">
        <level value="WARN"/>
    </logger>
    <logger name="org.apache" additivity="false">
        <level value="WARN"/>
    </logger>
    <logger name="org.mybatis" additivity="false">
        <level value="DEBUG"/>
    </logger>

    <!-- dao层的sql配置 -->
    <logger name="com.example.xxx.dao" level="DEBUG" additivity="false">
        <appender-ref ref="SQL" />
    </logger>

    <!-- root用来指定最基础的日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="APP"/>
    </root>

</configuration>

写博客是为了总结记录,而不应为了花里胡哨的标榜什么。比如写了一个算法,尽量联系下应用场景;看了一段源码,想一下对应用层调用有什么影响,做到学以致用,避免眼高手低。
原文地址:https://www.cnblogs.com/cappuccino-jay/p/14766784.html