SpringBoot基础之日志(springboot日志配置及输出)
(一) 什么是日志框架
在系统开发过程中会将一些关键信息输出,用于测试或者异常问题的回溯.
随着输出的信息越来越多,信息的表现形式也各式各样,因此抽离并整合出了日志框架,表现形式上就是jar包
市面上常见的日志框架:
Java Util Logging
,Apache Commons Logging
,slf4j
,log4j
,log4j2
,logback
日志框架各种各样,但是总体就分为两类:
日志门面
和日志实现
,就像传话的领导
和干活的码农
(1)日志门面和日志实现对比
日志门面
是一种规范,只定义了输入的规范,不提供具体的输出功能,不可以单独使用日志实现
则是真正的实现了输出功能,它们也有自己的输入规范.理论上可以单独使用而不需要日志门面
实际上我们总会把
日志门面
和日志实现
组合起来使用.这是因为每个日志实现
都有自己的输入规范,一旦需求变动或者功能迁移,那样管理日志输出配置或者日志转换就会冗杂其他.
就像:原来,我有了问题我直接找领导,领导再去安排具体干活的人; 现在,我直接找对应的人, 但是项目变动了,我需要同时找多个人,但是这几个人思维逻辑和处理方式都不一样,在这种情况下就必要花费更多的经历来沟通,实际上我们承担了领导的这个职责.
Apache Commons Logging
,slf4j
就是日志门面
,Java Util Logging
,log4j
,log4j2
,logback
就是日志实现.
(二)日志框架的使用
对于SpringBoot来说,默认使用的日志门面
是Apache Commons Logging
,默认使用的日志实现
是logbac
, 但是我们常用的组合方式则是slfj4
+logback
或 slfj4
+log4j2
(1) slfj4的使用
导入
slf4j-api.jar
包在代码中使用日志
1). 官方推荐方式
//在class类中使用, XXX代表的是当前类的类名. Logger logger = LoggerFactory.getLogger(XXX.class);复制代码
2). 不推荐的方式
Logger logger = LoggerFactory.getLogger(this.getClass());复制代码
如果使用了lombok,推荐的方式则是直接在类上注解
@Slf4j
(2) logback的使用
SpringBoot中支持的logback配置有两种:
logback.xml
和logback-spring.xml
logback.xml
和logback-spring.xml
都可以用来配置logback,但是2者的加载顺序是不一样的.
logback.xml
--->application.yml
--->logback-spring.xml
logback.xml
加载早于application.yml
,所以如果你需要使用application.yml
中的变量,则需要使用logback-spring.xml
这种方式.
logback-spring.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> <!--指定某些类只输出某种级别--> <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="FILE_ROLL"/> </root> </configuration>复制代码
在此处使用了变量${LOG_PATH:-.}
,该变量从application.yml
中定义
logging: file: path: ./logs/复制代码
因此如果日志有分环境需求,则可以使用logback-spring.xml
的方式,然后变量在application-XXX.yml
中定义.
作者:ZOUZDC
链接:https://juejin.cn/post/7028963866063306760