logback基本入门
1. logback的定义
Logback是由log4j创始人设计的另一个开源日志组件,官方网站: http://logback.qos.ch。它当前分为下面下个模块:
logback-core:其它两个模块的基础模块
logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging
logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能
2. 核心概念
configuration: logback配置的根元素,所有的配置都基于此元素内
logger: 日志记录器,命名实体,通过不同命名区分不同的日志记录器,可以传递由 "." 分层的字符串,更加常用的是传递类信息
appender: 日志输出目的,通过appender指定日志的输出目的和输出方式,可以指定输出到控制台、文件、数据库、远程机器等位置
encoder: 日志编码,用户将日志事件转化成可读的信息,典型场景是将日志转化成字符串
layout: 布局,用于指定日志输出的格式,通过一些变量,控制符来控制日志的输出格式
filter: 过滤器,日志和直接输出控制台的区别就是日志可以控制输出内容和输出内容格式,filiter控制哪些日志应该输出,哪些日志不应该输出
root: 每个配置文件有且只有一个,用户指定根logger的配置
3. 常用的logback配置项
configuration
属性:
debug: true / false, 设置true值的时候,第一次启动日志记录的时候,会输出logback的配置信息;
scan: true / false, 设置true值的时候,结合 scanPeriods 来设置扫描配置文件的间隔时间
例如: 30 seconds, 当扫描发现文件发生变动的时候,会将变动应用到下一次的日志记录中;
子元素:
logger, appender, layout, filter, root, timestamp等
logger
属性:
name: string, 指定该logger的名字,通过”."隔开可以制造logger层级关系,例如 x.y 是 x.y.z的父logger,当x.y.z没有配置日志级别的时候,会继承自父logger, 如果additivity没有设置false的话,还会从父logger继承appender
level: TRACE/DEBUG/INFO/WARN/ERROR ALL/OFF, 可以指定日志的级别,低级别会承载高级别日志的输出,而高级别的不会,例如 DEBUG中不过滤会默认输出DEBUG及DEBUG以上日志,ERROR只会输出ERROR,不会输出它以下级别的日志
子元素:
<appender-ref ref="xxx" /> 指向某个输出附加器
appender 日志附加器, 指定当前日志输出渠道,可以到控制台、文件,在J2EE应用中,一般是输出到本地机器file
属性:
name: string, 当前日志输出附加器的标识,在一个configuration中应该是唯一的
class: logback提供的输出附加器类型, 输出到控制台、文件、滚动输出到文件、数据库、远程机器等都有对应的appender提供类
子元素:
encoder, 指定日志事件对象编码类
filter,过滤器,过滤 日志是否需要输出
root logger的特例,在一个logback上下文中只有一个,就是根记录器,所有的记录器都是该记录器的 子孙记录器,等同于 <logger name="root" > 其他的记录器都是 root.xx.xx.xx
属性:
level: 与logger同
子元素:
appender: 与logger同
property 属性值配置
属性:
name:属性名称,用于在配置文件中引用,使用${xx} 方式引用
value:属性值, 占位符的实际代替值
timestamp 获取时间戳
属性:
key:指定的名称,作用同property的key
datePattern: 时间戳格式化成格式,使用java.text.SimpleDateFormat格式化
4. 常用的appender
主要类图,引自logback官网(https://logback.qos.ch/manual/appenders.html):
ConsoleAppender 控制台输出
属性名:encoder:日志事件编码,决定如何转换日志事件
target:可以是System.out, System.err, 默认是System.out
withJansi: 是否支持ANSI颜色显示日志,会稍微占用多一点磁盘空间, 默认是false
FileAppender 文件输出
属性:encoder: 同上
append:true/false, 当检测到设置的文件名存在时候,是否需要追加到文件末尾
true会追加,false会先将原有文件内容清空,默认是true
prudent:严谨模式,即使多个jvm同时指定写入该文件,该启动该模式也能安全地写入文件,
true/false, 默认是false, 实现的原理是利用了排它锁,让其他需要占用资源的线程等待
写入文件的时候,我们经常需要讲日志每个一个文件的名称都唯一,那么可以使用timeStamp获取时间戳来给文件命名保证唯一,适用于应用经常多次运行的情况,如果需要每日自动分割成日志的话, 可以使用下面的RollingFileAppender。
FileAppender生成唯一日志文件名配置:
<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <!-- use the previously created timestamp to create a uniquely named log file --> <file>log-${bySecond}.txt</file> <encoder> <pattern>%logger{35} - %msg%n</pattern> </encoder> </appender>
RollingFileAppender 滚动文件输出
prudent: 同FileAppender
rollingPolicy: 该配置指定当 滚动事件 触发的时候,应该执行哪些操作, 本节后面有详细说明
triggeringPolicy: 该配置指定何时会触发 滚动时间, 本节后面有详细说明
TimeBasedRollingPolicy 基于时间的滚动行为
fileNamePattern: string, 文件命名格式,一般会使用 serverName.%d.log 的形式来按照每天来滚动日志文件,%d默认是 yyyy-MM-dd 格式,按照什么单位滚动,是参照%d格式的,例如 %d{yyyy-MM}会让日志文件按月份滚动,特别的,如果是.gz / .zip 配置该项,那么会将日志文件压缩后保存(深夜进行压缩,如果深夜没有日志工作,一般在00:23 47' 进行)
maxHistory: int,最大日志保留单位,如果 fileNamePattern 配置按照天滚动,这个的单位是天, 如果是月,那这里单位是月,依次类推
totalSizeCap: int,需要maxHistory有配置,配置最大的日志保存量, 例如 5M, 2G 的配置
cleanHistoryOnStart: boolean, 是否在启动的时候清理历史日志,默认是false
样例配置:
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logFile.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- daily rollover --> <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern> <!-- keep 30 days' worth of history capped at 3GB total size --> <maxHistory>30</maxHistory> <totalSizeCap>3GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender>
Size and time based rolling policy 基于时间和大小的滚动行为
这个触发行为和 TimeBasedRollingPolicy 有点像,但是他的属性 fileNamePattern 强制两个参数 %d 和 %i ,多了一个配置参数:maxFileSize, 所以他的配置文件看起来像是这样:
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>mylog.txt</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- rollover daily --> <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern> <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB --> <maxFileSize>100MB</maxFileSize> <maxHistory>60</maxHistory> <totalSizeCap>20GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>%msg%n</pattern> </encoder> </appender>
当时间条件未达到,但是单文件最大大小已经达到的时候,会自动讲%i 从 0 开始叠加滚动,它产生的日志可能是 mylog-2018-08-19-0.txt, mylog-2018-08-19-1.txt, mylog-2018-08-19-2.txt 这样子,其他的和 TimeBasedRollingPolicy 一致;
FixedWindowRollingPolicy 滚动窗口输出
该输出需要和滚动触发配合使用, 属性有:minIndex, maxIndex, fileNamePattern,fileNamePattern需要带上 %i 参数,使得可以生成唯一的文件名, 当达到maxIndex上限之后,文件不会再发生滚动,会一直写入基础日志文件中,它的配置文件看起来就像这样:
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>test.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <fileNamePattern>tests.%i.log.zip</fileNamePattern> <minIndex>1</minIndex> <maxIndex>3</maxIndex> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>5MB</maxFileSize> </triggeringPolicy> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender>
SizeBasedTriggeringPolicy 基于文件大小的触发滚动
属性:maxFileSize:最大文件大小,当日志文件达到该大小后,就会触发滚动事件;
(后续更新)
5. Encoders
6. Layouts
7. Filters