导图社区 SpringBoot日志配置v0.1
v0.1 : SpringBoot默认日志系统logback配置相关的简单描述
编辑于2020-07-18 16:25:51SpringBoot日志配置
参考文章
https://www.cnblogs.com/bigdataZJ/p/springboot-log.html
https://www.jianshu.com/p/1fa12b92d5c4
https://blog.csdn.net/Inke88/article/details/75007649
https://blog.csdn.net/cw_hello1/article/details/51969554
http://logback.qos.ch/manual/configuration.html#syntax
https://www.cnblogs.com/duhuo/p/7376786.html
https://www.cnblogs.com/xrq730/p/8628945.html
http://logback.qos.ch/manual/appenders.html
默认日志系统
LogBack
组成
logback-core
基础构建部分,提供关键通用机制
logback-classic
类似于Log4J,实现了SLF4J
SLF4J:The Simple Logging Facade for Java,即java简单日志门面,是一系列日志接口,作为日志的抽象行为,没有具体实现
logback-access
与servlet容器交互的模块,提供一些与Http访问相关的功能
依赖
<groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId>
spring-boot-starter或者spring-boot-stater-web已经包含了对spring-boot-stater-logging的依赖,如果已经添加了这些包就不用额外添加了
简单使用
class中
private static final Logger LOG = LoggerFactory.getLogger(ClassName.class);...LOG.info(xxxx);
ClassName应该写当前使用日志的类名,便于在日志中定位输出的类;令输出的类是全限定名,但前面的部分为首字母缩写
默认日志级别为INFO
默认输出到控制台
日志输出的元素
时间日期
精确到毫秒
日志级别
ERROR/WARN/INFO/DEBUG/TRACE
进程ID
分隔符
---,标志实际日志开始
线程名
用方括号括起来(可能截断控制台输出)
Logger名
通常使用输出该条日志的代码的类名
日志内容
简单配置
在application.properties/yml中简单配置日志
logging.level
设置日志级别,如TRACE/DEBUG/INFO/WARN/ERROR/FATAL/OFF等
可以使用root和package级别来控制日志级别,如logging.level.root=WARNlogging.level.org.springframework.web=ERRORlogging.level.org.hibernate=DEBUG
附yml配置方式:logging: level: org: hibernate: DEBUG
logging.file
定义日志文件输出的位置,可以是文件名也可以是路径,绝对路径或者相对路径,相对路径是以项目根路径来看
logging.path
定义日志文件输出的路径,与file不同时生效,与file同时使用时仅file会生效,相对路径同样以项目根路径来看
logging.pattern.console
设置输出到控制台的日志样式,如:logging.pattern.console=%clr(%d{yy-MM-dd E HH:mm:ss.SSS}){blue} %clr(%-5p) %clr(${PID}){faint} %clr(---){faint} %clr([%8.15t]){cyan} %clr(%-40.40logger{0}){blue} %clr(:){red} %clr(%m){faint}%n
自己测试的时候配置了console则应用直接无法启动,也无任何日志,很奇怪
logging.pattern.file
设置输出到文件中的格式,基本同console的配置方式
自定义配置
通过配置文件来更详细的定义日志
默认命名规则:logback-spring.xml/ logback-spring.groovy/ logback.xml/ logback.groovy
可以通过application.properties/yml的logging.config=classpath:config-file-name.xml来自定义配置文件名称
具体节点
根节点configration
scan
配置文件发生改变时是否重新加载,默认true
scanPeriod
监测配置文件是否修改的时间间隔,单位默认是毫秒;当scan为true时生效,默认时间间隔为1分钟
debug
是否打印logback内部日志,可以在需要实时查看logback运行状态时使用,默认为false
packagingData
是否输出包信息,默认false;输出包信息在排查异常时有一定作用,可以显示异常行对应类对应的jar包信息(名称+版本),但是计算的代价相对比较昂贵
root节点
用于指定最上层的日志输出级别,最多只有一个root本质上也是logger,在这里代表着所有logger 的上级
level
设置日志输出级别,大小写无关:TRACE/DEBUG/INFO/WARN/ERROR/ALL/OFF,不能设置为INHERITED或NULL。默认DEBUG
可以包含零个或多个<appender-ref>,用于标志这个appender会添加到这个root下
contextName节点
设置上下文名称,一般用于区分不同应用程序的记录,其他地方可以通过%contextName来引用
根据实际需要选择使用,一般不用
property节点
定义变量值,有name和value两个属性,分别对应变量名和变量值,定义后的变量可以插入到logger上下文中,可以使用${propertyName}来使用变量
引用一个变量时如果变量未定义可以为其指定默认值:${propertyName:-defaultName}
property似乎也可以定义scope属性,具体见springProperty节点说明,这里不定义的话默认“local”
appender节点
格式化日志输出节点,有name和class两个属性,class用于指定哪种输出策略,常用的有控制台输出和文件输出等
控制台输出
class对应ch.qos.logback.core.ConsoleAppender
文件输出
class对应ch.qos.logback.core.rolling.RollingFileAppender
指定输出格式
layout
仅提供将event转化成字符串的功能,不能控制将字符串写出到文件(之前是通过java.io.writer来写入文件),也不能整合event到一组中如:ch.qos.logback.classic.PatternLayout
pattern
定义输出格式
%d{HH:mm:ss.SSS}
定义日志输出日期时间的格式
%thread
输出日志的进程名
%-5level
日志级别,并使用5个字符靠左对齐
%logger{36}
日志输出者的名字,类名,长度为36
%msg
日志消息内容
%n
平台换行符
encoder
0.9.19版本后引入,比layout功能更丰富,能按格式进行转化,也可以将数据直接写到文件中,是目前FileAppender及其子类期望使用的类型
encode类型
LayoutWarppingEncoder
在encoder和layout间提供一个桥梁,让encoder也拥有layout的功能,不常用
PatternLayoutEncoder
LayoutWarppingEncoder的子类,常用组件,包含PatternLayout的功能
charset
指定字符编码
对于文件输出
filter
过滤器,过滤掉不需要输出到文件中的某些级别的日志,比如INFO日志和ERROR日志分开存放的时候就需要在INFO日志中过滤掉ERROR级别的日志
分类
ch.qos.logback.classic.filter.LevelFilter
level
指定级别
onMatch
DENY/ACCEPT
定义匹配时的操作
onMismatch
DENY/ACCEPT
定义不匹配时的操作
ch.qos.logback.classic.filter.ThresholdFilter
这两者的区别就在于LevelFilter可以相对更详细的定制,对指定级别设置match/mismatch的操作,而ThresholdFilter则使用起来更直接简单
level
指定级别,小于该级别的全部过滤掉
file
定义日志路径名称,在存在fileNamePattern时当天的日志名是file定义的值,当天过后会改为fileNamePattern的格式
路径可以是相对路径或者绝对路径,fileNamePattern也是如此
rollingPolicy
滚动策略
按时间滚动策略:ch.qos.logback.core.rolling.TimeBasedRollingPolicy
timeBasedFileNamingAndTriggeringPolicy
基于时间的滚动策略
ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP
maxFileSize
单文件最大大小
fileNamePattern
定义文件归档格式,可以在文件名中添加具体的日期信息,比如:${logback.logdir}/info.${logback.appname}.%d{yyyy-MM-dd}.log
maxHistory
指定总体日志文件的数量,超过则删除旧日志
该值与fileNamePattern设定的滚动策略有关,如果按月滚动则这里代表日志保留的月数,如果按天滚动则这里代表日志保留的天数
totalSizeCap
用于控制日志文件的总大小,需要设置maxHistory,且先判断maxHistory再判断totalSizeCap
异步写日志
对应异步appender:AsyncAppender
原理
当LoggingEvent进入AsyncAppender后,会调用appender方法,将event填入Buffer(ArrayBlockingQueue)前,先判断Buffer容量和丢弃日志特性是否开启,当消费能力不如生产能力时对LoggingEvent进行丢弃;在系统启动时会初始化一个名为“AsyncAppender-Worker-ASYNC”的线程从Buffer中获取日志并循环记录到其他Appender上去,从而达到不阻塞主线程的效果
即AsyncAppender仅充当带缓存的事件转发器,引用其他的Appender来记录日志
参数
discardingThreshold
丢弃日志的阈值,默认为queueSize/5,比如设置为20则表示还剩20%容量时丢弃TRACE/DEBUG/INFO级别的日志,只保留WARN/ERROR级别的日志;可以设置为0表示不丢弃任何日志
queueSize
设置BlockingQueue的最大容量,默认256
includeCallerData
是否提取调用者数据,调用者即与event关联的日志调用者,设置为true时代价比较昂贵
appender-ref
表示引用那个appender进行日志输出
logger节点
用于设置具体的日志级别,可以具体到包、类或者appender
name
用于指定约束的具体内容,可以具体到包名或者类名
level
设置日志级别,与大小写无关:TRACE/ DEBUG/ INFO/ WARN/ ERROR/ ALL/ OFF/ INHERITED/ NULL,其中INHERITED/NULL代表强制执行上级的级别。未设置level时当前logger会继承上级的级别
addtivity
是否向上级logger传递打印信息,默认true,即当前logger打印后传递给上级,上级再根据自己设置判断是否需要打印
上级的含义:root是所有logger的上级,logger之间根据包的关系决定上下级关系
可以包含0个或者多个appender-ref
对于logger/root来说,需要绑定appender才能进行日志输出,即logger/root定义日志对象,而appender定义输出方式,二者相互关联。单独定义的logger无法输出任何信息
springProperty节点
定义变量值,与property节点不同的是这里可以配置从spring配置文件中获取的数据
scope
定义变量的作用范围
local
变量仅在配置文件内有效,生命周期从配置文件加载到配置文件失效为止,即每次解析或者执行配置文件时都会重新定义一个新的变量
context
该范围的变量将插入到logger上下文中,并且生命周期与上下文相同,这样在所有日志记录事件中都可以用到这个变量
system
该范围的变量将会插入到JVM系统属性中,生命周期与JVM相同,或者直到其被清除为止
name
属性名
source
对应配置文件(如application.properties/yml)中定义的属性名
springProfile节点
定义对应profile下使用的日志配置,内部可以包含logger等其他节点
name
profile名,多个profile间使用逗号隔开
其他
statusListener节点
定义状态消息监听器,目前自带有用的监听器:OnConsoleStatusListener、OnErrorConsoleStatusListener和NopStatusListener
不是很明白这个的作用
定义方式
xml中
<statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />需要直接定义在<configuration>下的第一行,因为从注册开始监听,忽略之前的内容
java代码
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); StatusManager statusManager = lc.getStatusManager();OnConsoleStatusListener onConsoleListener = new OnConsoleStatusListener();statusManager.add(onConsoleListener);
启动参数
java -Dlogback.statusListenerClass=ch.qos.logback.core.status.OnConsoleStatusListener
条件化语句
<if condition="some conditional expression"> <then> ... </then> <else> ... </else> </if>
如:<if condition='property("HOSTNAME").contains("xxx")'> <then> <appender name="CON"> <encoder> <pattern>%d %-5level %logger{35} - %msg %n</pattern> </encoder> </appender> <root> <appender-ref ref="CON" /> </root> </then> </if>
insertFromJNDI节点
从JNDI加载变量
如:<insertFromJNDI env-entry-name="java:comp/env/appName" as="appName" />之后可以引用这个属性,如:<contextName>${appName}</contextName>
include节点
引入其他配置文件,可以是文件路径、classpath或者URL
如:<include file="src/main/resource/config/includedConfig.xml"/> <root level="DEBUG"> <appender-ref ref="includedConsole" /> </root>
被引入的配置文件中必须含有该格式,包括在其中的内容才可以被引入的配置文件获取:<included> <appender name="includedConsole">...</appender></included>
其他配置
配置web可视化日志
在WEB-INF/web.xml中配置:<servlet> <servlet-name>ViewStatusMessages</servlet-name> <servlet-class>ch.qos.logback.classic.ViewStatusMessagesServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ViewStatusMessages</servlet-name> <url-pattern>/lbClassicStatus</url-pattern> </servlet-mapping>
之后访问地址 http://host/yourWebapp/lbClassicStatus 即可