Spring Boot日志之Logback(二)—— 日志输出格式

余生颓废 提交于 2020-02-27 23:01:23

上一篇中讲解了如何配置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 转译字符相似。但需要注意的是:生成调用者类的信息并不是特别快,因此需避免使用。

转译字符:contextNamecn

这两个转译字符具有相同的作用,用于输出logger上下文的名字。

转译字符:d{pattern}d{pattern, timezone}date{pattern}date{pattern, timezone}

这四个转译字符具有相同的作用,用于输出日志事件的日期,有两个参数。第一个参数为日期格式字符串,语法同 SimpleDateFormat,默认使用ISO860类型的日期格式;第二个参数为时区,默认使用当前主机的时区。

PS:如果日期格式字符串中有使用 ,,在解析时会被当做分隔符。如果想要使用含 , 的日期格式字符串的话,则需要用 " 来包裹使用,例如: %date{"yyyy-MM-dd HH:mm:ss,SSS"}

转译字符:Ffile

这两个转译字符具有相同的作用,用于输出发出日志请求的Java源文件的名字。需要注意的是:生成文件的信息不是特别快,因此需避免使用。

转译字符:caller{depth}caller{depthStart..depthEnd}caller{depth, evaluator-1, ... evaluator-n}caller{depthStart..depthEnd, evaluator-1, ... evaluator-n}

这四个转译字符具有相同的作用,用于生成日志的调用者所在的位置信息。位置信息依赖于JVM的实现,但通常为调用方法的全限定名以及调用者的来源组成。

当接收的参数为整形,则用来展示信息的深度;当接收的参数为一个范围,则用来展示深度在这个范围内的信息。除此之外,还可接收一个evaluator,用来计算调用者数据之前通过指定的标准对日志事件进行测验(关于evaluator不做讨论,自行查阅官网)。

转译字符:Lline

这两个转译字符具有相同的作用,用于输出发出日志请求所在的行号。需要注意的是:生成行号不是特别快,因此需避免使用。

转译字符:mmsgmessage

这三个转译字符具有相同的作用,用于输出与日志事件相关联的,由应用程序提供的日志信息。

转译字符:Mmethod

这两个转译字符具有相同的作用,用于输出发出日志请求的方法名。需要注意的是:生成方法名不是特别快,因此需避免使用。

转译字符:n

用于输出平台所依赖的行分割字符。

转译字符:plelevel

这三个转译字符具有相同的作用,用于输出日志事件的级别。

转译字符:rrelative

这两个转译字符具有相同的作用,用于输出应用程序启动到创建日志事件所花费的毫秒数。

转译字符:tthread

这两个转译字符具有相同的作用,用于输出生成日志事件的线程名。

转译字符: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 转译字符相似,只不过多了类的包信息。需要注意的是:计算包信息时潜在的性能损耗

转译字符:nopexnopexception

这两个转译字符具有相同的作用,用于忽略异常信息,不进行任何数据的输出。

转译字符: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\]。如果想要区分 %nHello,可通过给 %n 传递一个空参数。例如:%date %n{}Hello 将会被解析为 %date%n 再紧跟着一个字符串 Hello

格式修改器

当设置好日志格式进行输出时,发现相关信息按照原样输出,查阅日志时不是特别方便,此时就需要格式修改器的帮助,调整日志的格式。

日志修改器是可选的,放在 % 和转译字符之间。日志修改器有如下几种:

  • 左对齐标志:符号为 -
  • 最小字段宽度修改器:是一个十进制常量,表示输出至少多少个字符。当字段宽度小于字段数据时,自动扩容;反之则自动填充空格。
  • 最大字段宽度修改器:通过 . 后面跟一个十进制常量实现。当字段宽度小于字段数据时,从字段的开头移除多余的字符。如果 . 后面增加 -,则表示会从字段的尾部截取,丢弃多余的字符。

通过格式修改器,调整成方便阅读的格式吧。

PS:以上内容均参考 Logback中文网

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!