上一篇中讲解了如何配置Logback,接下来讲解一些其它细节方面的东西。
Logback日志输出格式
先看下最简单的Logback的配置文件:
<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>
这里有一段日志输出格式 %-4relative \[%thread\] %-5level %logger{35} - %msg %n
,里面每个转译字符的含义又是什么呢?
转译字符的含义
先讲解下Logback中各转译字符的含义(以下所有的转译字符前需要使用 % 才生效,否则只是普通的字符串)。
转译字符:c{length}、lo{length}、logger{length}
这三个转译字符具有相同的作用,用于输出logger的名字来作为日志事件的来源,有且仅有一个长度的参数。转换器会依据长度对logger的名字进行简短,但是不会丢失重要的信息。但有一个例外,当length为0时,它只会返回logger名字中最右边的字符信息。举个例子如下:
转换说明符 | logger的名字 | 结果 |
---|---|---|
%logger | com.loewi_xi.demo.logs.ConsoleLog | com.loewi_xi.demo.logs.ConsoleLog |
%logger{0} | com.loewi_xi.demo.logs.ConsoleLog | ConsoleLog |
%logger{10} | com.loewi_xi.demo.logs.ConsoleLog | c.l.d.l.ConsoleLog |
%logger{20} | com.loewi_xi.demo.logs.ConsoleLog | c.l.d.l.ConsoleLog |
%logger{21} | com.loewi_xi.demo.logs.ConsoleLog | c.l.d.logs.ConsoleLog |
%logger{24} | com.loewi_xi.demo.logs.ConsoleLog | c.l.demo.logs.ConsoleLog |
%logger{33} | com.loewi_xi.demo.logs.ConsoleLog | com.loewi_xi.demo.logs.ConsoleLog |
logger名字最右边的部分永远不会被简写,即使名字的长度远大于设置的值。其余部分会被缩短为一个字符,但也永不会被移除
转译字符:C{length}、class{length}
这两个转译字符具有相同的作用,用于输出发出日志请求的类的全限定名称,有且仅有一个长度的参数。转换器对全限定名称的简短规则和 logger 转译字符相似。但需要注意的是:生成调用者类的信息并不是特别快,因此需避免使用。
转译字符:contextName、cn
这两个转译字符具有相同的作用,用于输出logger上下文的名字。
转译字符:d{pattern}、d{pattern, timezone}、date{pattern}、date{pattern, timezone}
这四个转译字符具有相同的作用,用于输出日志事件的日期,有两个参数。第一个参数为日期格式字符串,语法同 SimpleDateFormat
,默认使用ISO860类型的日期格式;第二个参数为时区,默认使用当前主机的时区。
PS:如果日期格式字符串中有使用 ,
,在解析时会被当做分隔符。如果想要使用含 ,
的日期格式字符串的话,则需要用 "
来包裹使用,例如: %date{"yyyy-MM-dd HH:mm:ss,SSS"}
。
转译字符:F、file
这两个转译字符具有相同的作用,用于输出发出日志请求的Java源文件的名字。需要注意的是:生成文件的信息不是特别快,因此需避免使用。
转译字符:caller{depth}、caller{depthStart..depthEnd}、caller{depth, evaluator-1, ... evaluator-n}、caller{depthStart..depthEnd, evaluator-1, ... evaluator-n}
这四个转译字符具有相同的作用,用于生成日志的调用者所在的位置信息。位置信息依赖于JVM的实现,但通常为调用方法的全限定名以及调用者的来源组成。
当接收的参数为整形,则用来展示信息的深度;当接收的参数为一个范围,则用来展示深度在这个范围内的信息。除此之外,还可接收一个evaluator,用来计算调用者数据之前通过指定的标准对日志事件进行测验(关于evaluator不做讨论,自行查阅官网)。
转译字符:L、line
这两个转译字符具有相同的作用,用于输出发出日志请求所在的行号。需要注意的是:生成行号不是特别快,因此需避免使用。
转译字符:m、msg、message
这三个转译字符具有相同的作用,用于输出与日志事件相关联的,由应用程序提供的日志信息。
转译字符:M、method
这两个转译字符具有相同的作用,用于输出发出日志请求的方法名。需要注意的是:生成方法名不是特别快,因此需避免使用。
转译字符:n
用于输出平台所依赖的行分割字符。
转译字符:p、le、level
这三个转译字符具有相同的作用,用于输出日志事件的级别。
转译字符:r、relative
这两个转译字符具有相同的作用,用于输出应用程序启动到创建日志事件所花费的毫秒数。
转译字符:t、thread
这两个转译字符具有相同的作用,用于输出生成日志事件的线程名。
转译字符:X{key:-defaultVal}、mdc{key:-defaultVal}
这两个转译字符具有相同的作用,用于输出生成日志事件的线程MDC。如果传入参数 key,那么 key 所对应MDC的值会被输出,如果值为null,则输出空字符串或指定的默认值。
转译字符:ex{depth}、exception{depth}、throwable{depth}、ex{depth, evaluator-1, ..., evaluator-n}、exception{depth, evaluator-1, ..., evaluator-n}、throwable{depth, evaluator-1, ..., evaluator-n}
这六个转译字符具有相同的作用,用于输出日志事件相关的堆栈信息,默认情况下会输出全部的堆栈信息。
该转译字符可接收参数:
- short:输出堆栈信息的第一行;
- full:输出全部的堆栈信息;
- 任意整形:输出指定行数的堆栈信息。
除此之外,还可接收一个evaluator,用来计算调用者数据之前通过指定的标准对日志事件进行测验(关于evaluator不做讨论,自行查阅官网)。
转译字符:xEx{depth}、xException{depth}、xThrowable{depth}、xEx{depth, evaluator-1, ..., evaluator-n}、xException{depth, evaluator-1, ..., evaluator-n}、xThrowable{depth, evaluator-1, ..., evaluator-n}
这六个转译字符具有相同的作用,功能与 throwable
转译字符相似,只不过多了类的包信息。需要注意的是:计算包信息时潜在的性能损耗。
转译字符:nopex、nopexception
这两个转译字符具有相同的作用,用于忽略异常信息,不进行任何数据的输出。
转译字符:marker
用于输出与日志请求相关的标签。
转译字符:property{key}
用于输出属性 key 所对应的值。
转译字符:replace(p){r, t}
在子模式 'p' 产生的字符中,将所有出现正则表达式 'r' 的地方替换为 't',例如:
%replace(%msg){'\s', ''}
将会移除事件消息中所有空格。
%replace(%logger %msg){'.', '/'}
将会替换logger以及消息中所有的点为斜杆。
转译字符:rEx{depth}、rootException{depth}、rEx{depth, evaluator-1, ..., evaluator-n}、rootException{depth, evaluator-1, ..., evaluator-n}
这四个转译字符具有相同的作用,用于输出与日志事件相关的堆栈信息,根异常将会首先输出,而是标准的"根异常最后输出"。参数与 throwable
转译字符相同。
PS:大多数的情况下,字面量包括空格或其它的分隔符,所以它们不会与转译字符混淆。例如:
%level \[%thread\] - %message%n
包含字面量字符\[
与\] -
。但如果一个转译字符后面紧跟着一个字面量,那么logback的模式解析器会错误的认为这个字面量也是转译字符的一部分。例如:%date %nHello
会被解析成两个转译字符%date
与%nHello
,但%nHello
不是转译字符,所以logback将会输出%PARSER_ERROR\[nHello\]
。如果想要区分%n
跟Hello
,可通过给%n
传递一个空参数。例如:%date %n{}Hello
将会被解析为%date
、%n
再紧跟着一个字符串Hello
。
格式修改器
当设置好日志格式进行输出时,发现相关信息按照原样输出,查阅日志时不是特别方便,此时就需要格式修改器的帮助,调整日志的格式。
日志修改器是可选的,放在 %
和转译字符之间。日志修改器有如下几种:
- 左对齐标志:符号为
-
; - 最小字段宽度修改器:是一个十进制常量,表示输出至少多少个字符。当字段宽度小于字段数据时,自动扩容;反之则自动填充空格。
- 最大字段宽度修改器:通过
.
后面跟一个十进制常量实现。当字段宽度小于字段数据时,从字段的开头移除多余的字符。如果.
后面增加-
,则表示会从字段的尾部截取,丢弃多余的字符。
通过格式修改器,调整成方便阅读的格式吧。
PS:以上内容均参考 Logback中文网
来源:oschina
链接:https://my.oschina.net/flytofree/blog/3170905