springboot

[java]55、SpringBoot日志处理

2022-09-07  本文已影响0人  史记_d5da

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>
上一篇 下一篇

猜你喜欢

热点阅读