26 Seven 2017
前言
之前项目一直使用 logback ,现在大概写下了 logback 基础配置。
简介
LogBack
是一个日志框架,它是Log4j作者Ceki的又一个日志组件。
LogBack,Slf4j,Log4j
之间的关系
slf4j是The Simple Logging Facade for Java的简称,是一个简单日志门面抽象框架,它本身只提供了日志Facade API和一个简单的日志类实现,一般常配合Log4j
,LogBack
,java.util.logging
使用。Slf4j作为应用层的Log接入时,程序可以根据实际应用场景动态调整底层的日志实现框架(Log4j/LogBack/JdkLog…);
LogBack和Log4j都是开源日记工具库,LogBack是Log4j的改良版本,比Log4j拥有更多的特性,同时也带来很大性能提升。
LogBack官方建议配合Slf4j使用,这样可以灵活地替换底层日志框架。
LogBack的结构
LogBack分为3个组件,logback-core, logback-classic 和 logback-access。
其中logback-core提供了LogBack的核心功能,是另外两个组件的基础。
logback-classic则实现了Slf4j的API,所以当想配合Slf4j使用时,则需要引入这个包。
logback-access是为了集成Servlet环境而准备的,可提供HTTP-access的日志接口。
Log的行为级别:
OFF、
FATAL、
ERROR、
WARN、
INFO、
DEBUG、
ALL
从下向上,当选择了其中一个级别,则该级别向下的行为是不会被打印出来。
举个例子,当选择了INFO级别,则INFO以下的行为则不会被打印出来。
获取 Logger 对象
我们先从获取 logger 对象开始
LoggerFactory 是 slf4j 的日志工厂,获取 logger 方法就来自这里。
这个方法里面有分为两个过程。第一个过程是获取ILoggerFactory,就是真正的日志工厂。第二个过程就是从真正的日志工厂中获取logger。
接下来我们看下到底是怎么获取的
接下来我们来看下是怎么加载 StaticLoggerBinder.class 文件的
|
|
加载 StaticLoggerBinder.class
当项目中存在多个StaticLoggerBinder.class文件时,运行项目会出现以下日志:
(这里获取的规则就近原则,如果在 maven 先配置 slf4j 而后面在配置 logback,则这里初始化的是 slf4j)
返回实例
LogBack 配置
|
|
上面就是一个常用的日志配置模版,下面就从跟节点来解析每个节点
1.configuration
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod:监测配置文件是否有修改的时间间隔,默认 60s。
debug:是否打印 logback 内部日志,默认 false.
2.contextName 项目名称
logger 上下文容器名称,默认 ‘default’,用于区分不同应用程序的记录。(可以在日志输出的时候将项目名称打印处理方便系统间交互 比如上面配置的 %cn
)
3.property 设置变量
定义变量后,可以使${}
来使用变量。
4.timestamp 设置时间戳格式
key:标识此
5.logger
用来设置某一个包或者具体的某一个类的日志打印级别、以及指定
name: 用来指定受此loger约束的某一个包或者具体的某一个类。
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前loger将会继承上级的级别。
addtivity:是否向上级loger传递打印信息。默认是true。
loger可以包含零个或多个appender-ref元素,标识这个appender将会添加到这个loger。
6.root
也是 loger 元素,但是它是根 loger。只有一个 level 属性,应为已经被命名为 “root”
.
root 可以包含零个或多个 appender-ref 元素,标识这个 appender 将会添加到这个 loger。
什么是 Appender?
logback 将日志记录事件写入到名为 appender 的组件的任务,不同 appender 决定了日志的记录方式。
appender 有多种实现的方式,下面简单介绍几种比较常用的配置。 更多详情请参考官方文档
ConsoleAppender
把日志添加到控制台,有以下子节点:
encoder:对日志进行格式化
target:字符串 System.out 或者 System.err ,默认 System.out;
withJansi:日志彩色输出
例如
RollingFileAppender
滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。
file:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
append:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
encoder:对记录事件进行格式化。
rollingPolicy:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。
triggeringPolicy:告知 RollingFileAppender 合适激活滚动。
prudent:当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制,1不支持也不允许文件压缩,2不能设置file属性,必须留空。
rollingPolicy 有两种类型,分别是 TimeBasedRollingPolicy,FixedWindowRollingPolicy。
例如 TimeBasedRollingPolicy 配置
fileNamePattern 定义了日志的切分方式——把每一天的日志归档到一个文件中
maxHistory 表示只保留最近30天的日志,以防止日志填满整个磁盘空间。
totalSizeCap 用来指定日志文件的上限大小,例如设置为1GB的话,那么到了这个值,就会删除旧的日志。
例如 FixedWindowRollingPolicy 配置
这里多了一个 SizeBasedTriggeringPolicy 触发机制,但 log 文件大于 10MB 的时候,就开始执行 rolling。
minIndex 和 maxIndex 表示保存日志数量,但大于 maxIndex 的时候,会开始删除旧的日志。
必须包含“%i”例如,假设最小值和最大值分别为1和2,命名模式为
mylog%i.log,会产生归档文件mylog1.log和mylog2.log。还可以指定文件压缩选项,例如,mylog%i.log.gz
或者 没有log%i.log.zip
AsyncAppender 异步输出
这里就不写了,可以参考文章。
总结
由于没有深入去了解 logback ,许多内容都是网上摘来的,写文章的时候也很费劲。思路不清晰。