log4j2配置详解之Layouts

  |   0 评论   |   0 浏览

介绍

对输出的日志进行相应的布局,在log4j和logback中Layouts被转化为字符串,log4j2中Layouts返回字节数组。这使得Layouts的结果在更多类型的appender中可用。这意味着需要使用字符集配置大多数布局,以确保字节数组包含正确的值。使用字符集Layouts的根类是org.apache.log .log4j.core.layout。AbstractStringLayout,其中默认为UTF-8。

CSV Layouts

以逗号分隔值(CSV)记录日志,需要Apache Commons CSV 1.4及以上。可以使用CsvParameterLayout 或者CsvLogEventLayout来配置。
示例:

logger.debug("one={}, two={}, three={}", 1, 2, 3);

输出:

0,1441617184044,DEBUG,main,"one=1, two=2, three=3",org.apache.logging.log4j.spi.AbstractLogger,,,,org.apache.logging.log4j.core.layout.CsvLogEventLayoutTest.testLayout(CsvLogEventLayoutTest.java:98),{},[]

GELF Layout

以扩展的日志格式(GELF)显示日志。
示例:

<GelfLayout host="someserver" compressionType="ZLIB" compressionThreshold="1024"/>

输出:

{"version":"1.1","host":"someserver","timestamp":1550739057.906,"level":6,"_thread":"main","_logger":"com.cimu.Log4j2Test","short_message":"log4j2"}

需要引入jackson包,不然会报错。

HTML Layout

以html的形式输出。
示例:

<HtmlLayout charset="UTF-8" />

输出:
imagepng

JSON Layout

以json格式输出。如果配置了complete="true",那么json将以完整的形式输出,模式这个配置的false。compact是否对json进行压缩。
示例:

<JsonLayout />

输出:

{
  "timeMillis" : 1550798980964,
  "thread" : "main",
  "level" : "INFO",
  "loggerName" : "com.cimu.Log4j2Test",
  "message" : "log4j2",
  "endOfBatch" : true,
  "loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger"
}

示例:

<JsonLayout complete="true" compact="true"/>

输出:

{"timeMillis":1550799247113,"thread":"main","level":"INFO","loggerName":"com.cimu.Log4j2Test","message":"log4j2","endOfBatch":true,"loggerFqcn":"org.apache.logging.log4j.spi.AbstractLogger"}

Pattern Layout

使用模板来输出日志。
示例:

<PatternLayout pattern="%-5p [%t]: %m%n"/>

输出:

DEBUG [main]: Message 1

Pattern参数:

模板语法描述
c{precision}或logger{precision}输出发布日志事件的日志记录器的名称,可以指定精度说明符来设置显示内容。如果设置了正数,那么从最右边开始输出配置规则的内容;如果设置了负数,那么从最左边开始删除匹配规则的内容。默认情况下,将打印完整内容。如Logger的名字为org.apache.commons.Foo,配置了%c{1},那么显示Foo。
C{precision}或class{precision}输出日志记录器的类名。可以指定精度说明符来设置显示内容。获取类全路径比较耗性能,谨慎使用。
d{pattern}或date{pattern}输出日志事件的日期。可以在括号里面设置 SimpleDateFormat 支持的语法。如%d{DEFAULT},输出:2012-11-02 14:34:02,123。也可以设置一组大括号,用来设置java.util.TimeZone.getTimeZone支持的时区,如:%d{HH🇲🇲ss}{GMT+0},输出:18:34:02
enc{pattern}{[HTML|XML|JSON|CRLF]}或者encode{pattern}{[HTML|XML|JSON|CRLF]}对特殊的字符进行编码或者转义。如果只设置一个选项,那么默认使用HTML。第二个选项指定使用哪种编码格式。HTML 会把'\r'转为"\r", '\n'转为"\n",会把&, <, >, ", ', /替换为相应的HTML转义符。XML会把&, <, >, ", '替换为XML转义符。JSON会把"转为",\转为\,U+0000 - U+001F转为\u0000 - \u001F。CRLF 会把'\r'转为"\r", '\n'转为 "\n" 。
F或file输出发出日志记录请求的文件名。比较消耗性能,谨慎使用。
highlight{pattern}{style}给日志添加ANSI颜色。示例:%highlight{%d [%t] %-5level: %msg%n%throwable}{FATAL=white, ERROR=red, WARN=blue, INFO=black, DEBUG=green, TRACE=blue};%highlight{%d [%t] %-5level: %msg%n%throwable}{STYLE=Logback}
K{key}或map{key}或MAP{key}如果存在key的话, 输出MapMessage中的条目。
l或location输出生成日志事件的调用者的位置信息。比较消耗性能,谨慎使用。
L或line输出发出日志记录请求的行号。比较消耗性能,谨慎使用。
m{nolookups}{ansi}或msg{nolookups}{ansi}或message{nolookups}{ansi}输出日志内容。示例:{%m}
M或method输出发出日志记录请求的方法名。比较消耗性能,谨慎使用。
n输出平台相关的行分隔符字符。
N或nano输出纳秒。
p|level{level=label, level=label, ...} 或p|level{length=n}或p|level{lowerCase=true|false}输出日志事件的级别。示例:%level{WARN=Warning, DEBUG=Debug, ERROR=Error, TRACE=Trace, INFO=Info}
T或tid或threadId输出生成日志事件的线程的ID。
t或tn或thread或threadName输出生成日志事件的线程的名称。
x或NDC输出线程上下文堆栈。
X{key[,key2...]}或mdc{key[,key2...]}或MDC{key[,key2...]}输出线程上下文映射。
%序列%%输出一个百分号。

RFC5424 Layout

以标准的RFC5424进行日志输出。

Serialized Layout

以java序列进行日志输出。

Syslog Layout

以BSD Syslog进行日志输出。

XML Layout

以xml进行日志输出。
示例:

<XmlLayout />

输出:
imagepng

YAML Layout

以yaml进行日志输出。
示例:

<YamlLayout />

输出:
imagepng

也可以关注我的公众号:程序之声

关注公众号,领取更多资源

本文为博主原创文章,未经博主允许不得转载。