logback.xml 文件
主要有:日志的记录器(Longger-标签)、日志输出配置(Appender-标签)
一、日志记录器
主要是我们在代码中,通过注入日志记录器对象,然后打印log
比如: 日志记录器A.info(“xx”) 日志记录器B.error(“xxx”)
二、日志输出配置
指定日志输出到哪里去,日志记录器标签有一个重要的功能就是绑定【日志输出配置】,就是在logback.xml中配置【日志记录器】和【日志输出配置】的绑定关系。
日志输出配置的作用
1、用来配置日志输出的目的地,目的地可以是控制台、文件、远程套接字服务器、数据库等
2、日志输出配置标签下面有个【layout】标签,第一个是负责把事件转换成字符串,第二个是指定日志的输出格式等
三、Logback.xml文件中主要用到的标签
- property:定义属性变量
- appender:日志输出的目的地
- root:根日志对象,设置日志的级别
- Layouts(日志输出格式)
四、案例1
1、定义日志记录器BUSILOGGER
2、分别记录到【控制台】和【日志文件】中去
3、日志文件使用异步方式
<!--1、定义日志记录器 BUSILOGGER-->
<logger name="BUSILOGGER" additivity="false">
<level value="${LOGLEVEL}"/>
<appender-ref ref="ASYNC_SYSFILE"/>
<appender-ref ref="STDOUT"/>
</logger>
<!--2、打印到控制台-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="cn.com.xx.component.logback.encoder.PatternLayoutEncoder">
</encoder>
</appender>
<!--3、打印到日志文件-->
<appender name="SYSFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>../logs/${APPID}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>../logs/backup/${APPID}-%d{yyyy-MM-dd}.zip</FileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder class="cn.com.xx.component.logback.encoder.PatternLayoutEncoder">
</encoder>
<append>true</append>
</appender>
<!--打印到日志文件,使用异步打印-->
<appender name="ASYNC_SYSFILE" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>512</queueSize>
<includeCallerData>true</includeCallerData>
<appender-ref ref="SYSFILE"/>
</appender>
五、案例1解释
1、ConsoleAppender
描述:将日志输出到控制台,默认使用System.out,其中表示对日志进行格式化
例如:把>=DEBUG级别的日志都输出到控制台
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration>
2、RollingFileAppender
将日志滚动的输出到磁盘文件,当满足一定的条件(如文件达到了指定的大小,达到了指定的时间)后,就重命名原日志文件进行归档,并生成新的日志文件用于log写入。如果还设置了一定时间内允许归档的日志文件的最大数量,将对过旧的日志文件进行删除操作。
RollingFile实现日志文件滚动更新,依赖于TriggeringPolicy和RolloverStrategy
1、triggeringPolicy决定是否应该执行rollover的操作,
2、RolloverStrategy定义了应该如何完成rollover。如果RolloverStrategy没有配置的话,RollingFileAppender将使用DefaultRolloverStrategy
TriggeringPolicy有多种触发策略,下面几种用的最多
- TimeBasedTriggeringPolicy指定了基于时间的触发策略。
- SizeBasedTriggeringPolicy指定了基于文件大小的触发策略
3、AsyncAppender
异步记录日志,支持设置如下参数
- queueSize(阻塞队列最大容量)
- discardingThreshold(丢弃阈值)
- neverBlock
注意:虽然logback推荐使用AsyncAppender,但在使用的时候注意会有性能上的问题
六、案例2
1、定义日志输出配置:MONLOGGER
2、定义日志记录器,通过该记录器绑定日志输出配置
日志输出器
<logger name="MONLOGGER" additivity="false">
<level value="${LOGLEVEL}"/>
<appender-ref ref="ASYNC_MONLOGGER"/> 绑定日志输出配置
</logger>
日志输出配置
<appender name="ASYNC_MONLOGGER" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>512</queueSize>
<includeCallerData>true</includeCallerData>
<appender-ref ref="MONLOGGER"/> 关联【引用】,也是一个日志输出配置
</appender>
日志输出配置
<appender name="MONLOGGER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>../logs/${APPID}-monitor.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>../logs/backup/${APPID}.log.%d{yyyy-MM-dd}-monitor.zip</FileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="cn.com.xx.component.logback.xxxPatternLayout">
<Pattern>%msg%n</Pattern>
</layout>
</encoder>
<append>true</append>
</appender>
3、代码中使用
那么在代码中,我们只需要通过下面代码就可以拿到logback.xml配置的MONLOGGER日志记录器
private static final Logger BUSILOG = LoggerFactory.getLogger("BUSILOGGER");
然后再通过BUSILOG.info …来进行打印日志。
4、下面详细介绍下案例中xml的配置及其作用
<logger name="MONLOGGER" additivity="false">
<level value="${LOGLEVEL}"/>
<appender-ref ref="ASYNC_MONLOGGER"/>
</logger>
<root level="${LOGLEVEL}">
<appender-ref ref="ASYNC_SYSFILE"/>
<appender-ref ref="STDOUT"/>
</root>
也可以等价于下面这种写法
<logger name="MONLOGGER" additivity="false">
<appender-ref ref="ASYNC_SYSFILE"/>
<appender-ref ref="STDOUT"/>
<appender-ref ref="ASYNC_MONLOGGER"/>
</logger>
appender-ref标签表示引用了哪个日志输出配置
输出配置
<appender name="ASYNC_MONLOGGER" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>512</queueSize>
<includeCallerData>true</includeCallerData>
<appender-ref ref="MONLOGGER"/>
</appender>
1、class=AsyncAppender表示异步打印日志
2、appender标签有两个必要属性name和class。name指定appender名称,class指定appender的全限定名。
3、discardingThreshold 本文设置为0说明永远不会丢弃日志level TRACE, DEBUG or INFO的日志,只要discardingThreshold>0则当队列快满时候level TRACE, DEBUG or INFO的日志就会丢弃掉
4、queueSize是队列大小
5、discardingThreshold:默认,当队列还剩余 20% 的容量时,会丢弃级别为 TRACE, DEBUG 与 INFO 的日志,仅仅只保留 WARN 与 ERROR 级别的日志。想要保留所有的事件,可以设置为 0
6、includeCallerData: 获取调用者的数据相对来说比较昂贵。为了提高性能,默认情况下不会获取调用者的信息。默认情况下,只有像线程名或者 MDC 这种"便宜"的数据会被复制。设置为 true 时,appender会包含调用者的信息
7、maxFlushTime: 根据所引用 appender 队列的深度以及延迟, AsyncAppender 可能会耗费长时间去刷新队列。当 LoggerContext 被停止时,AsyncAppender stop 方法会等待工作线程指定的时间来完成。使用 maxFlushTime 来指定最大的刷新时间,单位为毫秒。在指定时间
8、内没有被处理完的事件将会被丢弃。这个属性的值的含义与 Thread.join(long) 相同
9、neverBlock: 默认为 false,在队列满的时候appender会阻塞,而不是丢弃信息。设置为true,appender不会阻塞你的应用而会将消息丢弃
<appender name="MONLOGGER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>../logs/${APPID}-monitor.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>../logs/backup/${APPID}.log.%d{yyyy-MM-dd}-monitor.zip</FileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="cn.com.xx.component.logback.XxxPatternLayout">
<Pattern>%msg%n</Pattern>
</layout>
</encoder>
<append>true</append>
</appender>
class=RollingFileAppender 表示当满足一定条件(如文件达到了指定的大小,达到了指定的时间)后,就重命名原日志文件进行归档,并生成新的日志文件用于log写入。如果还设置了一定时间内允许归档的日志文件的最大数量,将对过旧的日志文件进行删除操作。
1、<file>:被写入的文件名,可以是相对目录,也可以是绝对目录,上级目录不存在会自动创建
2、<append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
3、<rollingPolicy> 当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。属性class定义具体的滚动策略类,"ch.qos.logback.core.rolling.TimeBasedRollingPolicy"是最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。
4、<fileNamePattern>:必要节点,包含文件名及“%d”转换符,“%d”可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。如果直接使用 %d,默认格式是 yyyy-MM-dd。RollingFileAppender的file字节点可有可无,通过设置file,可以为活动文件和归档文件指定不同位置,当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会改变;如果没设置file,活动文件的名字会根据fileNamePattern 的值,每隔一段时间改变一次。“/”或者“\”会被当做目录分隔符。
5、<maxHistory>:可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且<maxHistory>是6,则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除。"ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"是查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender 触发当前活动文件滚动。只有一个节点:
6、<maxFileSize>:这是活动文件的大小,默认值是10MB。
7、<prudent>:当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制,1不支持也不允许文件压缩,2不能设置file属性,必须留空。
8、<triggeringPolicy >: 告知 RollingFileAppender 合适激活滚动。"ch.qos.logback.core.rolling.FixedWindowRollingPolicy" 根据固定窗口算法重命名文件的滚动策略。
9、<minIndex>:窗口索引最小值
10、<maxIndex>:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12。
11、<fileNamePattern>:必须包含“%i”例如,假设最小值和最大值分别为1和2,命名模式为 mylog%i.log,会产生归档文件mylog1.log和mylog2.log。还可以指定文件压缩选项,例如,mylog%i.log.gz 或者 没有log%i.log.zip
12、<encoder>:对记录事件进行格式化。负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。PatternLayoutEncoder 是唯一有用的且默认的encoder ,有一个<pattern>节点,用来设置日志的输入格式。使用“%”加“转换符”方式,如果要输出“%”,则必须用“\”对“\%”进行转义。
这篇文章写的很细可以参考下:https://blog.csdn.net/p812438109/article/details/105028051