logback 3个首要组件:
记录器(loggers)、
输出源(Appenders)、
布局器(Layouts)
日志配置
根节点
<configuration>
scan: true :配置文件改变时会被重新加载。
scanPeriod: 检测配置文件是否被修改,默认毫秒,scan为true时默认启动,间隔1分钟。
debug: true时将打印logback内部日志信息,默认false。
上下文名称
<contextName>
默认为"default",用于区分不用应用程序的记录。设置后不能修改。
设置变量<property>
带有两个属性,
name(变量名)和
value(值),可以用"$()"来引用变量。
获取时间戳字符串 <timestamp>
key:timestamp的名字,datePattern:设置时间转换字符串格式,遵循java.txt.SimpleDateFormat的格式。
<loger>
loger可包含多个<appender-ref>代表这个
appender将会添加入这个loger。
name: 指定受此loger约束的某个包或具体一个类。
level: 设置打印级别,未设置则继承上级,
TRACE,DEBUG,INFO,WARN,ERROR,ALL,OFF (不区分大小写),还有INHERITED或者NULL,代表强制执行上级级别。
additivty: 是否向上级传递打印消息,默认true。
<root>
实际上就是是根root的
loger元素,只有一个level属性,设置打印级别,默认DEBUG,同理拥有<appender-ref>。
<appender>
<configuration>的子节点,负责写日志的组件,属性有name:指定appender的名称,class:指定权限定名。
ConsoleAppender把日志添加到控制台,节点:
<encoder>: 对日志进行格式化
<target> : System.out或者System.err,默认out。
FileAppender 把日志添加到文件中,节点:
<file> :写入文件名,可以是相对或决定路径,上级目录不存在会自动创建。
<append> : true 日志以追加的形势存储;false 日志以清空显存文件存储。
<encoder> : 格式化输出
<prudent> : true,日志会被安全的写入,效率低,默认false。
RollingFileAppend 滚动记录文件,满足条件后会更换记录的文件,节点:
<file>
同上
<append>
同上
<encoder>
同上
<rollingPolicy>
滚动时,决定行为,包括文件移动和重命名。
<triggeringPolicy>
何时激活滚动。
<prudent>
true 不支持FixedWindowRollingPolicy,支持TimeBasedRollingPolicy,会有两个限制,不支持也不允许文件压缩;不能设置file属性,必须留空。
rollingPolicy:
TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。有以下子节点:
<fileNamePattern>:
必要节点,包含文件名及“%d”转换符, “%d”可以包含一个
java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。如果直接使用 %d,默认格式是 yyyy-MM-dd。
RollingFileAppender 的file字节点可有可无,通过设置file,可以为活动文件和归档文件指定不同位置,当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会 改变;如果没设置file,活动文件的名字会根据fileNamePattern 的值,每隔一段时间改变一次。“/”或者“\”会被当做目录分隔符。
<maxHistory>:
可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且<maxHistory>是6,则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧 文件是,那些为了归档而创建的目录也会被删除。
FixedWindowRollingPolicy: 根据固定窗口算法重命名文件的滚动策略。有以下子节点:
<minIndex>:窗口索引最小值
<maxIndex>:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12。
<fileNamePattern >:
必须包含“%i”例如,假设最小值和最大值分别为1和2,命名模式为 mylog%i.log,会产生归档文件mylog1.log和mylog2.log。还可以指定文件压缩选项,例如,mylog%i.log.gz 或者 没有 log%i.log.zip
triggeringPolicy:
SizeBasedTriggeringPolicy: 查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender 触发当前活动文件滚动。只有一个节点:
<maxFileSize>:这是活动文件的大小,默认值是10MB。
<filter>
:
过滤器,过滤器会根据你设定的返回枚举对日志进行不同的处理,添加入<appender>的过滤器会按照配置顺序执行。
DENY: 抛弃该日志,不再处理。
NEUTRAL : 由列表里的下一个过滤器处理。
ACCEPT : 处理该日志,不再过其他过滤器。
LevelFilter : 级别过滤器,根据日志级别进行过滤,子节点:
<level>: 设置过滤级别。
<onMatch>: 用于配置符合过滤条件的操作。
<onMismatch>: 配置不符合过滤条件的操作。
ThresholdFilter
: 临界值过滤器,子节点:
<level>: 高于该级别返回NEUTRAL,低的直接拒接。
EvaluatorFilter
: 求值过滤器,鉴别是否符合指定要求。子节点:
<onMatch>:
用于配置符合过滤条件的操作。
<onMismatch>: 配置不符合过滤条件的操作。
<evaluator> : 鉴别器,常用的是JaninoEventEvaluato,默认鉴别器,以布尔值表达式做求值条件,
<matcher> 匹配器,
<expression>配置求值条件
Name
|
Type
|
Description
|
event
|
LoggingEvent
|
与记录请求相关联的原始记录事件,下面所有变量都来自event,例如,event.getMessage()返回下面"message"相同的字符串
|
message
|
String
|
日志的原始消息,例如,设有logger mylogger,"name"的值是"AUB",对于 mylogger.info("Hello {}",name); "Hello {}"就是原始消息。
|
formatedMessage
|
String
|
日志被各式话的消息,例如,设有logger mylogger,"name"的值是"AUB",对于 mylogger.info("Hello {}",name); "Hello Aub"就是格式化后的消息。
|
logger
|
String
|
logger 名。
|
loggerContext
|
日志所属的logger上下文。
| |
level
|
int
|
级别对应的整数值,所以
level > INFO
是正确的表达式。
|
timeStamp
|
long
|
创建日志的时间戳。
|
marker
|
Marker
|
与日志请求相关联的Marker对象,注意“Marker”有可能为null,所以你要确保它不能是null。
|
mdc
|
Map
|
包含创建日志期间的MDC所有值得map。访问方法是:
mdc.get("myKey")
。mdc.get()返回的是Object不是String,要想调用String的方法就要强转,例如,
((String) mdc.get("k")).contains("val")
.MDC可能为null,调用时注意。
|
throwable
|
java.lang.Throwable
|
如果没有异常与日志关联"throwable" 变量为 null. 不幸的是, "throwable" 不能被序列化。在远程系统上永远为null,对于与位置无关的表达式请使用下面的变量
throwableProxy
|
throwableProxy
|
与日志事件关联的异常代理。如果没有异常与日志事件关联,则变量"throwableProxy" 为 null. 当异常被关联到日志事件时,"throwableProxy" 在远程系统上不会为null
|
<encoder>:
负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。
目前PatternLayoutEncoder 是唯一有用的且默认的encoder ,有一个<pattern>节点,用来设置日志的输入格式。使用“%”加“转换符”方式,如果要输出“%”,则必须用“\”对“\%”进行转义。
例如:
- <encoder>
- <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
- </encoder
<pattern>里面的转换符说明:
转换符
|
作用
| ||||||||||||||||||||||||
c
{
length
}
lo
{
length
}
logger
{
length
}
|
输出日志的logger名,可有一个整形参数,功能是缩短logger名,设置为0表示只输入logger最右边点符号之后的字符串。
| ||||||||||||||||||||||||
C
{
length
}
class
{
length
}
|
输出执行记录请求的调用者的全限定名。参数与上面的一样。尽量避免使用,除非执行速度不造成任何问题。
| ||||||||||||||||||||||||
contextName
cn
|
输出上下文名称。
| ||||||||||||||||||||||||
d
{
pattern
}
date
{
pattern
}
|
输出日志的打印日志,模式语法与
java.text.SimpleDateFormat
兼容。
| ||||||||||||||||||||||||
F / file
|
输出执行记录请求的java源文件名。尽量避免使用,除非执行速度不造成任何问题。
| ||||||||||||||||||||||||
caller{depth}caller{depth, evaluator-1, ... evaluator-n}
|
输出生成日志的调用者的位置信息,整数选项表示输出信息深度。
例如, %caller{2} 输出为:
0 [main] DEBUG - logging statement
Caller+0 at mainPackage.sub.sample.Bar.sampleMethodName(Bar.java:22)
Caller+1 at mainPackage.sub.sample.Bar.createLoggingRequest(Bar.java:17)
例如, %caller{3} 输出为:
16 [main] DEBUG - logging statement
Caller+0 at mainPackage.sub.sample.Bar.sampleMethodName(Bar.java:22)
Caller+1 at mainPackage.sub.sample.Bar.createLoggingRequest(Bar.java:17)
Caller+2 at mainPackage.ConfigTester.main(ConfigTester.java:38)
| ||||||||||||||||||||||||
L / line
|
输出执行日志请求的行号。尽量避免使用,除非执行速度不造成任何问题。
| ||||||||||||||||||||||||
m / msg / message
|
输出应用程序提供的信息。
| ||||||||||||||||||||||||
M / method
|
输出执行日志请求的方法名。尽量避免使用,除非执行速度不造成任何问题。
| ||||||||||||||||||||||||
n
|
输出平台先关的分行符“\n”或者“\r\n”。
| ||||||||||||||||||||||||
p / le / level
|
输出日志级别。
| ||||||||||||||||||||||||
r / relative
|
输出从程序启动到创建日志记录的时间,单位是毫秒
| ||||||||||||||||||||||||
t / thread
|
输出产生日志的线程名。
| ||||||||||||||||||||||||
replace(p ){r, t}
|
p 为日志内容,r 是正则表达式,将p 中符合r 的内容替换为t 。
例如, "%replace(%msg){'\s', ''}"
|
格式修饰符,与转换符共同使用:
可选的格式修饰符位于“%”和转换符之间。
第一个可选修饰符是左对齐 标志,符号是减号“-”;接着是可选的最小宽度 修饰符,用十进制数表示。如果字符小于最小宽度,则左填充或右填充,默认是左填充(即右对齐),填充符为空格。如果字符大于最小宽度,字符永远不会被截断。最大宽度 修饰符,符号是点号"."后面加十进制数。如果字符大于最大宽度,则从前面截断。点符号“.”后面加减号“-”在加数字,表示从尾部截断。
例如:%-4relative 表示,将输出从程序启动到创建日志记录的时间 进行左对齐 且最小宽度为4。
log4j pattern设置
参数
|
说明
|
例子
| |
%c
|
列出logger名字空间的全称,如果加上{<层数>}表示列出从最内层算起的指定层数的名字空间
|
log4j配置文件参数举例
|
输出显示媒介
|
假设当前logger名字空间是"a.b.c"
| |||
%c
|
a.b.c
| ||
%c{2}
|
b.c
| ||
%20c
|
(若名字空间长度小于20,则左边用空格填充)
| ||
%-20c
|
(若名字空间长度小于20,则右边用空格填充)
| ||
%.30c
|
(若名字空间长度超过30,截去多余字符)
| ||
%20.30c
|
(若名字空间长度小于20,则左边用空格填充;若名字空间长度超过30,截去多余字符)
| ||
%-20.30c
|
(若名字空间长度小于20,则右边用空格填充;若名字空间长度超过30,截去多余字符)
| ||
%C
|
列出调用logger的类的全名(包含包路径)
|
假设当前类是"org.apache.xyz.SomeClass"
| |
%C
|
org.apache.xyz.SomeClass
| ||
%C{1}
|
SomeClass
| ||
%d
|
显示日志记录时间,{<日期格式>}使用ISO8601定义的日期格式
|
%d{yyyy/MM/dd HH:mm:ss,SSS}
|
2005/10/12 22:23:30,117
|
%d{ABSOLUTE}
|
22:23:30,117
| ||
%d{DATE}
|
12 Oct 2005 22:23:30,117
| ||
%d{ISO8601}
|
2005-10-12 22:23:30,117
| ||
%F
|
显示调用logger的源文件名
|
%F
|
MyClass.java
|
%l
|
输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数
|
%l
|
MyClass.main(MyClass.java:129)
|
%L
|
显示调用logger的代码行
|
%L
|
129
|
%m
|
显示输出消息
|
%m
|
This is a message for debug.
|
%M
|
显示调用logger的方法名
|
%M
|
main
|
%n
|
当前平台下的换行符
|
%n
|
Windows平台下表示rn
UNIX平台下表示n
|
%p
|
显示该条日志的优先级
|
%p
|
INFO
|
%r
|
显示从程序启动时到记录该条日志时已经经过的毫秒数
|
%r
|
1215
|
%t
|
输出产生该日志事件的线程名
|
%t
|
MyClass
|
%x
|
按NDC(Nested Diagnostic Context,线程堆栈)顺序输出日志
|
假设某程序调用顺序是MyApp调用com.foo.Bar
| |
%c %x - %m%n
|
MyApp - Call com.foo.Bar.
com.foo.Bar - Log in Bar
MyApp - Return to MyApp.
| ||
%X
|
按MDC(Mapped Diagnostic Context,线程映射表)输出日志。通常用于多个客户端连接同一台服务器,方便服务器区分是那个客户端访问留下来的日志。
|
%X{5}
|
(记录代号为5的客户端的日志)
|
%%
|
显示一个百分号
|
%%
|
%
|