美文网首页springboot
[java]55、SpringBoot日志处理

[java]55、SpringBoot日志处理

作者: 史记_d5da | 来源:发表于2022-09-07 22:40 被阅读0次

    1、日志的发展史

    1、最原始的打印日志
    System.outSystem.err
    2、JUL(Java Util Logging)
    JDK自带的日志框架,在java.util.logging包下
    API不完善、对开发者不友好,很少人使用
    3、Log4j(Log For Java)
    Apache组织推出,1.x版本于2015-08-05宣布停止维护
    4、JCL(Jakarta Commons Logging)
    Apache组织推出的日志门面接口
    提供一套API来实现不同Logger之间的切换
    5、SLF4JSimple Logging Facade For Java
    Log4j作者开发的日志门面接口,比JCL更优秀更好用
    6、Logback
    Log4j作者开发,比Log4j 1.x的性能高很多,实现了SLF4J
    7、Log4j2
    Apache组织推出的,Log4j 1.x的重大升级改进版,改进了Logback的一些问题,既是门面接口,又是日志实现

    2、Log4j

    log4japache推出的日志实现,于2015年停止更新了,目前最新版本为1.2.17

    2.1、在pom.xml中配置
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    
    2.2、配置文件

    classpath:log4j.xml(优先级高)、classpath:log4j.properties

    log4j.rootLogger=TRACE, console
    # 输出目标(控制台,文件)
    # log4j.appender.名称=Appender的类型
    log4j.appender.console=org.apache.log4j.ConsoleAppender
    log4j.appender.console.encoding=UTF-8
    # layout:输出格式
    log4j.appender.console.layout=org.apache.log4j.PatternLayout
    # %-5p错误信息、%t线程、%m错误信息、%n换行
    log4j.appender.console.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] [%t]: %m%n
    
    2.3、日志级别

    日志级别由小到大:
    TRACE<DEBUG<INFO<WARN<ERROR<FATAL<OFF

    2.4、pattern

    %cLogger的全类名
    %C: 日志调用所在类,如: com.sj.log.Slf4jAndLogbackMain
    %d:时间,%d{yyyy-MM-dd HH:mm:ss.SSS}
    %t:线程的名称
    %F:文件名
    %L:代码行号
    %M:方法
    %l:代码的具体位置(哪个类的哪个方法?哪一行?)
    %m:消息
    %n:换行
    %p:日志级别
    %%:一个%
    %pid:进程号
    %threadId(简写:%tid):线程号
    %exception(简写:%ex):异常记录
    宽度设置
    %20logger:当字符数少于20个字符时,则左侧留空白;
    %-20logger:当字符数少于20个字符时,则右侧留空白;
    %.30logger:当字符数据大于30个时,则截断;
    显示设置
    %highligth:突出显示
    %green(%red、%blue、%white):字体显示为指定颜色
    {length}可指定长度,如%logger{36}

    2.5、子Logger
    Logger
    Logger可以是包级别、类级别
    所有子Logger的最终父LoggerrootLogger
    Logger默认会继承父LoggerAppender
    additivity:代表不继承关系
    # 从下到上依此为继承关系
    log4j.rootLogger=TRACE, console3
    # 默认继承rootLogger
    log4j.logger.com.sj.test=ERROR, console3
    # 子Logger会默认继承父Logger的Appender
    log4j.logger.com.sj.test.TestLog4j1_04=FATAL, console4
    # additivity不继承关系
    log4j.additivity.com.sj.test.TestLog4j1_04=FATAL, console4
    
    2.6、日志输入到文件

    1、file:只输入到一个文件中。

    encoding=UTF-8
    pattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] [%t]: %m%n
    log4j.rootLogger=TRACE, file
    #输出到文件(FileAppender)
    log4j.appender.file=org.apache.log4j.FileAppender
    # 文件名称
    log4j.appender.file.file=log4j.log
    log4j.appender.file.encoding=${encoding}
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.conversionPattern=${pattern}
    

    2、rollingFile:文件大小超过一定的值时会出入到新的文件中。

    encoding=UTF-8
    pattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] [%t]: %m%n
    log4j.rootLogger=TRACE, rollingFile
    #输出到文件(FileAppender)
    log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
    # 生成的文件最大索引值(备份文件个数)
    log4j.appender.rollingFile.maxBackupIndex=10
    # 每个备份文件的大小
    log4j.appender.rollingFile.maxFileSize=10KB
    # 输出到的文件目录
    log4j.appender.rollingFile.file=log4j.log
    log4j.appender.rollingFile.encoding=${encoding}
    log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
    log4j.appender.rollingFile.layout.conversionPattern=${pattern}
    

    3、dailyRollingFile:它能够按一定的频度滚动日志记录文件。

    encoding=UTF-8
    pattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] [%t]: %m%n
    log4j.appender.dailyRollingFile=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.dailyRollingFile.datePattern='.'yyyy-MM-dd-HH-mm
    log4j.appender.dailyRollingFile.file=log4j.log
    log4j.appender.dailyRollingFile.encoding=${encoding}
    log4j.appender.dailyRollingFile.layout=org.apache.log4j.PatternLayout
    log4j.appender.dailyRollingFile.layout.conversionPattern=${pattern}
    
    2.7、xml格式的配置文件

    1、console打印

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration
            PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd" >
    <log4j:configuration>
    <!--    appender-->
        <appender name="console" class="org.apache.log4j.ConsoleAppender">
            <param name="encoding" value="UTF-8"/>
            <layout class="org.apache.log4j.PatternLayout">
                <param name="conversionPattern" value="%d{HH:mm:ss.SSS} [%-5p] %c: %m%n"/>
            </layout>
        </appender>
        <logger name="com.sj.main.TestLog4j1_02" additivity="false">
            <level value="INFO" />
            <appender-ref ref="file"/>
        </logger>
    <!--    logger-->
        <root>
            <level value="TRACE" />
            <appender-ref ref="console"/>
            <appender-ref ref="file"/>
        </root>
    </log4j:configuration>
    

    2、file输出到文件

    <appender name="file" class="org.apache.log4j.FileAppender">
        <param name="file" value="log4j.log"/>
        <param name="encoding" value="UTF-8"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="conversionPattern" value="%d{HH:mm:ss.SSS} [%-5p] %c: %m%n"/>
        </layout>
    </appender>
    

    2、rollingFile输出

    <appender name="rollingFile" class="org.apache.log4j.RollingFileAppender">
        <param name="file" value="log4j.log"/>
        <param name="encoding" value="UTF-8"/>
        <param name="maxFileSize" value="100KB"/>
        <param name="maxBackupIndex" value="10"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="conversionPattern" value="%d{HH:mm:ss.SSS} [%-5p] %c: %m%n"/>
        </layout>
    </appender>
    

    3、dailyRollingFile输出

    <appender name="dailyRollingFile" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="log4j.log"/>
        <param name="encoding" value="UTF-8"/>
        <param name="datepattern" value="'.'yyyy-MM-dd-HH-mm-ss"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="conversionPattern" value="%d{HH:mm:ss.SSS} [%-5p] %c: %m%n"/>
        </layout>
    </appender>
    

    4、Filter
    1、LevelMatchFilter

    <!--        关闭FATAL级别-->
    <filter class="org.apache.log4j.varia.LevelMatchFilter">
        <param name="levelToMatch" value="DEBUG"/>
        <param name="acceptOnMatch" value="true"/>
    </filter>
    

    2、LevelRangeFilter

    <!--        只有符合范围内的日志才会输出-->
    <filter class="org.apache.log4j.varia.LevelRangeFilter">
        <param name="levelMin" value="WARN"/>
        <param name="levelMax" value="ERROR"/>
    </filter>
    

    3、StringMatchFilter

    <filter class="org.apache.log4j.varia.StringMatchFilter">
        <param name="stringToMatch" value="错误"/> <!--带有错误的文字都排除-->
        <param name="acceptOnMatch" value="false"/>
    </filter>
    

    3、JCL

    jcl是定义的一组通用日志接口
    log4j是日志的实现,log4j2也是日志的实现,log4j2对是对log4j的重写,功能更完善
    1、JCL的介绍

    image.png
    通过LogFactory动态加载Log实现类,如果要适配新的日志,需要修改JCL内部代码,因此被apache淘汰

    4、SLF4J

    简单日志门面(Simple Logging Facade For Java) SLF4J主要是为了给Java日志访问提供一套标准、规范的API框架,其主要意义在于提供接口,具体的实现可以交由其他日志框架

    4.1、绑定日志的实现(Binding)

    1、添加slf4j-api的依赖
    2、使用slf4jAPI在项目中进行统一的日志记录
    3、绑定具体的日志实现框架
    4、绑定已经实现了slf4j的日志框架,直接添加对应依赖
    5、绑定没有实现slf4j的日志框架,先添加日志的适配器,再添加实现类的依赖
    6、slf4j有且仅有一个日志实现框架的绑定(如果出现多个默认使用第一个依赖日志实现)
    maven中添加依赖

    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.30</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.30</version>
    </dependency>
    

    日志桥接如官方提供的图如下:


    slf4j
    4.2、旧的日志框架桥接

    通常,依赖的某些组件依赖于SLF4J以外的日志记录API。也可以假设这些组件在不久的将来不会切换到SLF4J。为了解决这种情况,SLF4J附带了几个桥接模块,这些模块将对log4jJCLjava.util.logging API的调用重定向,就好像它们是对SLF4J API一样。
    桥接步骤如下:
    1、先去除之前老的日志框架的依赖
    2、添加SLF4J提供的桥接组件
    3、为项目添加SLF4J的具体实现

    old-bridge

    5、Lombok的使用

    Lombok可以自动生成SLF4JLogger的定义
    具体实现如下:
    1、添加maven依赖如下

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.12</version>
    </dependency>
    

    2、在java中实现@CommonLog的注解

    @CommonsLog
    public class TestLog4j1 {
        public static void main(String[] args) {
    // 实际使用中log的实现如下的形式,
    // private static final Log log = LogFactory.getLog(TestLog4j1.class);
            log.error("错误_ERROR");
            log.warn("警告_WARN");
            log.info("信息_INFO");
            log.debug("调试_DEBUG");
            log.trace("痕迹_TRACE");
        }
    }
    

    6、Logback

    Logback内部有一套默认配置,可以不用提供配置文件

    6.1、Logback的打印实现

    1、添加maven依赖如下

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>
    

    2、在resources中实现logback.xml配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
    <!--    抽取公共内容    -->
        <property name="PATTERN" value="%d{HH:mm:ss.SSS} [%-5p] %c: %m%n" />
        <property name="CHARSET" value="UTF-8" />
    <!--    appender-->
        <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <charset>${CHARSET}</charset>
                <pattern>${PATTERN}</pattern>
            </encoder>
        </appender>
    <!--    logger-->
        <root level="TRACE">
            <appender-ref ref="console"></appender-ref>
        </root>
        <logger name="com.sj" level="DEBUG" additivity="false">
            <appender-ref ref="console" />
        </logger>
    </configuration>
    

    3、Logback彩色控制台打印

    <property name="PATTERN" value="%d{HH:mm:ss.SSS} [%highlight(%-5p)] %yellow(%c): %m%n" />
    
    6.2、configuration标签

    configuration设置常用属性,debug="true":可以打印Logback的内部日志
    scan="true" + scanPeriod="30 seconds"
    每隔30秒扫描配置文件,使用配置文件的最新修改
    scanPeriod的单位可以是:millisecondssecondsminuteshours

    <configuration debug="true" scan="true" scanPeriod="30 seconds">
    </configuration>
    
    6.3、appender标签

    公共标签如下

    <property name="FILE_PATTERN" value="%d{HH:mm:ss.SSS} [%-5p] %c: %m%n" />
    <property name="CONSOLE_PATTERN" value="%d{HH:mm:ss.SSS} [%highlight(%-5p)] %yellow(%c): %m%n" />
    <property name="HTML_PATTERN" value="%d{HH:mm:ss.SSS} %-5p%c: %m%n" />
    <property name="CHARSET" value="UTF-8" />
    <property name="BASE_PATH" value="/Users/shiji/development" />
    

    1、FileAppender
    PatternLayoutEncoder

    <appender name="file" class="ch.qos.logback.core.FileAppender">
        <file>${BASE_PATH}/logback_file.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <charset>${CHARSET}</charset>
            <pattern>${FILE_PATTERN}</pattern>
        </encoder>
    </appender>
    

    HTMLLayout

    <appender name="htmlFile" class="ch.qos.logback.core.FileAppender">
            <file>${BASE_PATH}/logback_file.html</file>
            <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
                <charset>${CHARSET}</charset>
                <layout class="ch.qos.logback.classic.html.HTMLLayout">
                    <pattern>${HTML_PATTERN}</pattern>
                </layout>
            </encoder>
        </appender>
    

    2、RollingFileAppender
    基于时间滚动策略TimeBasedRollingPolicy

    <appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${BASE_PATH}/logback.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <charset>${CHARSET}</charset>
            <pattern>${FILE_PATTERN}</pattern>
        </encoder>
    <!--        基于时间的滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${BASE_PATH}/%d{yyy-MM-dd-HH-mm-ss}.log</fileNamePattern>
    <!--            删除20s以前的配置文件-->
            <maxHistory>20</maxHistory>
    <!--            总的日志大小限制(超过了,就删除最早的日志)-->
            <totalSizeCap>10KB</totalSizeCap>
        </rollingPolicy>
    </appender>
    

    基于时间和大小的滚动策略SizeAndTimeBasedRollingPolicy

    <appender name="rollingFile2" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${BASE_PATH}/logback_rolling2.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <charset>${CHARSET}</charset>
            <pattern>${FILE_PATTERN}</pattern>
        </encoder>
        <!--        基于时间和大小的滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${BASE_PATH}/logback_rolling2_%d{dd-HH-mm}_%i.log.zip</fileNamePattern>
            <!--当日志文件大小超过1MB时生成新的日志文件-->
            <maxFileSize>1MB</maxFileSize>
        </rollingPolicy>
    </appender>
    

    3、Filter

    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <charset>${CHARSET}</charset>
            <pattern>${CONSOLE_PATTERN}</pattern>
        </encoder>
    <!--        只打印WARN级别的信息-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
    <!--            当匹配 接收(开启打印)-->
            <onMatch>ACCEPT</onMatch>
    <!--            当不匹配 否定(关闭打印)-->
            <onMisMatch>DENY</onMisMatch>
        </filter>
    </appender>
    

    4、AsyncAppender异步打印

    <appender name="async" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="console" />
    </appender>
    

    相关文章

      网友评论

        本文标题:[java]55、SpringBoot日志处理

        本文链接:https://www.haomeiwen.com/subject/fsmcnrtx.html