SpringBoot基础之日志

这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

(一) 什么是日志框架

  1. 在系统开发过程中会将一些关键信息输出,用于测试或者异常问题的回溯.
  2. 随着输出的信息越来越多,信息的表现形式也各式各样,因此抽离并整合出了日志框架,表现形式上就是jar包
  3. 市面上常见的日志框架: Java Util Logging ,Apache Commons Logging,slf4j,log4j,log4j2,logback
  4. 日志框架各种各样,但是总体就分为两类: 日志门面日志实现 ,就像传话的领导干活的码农

(1)日志门面和日志实现对比

  1. 日志门面是一种规范,只定义了输入的规范,不提供具体的输出功能,不可以单独使用
  2. 日志实现则是真正的实现了输出功能,它们也有自己的输入规范.理论上可以单独使用而不需要日志门面
  3. 实际上我们总会把日志门面日志实现组合起来使用.这是因为每个日志实现都有自己的输入规范,一旦需求变动或者功能迁移,那样管理日志输出配置或者日志转换就会冗杂其他.
    就像:原来,我有了问题我直接找领导,领导再去安排具体干活的人; 现在,我直接找对应的人, 但是项目变动了,我需要同时找多个人,但是这几个人思维逻辑和处理方式都不一样,在这种情况下就必要花费更多的经历来沟通,实际上我们承担了领导的这个职责.
  4. Apache Commons Logging,slf4j就是 日志门面 , Java Util Logging ,log4j,log4j2,logback 就是日志实现.

(二)日志框架的使用

对于SpringBoot来说,默认使用的日志门面Apache Commons Logging,默认使用的日志实现logbac, 但是我们常用的组合方式则是slfj4+logbackslfj4+log4j2

(1) slfj4的使用

  1. 导入slf4j-api.jar
  2. 在代码中使用日志
    1). 官方推荐方式
1
2
ini复制代码//在class类中使用, XXX代表的是当前类的类名.
Logger logger = LoggerFactory.getLogger(XXX.class);

2). 不推荐的方式

1
ini复制代码Logger logger = LoggerFactory.getLogger(this.getClass());
  1. 如果使用了lombok,推荐的方式则是直接在类上注解@Slf4j

(2) logback的使用

  1. SpringBoot中支持的logback配置有两种:logback.xmllogback-spring.xml
    logback.xmllogback-spring.xml都可以用来配置logback,但是2者的加载顺序是不一样的.

logback.xml—>application.yml—>logback-spring.xml

logback.xml加载早于application.yml,所以如果你需要使用application.yml中的变量,则需要使用logback-spring.xml这种方式.

  1. logback-spring.xml配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
xml复制代码<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">

<!--定义日志文件的存储地址 尽量不要在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="${LOG_PATH:-.}" />

<!--控制台日志, 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%msg:日志消息,%n是换行符-->
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>


<appender name="FILE_ROLL" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 追加日志到原文件结尾 -->
<Prudent>true</Prudent>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名 每小时生成日志文件-->
<FileNamePattern>${LOG_HOME}/%d{yy-MM-dd}/asdfsdafasdf.%d{yyyy-MM-dd-HH}.%i.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 除按日志记录之外,还配置了日志文件不能超过10M(默认),若超过10M,日志文件会以索引0开始, -->
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %method 方法名 %L 行数 %msg:日志消息,%n是换行符-->
<pattern> %d{HH:mm:ss.SSS} [%thread] %-5level %logger{56}.%method:%L - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
</appender>

<!-- 异步输出 -->
<appender name="ASYNC_FILE_ROLL" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>256</queueSize>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="FILE_ROLL"/>
</appender>


<!--指定某些类只输出某种级别-->
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<logger name="org.apache.http" level="WARN"/>
<logger name="ch.qos.logback" level="WARN"/>
<logger name="o.s.c.annotation" level="INFO"/>
<logger name="org.springframework.jndi" level="INFO"/>

<!-- 日志输出级别 -->
<root level="debug">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ASYNC_FILE_ROLL"/>
</root>

</configuration>

在此处使用了变量${LOG_PATH:-.} ,该变量从application.yml中定义

1
2
3
yaml复制代码logging:
file:
path: ./logs/

因此如果日志有分环境需求,则可以使用logback-spring.xml的方式,然后变量在application-XXX.yml中定义.

1
2
3
4
arduino复制代码    作者:ZOUZDC
链接:https://juejin.cn/post/7028963866063306760
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%