Layouts

Appender 使用布局将 LogEvent 格式化为可以满足消耗日志事件的需求的形式。在 Log4j 1.x 和 Logback Layout 中,应该将事件转换为字符串。在 Log4j 2 中,布局返回一个字节数组。这样可以使布局的结果在更多类型的 Appender 中有用。但是,这意味着您需要使用Charset配置大多数布局,以确保字节数组包含正确的值。

使用字符集的布局的根类是 org.apache.logging.log4j.core.layout.AbstractStringLayout,其中默认值为 UTF-8.扩展 AbstractStringLayout 的每个布局都可以提供其自己的默认值。请参阅下面的每个布局。

Log4j 2.4.1 为 ISO-8859-1 和 US-ASCII 字符集添加了自定义字符编码器,以将 Java 8 内置的一些性能改进引入 Log4j,以便在 Java 7 上使用。对于仅记录日志的应用程序 ISO-8859-1 字符,指定此字符集将大大提高性能。

CSV Layouts

此布局创建逗号分隔值(CSV)条记录,并需要Apache Commons CSV 1.4.

可以通过两种方式使用 CSV 布局:首先,使用 CsvParameterLayout 记录事件参数以创建自定义数据库,通常将其创建到为此目的而专门配置的 Logger 和文件附加器中。其次,使用 CsvLogEventLayout 记录事件以创建数据库,这是使用完整的 DBMS 或使用支持 CSV 格式的 JDBC 驱动程序的替代方法。

CsvParameterLayout 将事件的参数转换为 CSV 记录,而忽略该消息。要记录 CSV 记录,可以使用常用的 Logger 方法 info(),debug()等:

logger.info("Ignored", value1, value2, value3);

这将创建 CSV 记录:

value1, value2, value3

或者,您可以使用仅包含参数的 ObjectArrayMessage:

logger.info(new ObjectArrayMessage(value1, value2, value3));

使用以下参数配置布局 CsvParameterLayout 和 CsvLogEventLayout:

  • CsvParameterLayout 和 CsvLogEventLayout *
Parameter NameTypeDescription
formatStringsched 义格式之一:默认,Excel,MySQL,RFC4180,TDF。参见CSVFormat.Predefined
delimiterCharacter将格式的定界符设置为指定字符。
escapeCharacter将格式的转义字符设置为指定字符。
quoteCharacter将格式的 quoteChar 设置为指定字符。
quoteModeString将格式的输出报价策略设置为指定值。以下之一:ALL,MINIMAL,NON_NUMERIC,NONE。
nullStringString写入记录时,将 null 作为给定的 nullString 写入。
recordSeparatorString将格式的记录分隔符设置为指定的 String。
charsetCharset输出字符集。
header设置要在打开流时包括的 Headers。Desc.
footer设置页脚以包括关闭流时的内容。Desc.

记录为 CSV 事件如下所示:

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

产生包含以下字段的 CSV 记录:

  • Time Nanos

  • Time Millis

  • Level

  • Thread ID

  • Thread Name

  • Thread Priority

  • Formatted Message

  • Logger FQCN

  • Logger Name

  • Marker

  • Thrown Proxy

  • Source

  • Context Map

  • Context Stack

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),{},[]

使用 CSV 布局需要额外的runtime dependencies

GELF Layout

以 Graylog 扩展日志格式(GELF)1.1 布置事件。

如果日志事件数据大于 1024 字节(compressingThreshold),则此布局将 JSON 压缩为 GZIP 或 ZLIB(compressionType)。此布局不实现分块。

进行以下配置,以使用 UDP 发送到 Graylog 2.x 服务器:

<Appenders>
    <Socket name="Graylog" protocol="udp" host="graylog.domain.com" port="12201">
        <GelfLayout host="someserver" compressionType="ZLIB" compressionThreshold="1024"/>
    </Socket>
  </Appenders>

进行以下配置,以使用 TCP 发送到 Graylog 2.x 服务器:

<Appenders>
    <Socket name="Graylog" protocol="tcp" host="graylog.domain.com" port="12201">
        <GelfLayout host="someserver" compressionType="OFF" includeNullDelimiter="true"/>
    </Socket>
  </Appenders>

GelfLayout Parameters

Parameter NameTypeDescription
hostStringhost 属性的值(可选,默认为 localhost 名)。
compressionTypeGZIP,ZLIB 或关闭使用压缩(可选,默认为 GZIP)
compressionThresholdint如果数据大于此字节数,则进行压缩(可选,默认为 1024)
includeStacktraceboolean是否包括已记录的 Throwables 的完整 stacktrace(可选,默认为 true)。如果设置为 false,则仅包含Throwable的类名和消息。
includeThreadContextboolean是否包括线程上下文作为其他字段(可选,默认为 true)。
includeNullDelimiterboolean在每个事件之后是否包括 NULL 字节作为定界符(可选,默认为 false)。对于 Graylog GELF TCPImporting 有用。不能与压缩一起使用。
messagePatternString用于格式化字符串的模式。如果未提供,将仅使用从日志消息派生的文本。有关模式字符串的信息,请参见PatternLayout
threadContextExcludesString逗号分隔的 ThreadContext 属性列表,用于格式化事件时要排除在外。仅当指定 includeThreadContext =“ true”时,此属性才适用。如果还指定 threadContextIncludes,则将忽略此属性。
threadContextIncludesString以逗号分隔的 ThreadContext 属性列表,用于格式化事件。仅当指定 includeThreadContext =“ true”时,此属性才适用。如果还指定 threadContextExcludes,则此属性将覆盖它们。此处指定的没有值的 ThreadContext 字段将被省略。

要在输出中包括任何自定义字段,请使用以下语法:

<GelfLayout includeThreadContext="true" threadContextIncludes="loginId,requestId">
    %d %5p [%t] %c{1} %X{loginId, requestId} - %m%n
    <KeyValuePair key="additionalField1" value="constant value"/>
    <KeyValuePair key="additionalField2" value="$${ctx:key}"/>
  </GelfLayout>

自定义字段包含在声明 Sequences 中。这些值支持lookups

See also:

HTML Layout

HtmlLayout 生成一个 HTML 页面,并将每个 LogEvent 添加到表中的一行。

HtmlLayout Parameters

Parameter NameTypeDescription
charsetString将 HTML 字符串转换为字节数组时使用的字符集。该值必须是有效的Charset。如果未指定,则此布局使用 UTF-8.
contentTypeString分配给 Content-TypeHeaders 的值。默认值为“ text/html”。
locationInfoboolean

如果为 true,则文件名和行号将包含在 HTML 输出中。默认值为 false。
生成location information是一项昂贵的操作,可能会影响性能。请谨慎使用。
titleString将作为 HTML 标题出现的字符串。
fontNameString要使用的字体系列。默认值为“ arial,sans-serif”。
fontSizeString要使用的字体大小。默认值为“小”。

JSON Layout

将一系列 JSON 事件附加为序列化为字节的字符串。

完整的格式 JSON 和片段 JSON

如果您配置 complete =“ true”,则附加程序将输出格式正确的 JSON 文档。默认情况下,使用 complete =“ false”,您应该将输出作为外部文件包含在单独的文件中,以形成格式正确的 JSON 文档。

如果 complete =“ false”,则追加程序不会在文档的开头“]”和结尾处写入 JSON 开放数组字符“ [”,也不会在记录之间写入逗号“,”。

日志事件遵循以下模式:

{
  "instant" : {
    "epochSecond" : 1493121664,
    "nanoOfSecond" : 118000000
  },
  "thread" : "main",
  "level" : "INFO",
  "loggerName" : "HelloWorld",
  "marker" : {
    "name" : "child",
    "parents" : [ {
      "name" : "parent",
      "parents" : [ {
        "name" : "grandparent"
      } ]
    } ]
  },
  "message" : "Hello, world!",
  "thrown" : {
    "commonElementCount" : 0,
    "message" : "error message",
    "name" : "java.lang.RuntimeException",
    "extendedStackTrace" : [ {
      "class" : "logtest.Main",
      "method" : "main",
      "file" : "Main.java",
      "line" : 29,
      "exact" : true,
      "location" : "classes/",
      "version" : "?"
    } ]
  },
  "contextStack" : [ "one", "two" ],
  "endOfBatch" : false,
  "loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger",
  "contextMap" : {
    "bar" : "BAR",
    "foo" : "FOO"
  },
  "threadId" : 1,
  "threadPriority" : 5,
  "source" : {
    "class" : "logtest.Main",
    "method" : "main",
    "file" : "Main.java",
    "line" : 29
  }
}

如果 complete =“ false”,则追加程序不会在文档的开头“]”和结尾处写入 JSON 开放数组字符“ [”,也不会在记录之间写入逗号“,”。

漂亮 vs.紧凑 JSON

compact 属性确定输出是否为“漂亮”。默认值为“ false”,这意味着追加程序使用行尾字符和缩进行来设置文本格式。如果 compact =“ true”,则不使用行尾或缩进,这将导致输出占用更少的空间。当然,消息内容可能包含转义的行尾。

JsonLayout Parameters

Parameter NameTypeDescription
charsetString转换为字节数组时要使用的字符集。该值必须是有效的Charset。如果未指定,将使用 UTF-8.
compactboolean如果为 true,则附加程序不使用行尾和缩进。默认为 false。
eventEolboolean如果为 true,则追加器在每个记录之后追加一个行尾。默认为 false。与 eventEol = true 和 compact = true 一起使用时,每行获得一条记录。
endOfLineString如果设置,则覆盖默认的行尾字符串。例如。将其设置为“\n”,并与 eventEol = true 和 compact = true 一起使用,以每行一个记录,并由“\n”而不是“\r\n”分隔。默认为空(即未设置)。
completeboolean如果为 true,则附加程序包括 JSONHeaders 和页脚以及记录之间的逗号。默认为 false。
propertiesboolean如果为 true,则附加程序将线程上下文 Map 包含在生成的 JSON 中。默认为 false。
propertiesAsListboolean如果为 true,则将线程上下文 Map 作为 Map 条目对象的列表包括在内,其中每个条目都具有“键”属性(其值为键)和“值”属性(其值为值)。默认为 false,在这种情况下,线程上下文 Map 作为键-值对的简单 Map 包含在内。
locationInfoboolean如果为 true,则附加程序将位置信息包含在生成的 JSON 中。默认为 false。

生成location information是一项昂贵的操作,可能会影响性能。请谨慎使用。
includeStacktraceboolean如果为 true,则包括任何已记录的Throwable的完整 stacktrace(可选,默认为 true)。
includeTimeMillisboolean如果为 true,则 timeMillis 属性包含在 Json 有效负载中,而不是包含在即时中。 timeMillis 将包含自 UTC 1970 年 1 月 1 日午夜以来的毫秒数。
stacktraceAsStringboolean是否将 stacktrace 格式化为字符串,而不是嵌套对象(可选,默认为 false)。
includeNullDelimiterboolean是否在每个事件之后包含 NULL 字节作为定界符(可选,默认为 false)。
objectMessageAsJsonObjectboolean如果为 true,则将 ObjectMessage 作为 JSON 对象序列化到输出日志的“ message”字段。默认为 false。

要在输出中包括任何自定义字段,请使用以下语法:

<JsonLayout>
    <KeyValuePair key="additionalField1" value="constant value"/>
    <KeyValuePair key="additionalField2" value="$${ctx:key}"/>
  </JsonLayout>

自定义字段始终按声明的 Sequences 排在最后。这些值支持lookups

使用 JsonLayout 需要额外的runtime dependencies

Pattern Layout

可以使用模式字符串配置的灵活布局。此类的目的是格式化 LogEvent 并返回结果。结果的格式取决于转换模式。

转换模式与 C 中的 printf 函数的转换模式密切相关。转换模式由 Literals 文本和称为转换说明符的格式控制表达式组成。

请注意,转换模式中可以包括任何 Literals 文本,包括 Special Characters 。特殊字符包括 tnrf 。使用 **** 将单个反斜杠插入输出中。

每个转换说明符均以百分号(%)开头,后跟可选的格式修饰符和转换字符。转换字符指定数据类型,例如类别,优先级,日期,线程名称。格式修饰符控制字段宽度,填充,左对齐和右对齐。以下是一个简单的示例。

假设转换模式为 “%-5p [%t]:%m%n” ,并假定 Log4j 环境设置为使用 PatternLayout。然后声明

Logger logger = LogManager.getLogger("MyLogger");
logger.debug("Message 1");
logger.warn("Message 2");

将产生输出

DEBUG [main]: Message 1
WARN  [main]: Message 2

请注意,文本和转换说明符之间没有明确的分隔符。模式分析器在读取转换字符时会知道何时到达转换说明符的末尾。在上面的示例中,转换说明符 %-5p 表示应将记录事件的优先级设置为 5 个字符的宽度。

如果模式字符串不包含用于处理正在记录的 Throwable 的说明符,则模式的解析将如同已将“%xEx”说明符添加到字符串的末尾一样。要完全禁止 Throwable 格式化,只需在模式字符串中添加“%ex{0}”作为说明符。

PatternLayout Parameters

Parameter NameTypeDescription
charsetString将系统日志字符串转换为字节数组时使用的字符集。字符串必须是有效的Charset。如果未指定,则此布局使用平台默认字符集。
patternString下表中一个或多个转换模式的复合模式字符串。不能用 PatternSelector 指定。
patternSelectorPatternSelector一个组件,用于分析 LogEvent 中的信息并确定应使用哪种模式来格式化事件。 pattern 和 patternSelector 参数是互斥的。
replaceRegexReplacement允许替换部分结果字符串。如果已配置,则 replace 元素必须指定要匹配的正则表达式和替换。这执行类似于 RegexReplacement 转换器的功能,但适用于整个消息,而转换器仅适用于其模式生成的 String。
alwaysWriteExceptionsboolean如果为 true(默认情况下),则即使该模式不包含任何异常转换,也始终会写入异常。这意味着,如果您没有在模式中包括输出异常的方法,则默认异常格式化程序将添加到模式的末尾。将此设置为 false 将禁用此行为,并允许您从模式输出中排除异常。
headerString可选的 Headers 字符串,包含在每个日志文件的顶部。
footerString可选的页脚字符串,包括在每个日志文件的底部。
disableAnsiboolean如果为 true(默认为 false),则不输出 ANSI 转义码。
noConsoleNoAnsiboolean如果为 true(默认值为 false)并且 System.console()为 null,则不输出 ANSI 转义码。

RegexReplacement Parameters

Parameter NameTypeDescription
regexString兼容 Java 的正则表达式,以匹配结果字符串。参见Pattern
replacementString用于替换任何匹配的子字符串的字符串。

Patterns

Log4j 提供的转换是:

Conversion PatternDescription
c {precision}

logger {precision}
输出发布了日志记录事件的 Logger 的名称。Logger 转换说明符后面可以有精度说明符,该说明符由十进制整数或以十进制整数开头的模式组成。
当精度说明符为整数值时,它将减小 Logger 名称的大小。如果数字为正,则布局将打印相应数量的最右边 Logger 名称组件。如果为负,则布局将删除相应数量的最左边的 Logger 名称组件。
如果精度包含任何非整数字符,则布局会根据模式缩写名称。如果精度整数小于 1,则布局仍将完整打印最右边的标记。默认情况下,布局将完整打印 Logger 名称。
转换模式Logger 名称结果
%c{1}org.apache.commons.Foo
%c{2}org.apache.commons.Foocommons.Foo
%c{10}org.apache.commons.Fooorg.apache.commons.Foo
%c{-1}org.apache.commons.Fooapache.commons.Foo
%c{-2}org.apache.commons.Foocommons.Foo
%c{-10}org.apache.commons.Fooorg.apache.commons.Foo
%c{1.}org.apache.commons.Fooo.a.c.Foo
%c{1.1.~.~}org.apache.commons.test.Fooo.a.~。~.Foo
%c{.}org.apache.commons.test.Foo.... Foo
C {precision}
class {precision}
输出发出日志记录请求的调用方的全限定类名。此转换说明符后面可以有精度说明符,该说明符遵循与 Logger 名称转换器相同的规则。
生成调用方的类名(location information)是一项昂贵的操作,可能会影响性能。请谨慎使用。
d {pattern}
date {pattern}
输出记录事件的日期。日期转换说明符后可以跟一组大括号,每个大括号包含每个SimpleDateFormat的日期和时间模式字符串。
sched 义的命名格式为:
图案例子
%d{DEFAULT}2012-11-02 14:34:02,123
%d{DEFAULT_MICROS}2012-11-02 14:34:02,123456
%d{DEFAULT_NANOS}2012-11-02 14:34:02,123456789
%d{ISO8601}2012-11-02T14:34:02,781
%d{ISO8601_BASIC}20121102T143402,781
%d{ISO8601_OFFSET_DATE_TIME_HH}2012-11-02'T'14:34:02,781-07
%d{ISO8601_OFFSET_DATE_TIME_HHMM}2012-11-02'T'14:34:02,781-0700
%d{ISO8601_OFFSET_DATE_TIME_HHCMM}2012-11-02'T'14:34:02,781-07:00
%d{ABSOLUTE}14:34:02,781
%d{ABSOLUTE_MICROS}14:34:02,123456
%d{ABSOLUTE_NANOS}14:34:02,123456789
%d{DATE}2012 年 11 月 2 日 14:34:02,781
%d{COMPACT}20121102143402781
%d{UNIX}1351866842
%d{UNIX_MILLIS}1351866842781
您还可以使用一组每个java.util.TimeZone.getTimeZone包含时区 ID 的花括号。如果没有给出日期格式说明符,则使用 DEFAULT 格式。
您可以定义自定义日期格式:
图案例子
%d{HH:mm:ss,SSS}14:34:02,123
%d{HH:mm:ss,nnnn}到%d{HH:mm:ss,nnnnnnnnn}14:34:02,1234 至 14:34:02,123456789
%d{dd MMM yyyy HH:mm:ss,SSS}2012 年 11 月 2 日 14:34:02,123
%d{dd MMM yyyy HH:mm:ss,nnnn}到%d{dd MMM yyyy HH:mm:ss,nnnnnnnnn}2012 年 11 月 2 日 14:34:02,1234 至 2012 年 11 月 2 日 14:34:02,123456789
%d{HH:mm:ss}{GMT+0}18:34:02
%d{UNIX}以秒为单位输出 UNIX 时间。 %d{UNIX_MILLIS}以毫秒为单位输出 UNIX 时间。 UNIX 时间是当前时间与 UTC 1970 年 1 月 1 日午夜之间的时差,对于 UNIX 是秒,对于 UNIX_MILLIS 是毫秒。时间单位为毫秒,而粒度取决于 os(Windows)。这是一种输出事件时间的有效方法,因为仅发生从 long 到 String 的转换,不涉及 Date 格式。
在 Java 9 上运行时,Log4j 2.11 增加了对时间戳的精确度(比毫秒更精确)的有限支持。请注意,并非所有DateTimeFormatter格式都受支持。仅上表中提到的格式中的时间戳可以使用“ nano-of-second”模式字母 n 代替“ second-fraction-of-second”模式字母 S。
在 Java 9 上运行时,用户可以通过将系统属性 log4j2.Clock 设置为 SystemMillisClock 来恢复到毫秒级时钟。
enc {pattern}{[HTML|XML|JSON|CRLF]}
编码 {pattern}{[HTML|XML|JSON|CRLF]}
编码并转义适合于以特定标记语言输出的特殊字符。默认情况下,如果仅指定了一个选项,则它将为 HTML 编码。第二个选项用于指定应使用哪种编码格式。该转换器对于编码用户提供的数据特别有用,以使输出数据不会被不正确或不安全地写入。
一种典型用法是对消息%enc{%m}进行编码,但用户 Importing 也可能来自其他位置,例如 MDC%enc{%mdc{}}
使用 HTML 编码格式,将替换以下字符:
性格更换
' r',' n'分别转换为转义字符串“ \ r”和“ \ n”
&,\ <, >,“,”,/替换为相应的 HTML 实体
使用 XML 编码格式,这遵循XML 规范指定的转义规则:
性格更换
&,\ <, >,“,' 替换为相应的 XML 实体
使用 JSON 编码格式,这遵循RFC 4627 第 2.5 节指定的转义规则:
性格更换
U 0000-U 001F\u0000-\ u001F
其他任何控制字符编码为\ uABCD 等效的转义代码点
\”
| \
例如,模式\ {"message": "%enc{%m}{JSON}“}可用于输出包含日志消息作为字符串值的有效 JSON 文档。
使用 CRLF 编码格式,将替换以下字符:
性格更换
' r',' n'分别转换为转义字符串“ \ r”和“ \ n”
等于 {pattern}{test}{substitution}
equalsIgnoreCase {pattern}{test}{substitution}
替换“ test”(一个字符串)的出现,并用其替换“ substitution(替换)”替换该字符串(由模式评估得出)。例如,“%equals{[%marker]}{[]}{}”将替换没有标记的带有空字符串的事件产生的'[]'字符串。
模式可以任意复杂,特别是可以包含多个转换关键字。
exexception可扔
{
[ "none"
| "full"
| depth
| "short"
| "short.className"
| "short.fileName"
| "short.lineNumber"
| "short.methodName"
| "short.message"
| "short.localizedMessage"]
}
{filters(package,package,...)}
{suffix(pattern)}
\ {separator(separator)}
输出绑定到日志记录事件的 Throwable 跟踪,默认情况下,它将输出通常通过调用 Throwable.printStackTrace()找到的完整跟踪。
您可以在%throwable{option}形式的选项后面跟随可抛出转换词。
%throwable{short}输出 Throwable 的第一行。
%throwable{short.className}输出发生异常的类的名称。
%throwable{short.methodName}输出发生异常的方法名称。
%throwable{short.fileName}输出发生异常的类的名称。
%throwable{short.lineNumber}输出发生异常的行号。
%throwable{short.message}输出消息。
%throwable{short.localizedMessage}输出本地化的消息。
%throwable{n}输出堆栈跟踪的前 n 行。
指定%throwable{none}或%throwable{0}会禁止输出异常。
使用\ {filters(packages)},其中 package 是软件包名称的列表,用于从堆栈跟踪中取消匹配的堆栈帧。
使用\ {suffix(pattern)}在每个堆栈帧的末尾添加图案的输出。
使用\ {separator(...)}作为行尾字符串。例如:分隔符(
)。缺省值为 line.separator 系统属性,它取决于 os。
F
file
输出发出记录请求的文件名。
生成文件信息(location information)是一项昂贵的操作,可能会影响性能。请谨慎使用。
突出显示 {pattern}{style}根据当前事件的日志记录级别,将 ANSI 颜色添加到封闭模式的结果中。 (请参阅 Jansi configuration。)
每个级别的默认颜色是:
级别ANSI 颜色
致命鲜红色
错误鲜红色
警告黄色
信息绿色
调试青色
追踪黑色(看起来是深灰色)
颜色名称是在AnsiEscape类中定义的 ANSI 名称。
颜色和属性名称和是标准的,但确切的 shade,色相或值。
Color table
强度代码 01234567
普通黑色红色绿色黄色蓝色洋红色青色
明亮黑色红色绿色黄色蓝色洋红色青色
您可以将默认颜色用于:
%highlight{%d [%t] %-5level: %msg%n%throwable}
您可以在可选的\ {}选项中覆盖默认颜色。例如:
%highlight{%d [%t] %-5level: %msg%n%throwable}{FATAL=white, ERROR=red, WARN=blue, INFO=black, DEBUG=green, TRACE=blue}
您可以仅突出显示日志事件的一部分:
%d [%t] %highlight{%-5level: %msg%n%throwable}
您可以设置消息的一部分样式,并突出显示其余的日志事件:
%style{%d [%t]}{black} %highlight{%-5level: %msg%n%throwable}
您还可以使用 STYLE 键来使用 sched 义的颜色组:
%highlight{%d [%t] %-5level: %msg%n%throwable}{STYLE=Logback}
STYLE 值可以是以下之一:
风格描述
默认值见上面
登录 级别ANSI 颜色
致命闪烁鲜红色
错误鲜红色
警告红色
信息蓝色
调试普通
追踪普通
K {key}
map {key}
MAP {key}
如果事件中存在条目,则以MapMessage输出条目。 K 转换字符后可以跟括号中的 Map 键,例如 %K{} ,其中 clientNumber 是键。 Map 中与键对应的值将被输出。如果未指定其他子选项,那么将使用\ {{key1,val1},\ {key2,val2}}格式输出 Map 键值对集合的全部内容。
l
location
输出生成日志事件的呼叫者的位置信息。
位置信息取决于 JVM 的实现,但通常由调用方法的完全限定名称组成,后跟调用者提供文件名和括号之间的行号。
生成location information是一项昂贵的操作,可能会影响性能。请谨慎使用。
L
line
输出发出记录请求的行号。
生成行号信息(location information)是一项昂贵的操作,可能会影响性能。请谨慎使用。
m {nolookups}{ansi}
msg {nolookups}{ansi}
message {nolookups}{ansi}
输出与日志记录事件关联的应用程序提供的消息。
添加\ {}以使用 ANSI 转义码呈现消息(需要 JAnsi,请参阅configuration。)
嵌入式 ANSI 代码的默认语法为:
@|code(,code)* text|@
例如,以绿色显示消息“ Hello”,请使用:
@|green Hello|@
要以红色和红色显示消息“ Hello”,请使用:
@|bold,red Warning!|@
您还可以使用以下语法在配置中定义自定义样式名称:
%message{ansi}{StyleName=value(,value)*( StyleName=value(,value)*)*}%n
For example:
%message{ansi}{WarningStyle=red,bold KeyStyle=white ValueStyle=blue}%n
呼叫站点如下所示:
logger.info("@|KeyStyle {}|@ = @|ValueStyle {}|@", entry.getKey(), entry.getValue());
使用\ {}记录诸如“ ${date:YYYY-MM-dd}”之类的消息,而不使用任何查找。通常,调用 logger.info(“ Try ${}”)会将日期模板${date:YYYY-MM-dd}替换为实际日期。使用 nolookups 将禁用此功能,并记录未更改的消息字符串。
M
方法
输出发出记录请求的方法名称。
生成调用方的方法名称(location information)是一项昂贵的操作,可能会影响性能。请谨慎使用。
标记标记的全名,包括 parent(如果有的话)。
markerSimpleName标记的简单名称(不包括父项)(如果存在)。
maxLen
maxLength
输出评估模式并截断结果的结果。如果长度大于 20,则输出将包含结尾的省略号。如果提供的长度无效,则使用默认值 100.
示例语法:%maxLen{%p: %c{1}-%m%notEmpty{ =>%ex{}}}{160}将限制为 160 个字符,并带有省略号。另一个示例:%maxLen{%m}{20}将被限制为 20 个字符,并且没有结尾的省略号。
n输出平台相关的行分隔符或多个字符。
此转换字符提供的性能几乎与使用不可移植的行分隔符字符串(例如“n”或“rn”)相同。因此,这是指定行分隔符的首选方式。
N
nano
在创建日志事件时输出 System.nanoTime()的结果。
pid {[defaultValue]}
processId {[defaultValue]}
如果基础平台支持,则输出进程 ID。如果平台不支持进程 ID,则可以指定要显示的可选默认值。
variablesNotEmpty {pattern}
varsNotEmpty {pattern}
notEmpty {pattern}
仅当模式中的所有变量都不为空时,输出评估模式的结果。
For example:
%notEmpty{[%marker]}
p级别 {level=label, level=label, ...} p级别 {length=n} plevel {lowerCase=truefalse}输出记录事件的级别。您以“ level = value,level = value”的形式提供一个级别名称 Map,其中 level 是级别的名称,而 value 是应该显示的值而不是级别的名称。
For example:
%level{WARN=Warning, DEBUG=Debug, ERROR=Error, TRACE=Trace, INFO=Info}
或者,对于思维紧凑的人:
%level{WARN=W, DEBUG=D, ERROR=E, TRACE=T, INFO=I}
更简洁地说,对于与上述相同的结果,可以定义级别标签的长度:
%level{length=1}
如果该长度大于级别名称的长度,则布局将使用常规级别名称。
您可以结合两种选择:
%level{ERROR=Error, length=2}
这为您提供了错误级别名称以及长度为 2 的所有其他级别名称。
最后,您可以输出小写的级别名称(默认为大写):
%level{lowerCase=true}
r
相对
输出从启动 JVM 到创建日志记录事件为止经过的毫秒数。
replace {pattern}{regex}{substitution}替换正则表达式'regex'的出现,并用其替换'substitution'替换字符串中由于评估模式而产生的结果。例如,“%replace{%msg}{s}{}”将删除事件消息中包含的所有空格。
该模式可以任意复杂,尤其可以包含多个转换关键字。例如,“%replace{%logger %msg}{.}{/}”将用正斜杠替换 Logger 中的所有点或事件消息。
rExrExceptionrThrowable
{
["none" | "short" | "full" | depth]
[,filters(package,package,...)]
[,separator(separator)]
}
{ansi(
Key=Value,Value,...
Key=Value,Value,...
...)
}
\ {suffix(pattern)}
与%throwable 转换字相同,但堆栈跟踪是从第一个引发的异常开始打印,然后是随后的每个包装异常。
可抛出的转换字后面可以有一个格式为%rEx{short}的选项,该选项仅输出 Throwable 或%rEx{n}的第一行,其中将打印堆栈跟踪的前 n 行。
指定%rEx{none}或%rEx{0}将禁止打印异常。
使用过滤器(程序包),其中程序包是程序包名称的列表,以抑制来自堆栈跟踪的匹配堆栈帧。
使用分隔符字符串分隔堆栈跟踪的行。例如:分隔符(
)。默认值为 line.separator 系统属性,它取决于 os。
仅当有可打印的对象时,才使用 rEx {suffix(pattern)将模式的输出添加到输出中。
sn
sequenceNumber
包括一个序列号,该序列号将在每个事件中递增。计数器是静态变量,因此仅在共享相同转换器 Class 对象的应用程序中是唯一的。
样式 {pattern}{ANSI style}使用 ANSI 转义序列来设置封闭模式的结果的样式。样式可以包含下表中以逗号分隔的样式名称列表。 (请参阅 Jansi configuration。)
样式名称描述
普通正常显示
明亮粗体
昏暗字符变暗或模糊
下划线带下划线的字符
闪烁闪烁字符
反向倒转影片
隐藏
黑色或 FG_Black将前景色设置为黑色
红色或 FG_Red将前景色设置为红色
绿色或 FG_Green将前景色设置为绿色
黄色或 FG_Yellow将前景色设置为黄色
蓝色或 FG_Blue将前景色设置为蓝色
洋红色或 FG_Magenta将前景色设置为洋红色
青色或 FG_Cyan将前景色设置为青色
白色或 FG_White将前景色设置为白色
默认值或 FG_Default将前景色设置为默认值(白色)
BG_Black将背景色设置为黑色
BG_Red将背景色设置为红色
BG_Green将背景色设置为绿色
BG_Yellow将背景色设置为黄色
BG_Blue将背景色设置为蓝色
BG_Magenta将背景色设置为洋红色
BG_Cyan将背景色设置为青色
BG_White将背景色设置为白色
For example:
%style{%d{ISO8601}}{black} %style{[%t]}{blue} %style{%-5level:}{yellow} %style{%msg%n%throwable}{green}
您还可以组合样式:
%d %highlight{%p} %style{%logger}{bright,cyan} %C{1.} %msg%n
您也可以将%使用诸如%black,%blue,%cyan 等颜色。例如:
%black{%d{ISO8601}} %blue{[%t]} %yellow{%-5level:} %green{%msg%n%throwable}
T
tid
threadId
输出生成日志事件的线程的 ID。
t
tn
thread
threadName
输出生成日志事件的线程的名称。
tp
threadPriority
输出生成日志事件的线程的优先级。
fqcn输出 Logger 的全限定类名称。
endOfBatch将日志记录事件的 EndOfBatch 状态输出为“ true”或“ false”。
x
NDC
输出与生成日志记录事件的线程关联的线程上下文堆栈(也称为嵌套诊断上下文或 NDC)。
X {key[,key2...]}
mdc {key[,key2...]}
MDC {key[,key2...]}
输出与生成日志事件的线程关联的线程上下文 Map(也称为 Map 诊断上下文或 MDC)。 X 转换字符后可以跟一个或多个用于大括号之间的 Map 的键,例如 %X{} ,其中 clientNumber 是键。 MDC 中与键对应的值将被输出。
如果提供了键列表,例如 %X{name, number} ,那么将使用\ { }格式输出 ThreadContext 中存在的每个键。键/值对将按照它们在列表中出现的 Sequences 进行打印。
如果未指定任何子选项,则使用\ { }格式输出 MDC 键值对集的全部内容。键/值对将按排序 Sequences 打印。
有关更多详细信息,请参见ThreadContext类。
u {"RANDOM""TIME"}
uuid
包括随机或基于时间的 UUID。基于时间的 UUID 是 Type 1 UUID,它每毫秒最多可以生成 10,000 个唯一 ID,将使用每个主机的 MAC 地址,并尝试确保同一主机上的多个 JVM 和/或 ClassLoader 的唯一性是一个随机数 0 到 16,384 之间的值将与 UUID 生成器类的每个实例相关联,并包含在所生成的每个基于时间的 UUID 中。由于基于时间的 UUID 包含 MAC 地址和时间戳,因此应谨慎使用,因为它们可能导致安全漏洞。
xExxExceptionx 可投掷
{
["none" | "short" | "full" | depth]
[,filters(package,package,...)]
[,separator(separator)]
}
{ansi(
Key=Value,Value,...
Key=Value,Value,...
...)
}
\ {suffix(pattern)}
与%throwable 转换字相同,但还包含类包装信息。
在异常的每个堆栈元素的末尾,将添加一个字符串,该字符串包含 jar 文件的名称,该 jar 文件包含该类或该类所在的目录,并在该 jar 的 Lists 中找到“ Implementation-Version”。如果信息不确定,则类包装数据之前将使用代字号,即“~”字符。
可抛出的转换字后面可以有一个格式为%xEx{short}的选项,该选项将仅输出 Throwable 的第一行或%xEx{n}的第一行,其中将打印堆栈跟踪的前 n 行。指定%xEx{none}或%xEx{0}将禁止打印异常。
使用过滤器(程序包),其中程序包是程序包名称的列表,以抑制来自堆栈跟踪的匹配堆栈帧。
使用分隔符字符串分隔堆栈跟踪的行。例如:分隔符(
)。默认值为 line.separator 系统属性,它取决于 os。
ansi 选项使用 JAnsi 库使用 ANSI 转义代码呈现堆栈跟踪。 (请参阅configuration。)使用\ {}使用默认的颜色 Map。您可以使用 key = value 对指定自己的 Map。关键是:
Prefix
Name
NameMessageSeparator
Message
At
CauseLabel
Text
More
Suppressed
StackTraceElement.ClassName
StackTraceElement.ClassMethodSeparator
StackTraceElement.MethodName
StackTraceElement.NativeMethod
StackTraceElement.FileName
StackTraceElement.LineNumber
StackTraceElement.Container
StackTraceElement.ContainerSeparator
StackTraceElement.UnknownSource
ExtraClassInfo.Inexact
ExtraClassInfo.Container
ExtraClassInfo.ContainerSeparator
ExtraClassInfo.Location
ExtraClassInfo.Version
值是 JAnsi 的Code类的名称,例如 blue,bg_red 等(Log4j 忽略大小写)。
可以将特殊键 StyleMapName 设置为以下 sched 义 Map 之一:Spock,Kirk。
与%throwable 一样, %xEx {suffix(pattern) 转换将仅在有可抛出的打印对象的情况下将模式的输出添加到输出中。
序列%%输出单个百分号。

默认情况下,相关信息按原样输出。但是,借助格式修饰符可以更改最小字段宽度,最大字段宽度和对齐方式。

可选的格式修饰符位于百分号和转换字符之间。

第一个可选的格式修饰符是左对齐标志,它只是减号(-)字符。然后是可选的最小字段宽度修饰符。这是一个十进制常数,代表要输出的最少字符数。如果数据项需要较少的字符,则在左侧或右侧填充它,直到达到最小宽度。默认为在左侧填充(右对齐),但您可以使用左侧对齐标志指定右填充。填充字符为空格。如果数据项大于最小字段宽度,则字段将扩展以容纳数据。该值永远不会被截断。要将零用作填充字符,请在最小字段宽度前面加上零。

可以使用最大字段宽度修饰符来更改此行为,该修饰符由句点和十进制常数指定。如果数据项比最大字段长,那么多余的字符将从数据项的开头而不是结尾处删除。例如,最大字段宽度为 8,数据项的长度为 10 个字符,然后删除该数据项的前两个字符。此行为与 C 中的 printf 函数不同,后者从头开始进行截断。

通过在句点之后添加减号,可以从结尾截断。在这种情况下,如果最大字段宽度为 8,数据项的长度为 10 个字符,则将删除数据项的最后两个字符。

以下是类别转换说明符的各种格式修改器示例。

Pattern Converters

Format modifierleft justifyminimum widthmaximum widthcomment
%20cfalse20none如果类别名称的长度少于 20 个字符,请在左侧填充空格。
%-20ctrue20none如果类别名称的长度少于 20 个字符,请用空格右击。
%.30cNAnone30如果类别名称超过 30 个字符,请从头开始截断。
%20.30cfalse2030如果类别名称少于 20 个字符,请在左侧填充空格。但是,如果类别名称超过 30 个字符,则从头开始截断。
%-20.30ctrue2030如果类别名称少于 20 个字符,请用空格右击。但是,如果类别名称超过 30 个字符,则从头开始截断。
%-20.-30ctrue2030如果类别名称少于 20 个字符,请用空格右击。但是,如果类别名称超过 30 个字符,则从末尾截断。

Windows 上的 ANSI 样式

在许多平台上本机支持 ANSI 转义序列,但 Windows 默认情况下不支持。要启用 ANSI 支持,请将Jansi jar 添加到您的应用程序中,并将属性 log4j.skipJansi 设置为 false。这允许 Log4j 在写入控制台时使用 Jansi 添加 ANSI 转义码。

注意:在 Log4j 2.10 之前,默认情况下启用 Jansi。 Jansi 需要本机代码的事实意味着 Jansi 只能由单个类加载器加载。对于 Web 应用程序,这意味着 Jansi jar 必须位于 Web 容器的 Classpath 中。为了避免给 Web 应用程序造成问题,在没有从 Log4j 2.10 开始进行显式配置的情况下,Log4j 将不再自动尝试加载 Jansi。

Example Patterns

Filtered Throwables

本示例说明如何从堆栈跟踪中不重要的包中筛选出类。

<properties>
  <property name="filters">org.junit,org.apache.maven,sun.reflect,java.lang.reflect</property>
</properties>
...
<PatternLayout pattern="%m%xEx{filters(${filters})}%n"/>

打印到控制台的结果将类似于以下内容:

Exception java.lang.IllegalArgumentException: IllegalArgument
at org.apache.logging.log4j.core.pattern.ExtendedThrowableTest.testException(ExtendedThrowableTest.java:72) [test-classes/:?]
... suppressed 26 lines
at $Proxy0.invoke(Unknown Source)} [?:?]
... suppressed 3 lines
Caused by: java.lang.NullPointerException: null pointer
at org.apache.logging.log4j.core.pattern.ExtendedThrowableTest.testException(ExtendedThrowableTest.java:71) ~[test-classes/:?]
... 30 more
ANSI Styled

日志级别将根据事件的日志级别突出显示。遵循该级别的所有内容将变为亮绿色。

<PatternLayout>
  <pattern>%d %highlight{%p} %style{%C{1.} [%t] %m}{bold,green}%n</pattern>
</PatternLayout>

Pattern Selectors

可以使用 PatternSelector 配置 PatternLayout,以允许其基于日志事件的属性或其他因素选择要使用的模式。通常,PatternSelector 将配置有 defaultPattern 属性(在其他条件不匹配时使用)和一组 PatternMatch 元素,这些元素标识可以选择的各种模式。

LevelPatternSelector

LevelPatternSelector 根据日志事件的日志级别选择模式。如果日志事件中的 Level 等于(忽略大小写)在 PatternMatch 键属性上指定的名称,则将使用在那个 PatternMatch 元素上指定的模式。

MarkerPatternSelector

MarkerPatternSelector 根据日志事件中包含的 Marker 选择模式。如果日志事件中的 Marker 等于或是 PatternMatch 键属性上指定的名称的祖先,则将使用该 PatternMatch 元素上指定的模式。

<PatternLayout>
  <MarkerPatternSelector defaultPattern="[%-5level] %c{1.} %msg%n">
    <PatternMatch key="FLOW" pattern="[%-5level] %c{1.} ====== %C{1.}.%M:%L %msg ======%n"/>
  </MarkerPatternSelector>
</PatternLayout>
ScriptPatternSelector

ScriptPatternSelector 执行配置一章的Scripts部分中描述的脚本。该脚本将传递配置的“属性”部分中配置的所有属性,“替换”变量中 Confguration 使用的 StrSubstitutor 和“ logEvent”变量中的 log 事件,并应返回 PatternMatch 的值应该使用的密钥;如果应该使用默认模式,则返回 null。

<PatternLayout>
  <ScriptPatternSelector defaultPattern="[%-5level] %c{1.} %C{1.}.%M.%L %msg%n">
    <Script name="BeanShellSelector" language="bsh"><![CDATA[
      if (logEvent.getLoggerName().equals("NoLocation")) {
        return "NoLocation";
      } else if (logEvent.getMarker() != null && logEvent.getMarker().isInstanceOf("FLOW")) {
        return "Flow";
      } else {
        return null;
      }]]>
    </Script>
    <PatternMatch key="NoLocation" pattern="[%-5level] %c{1.} %msg%n"/>
    <PatternMatch key="Flow" pattern="[%-5level] %c{1.} ====== %C{1.}.%M:%L %msg ======%n"/>
  </ScriptPatternSelector>
</PatternLayout>

RFC5424 Layout

顾名思义,Rfc5424Layout 按照增强的 Syslog 规范RFC 5424格式化 LogEvents。尽管该规范主要针对通过 Syslog 发送消息,但该格式对于其他目的还是很有用的,因为项目在消息中作为自描述键/值对传递。

Rfc5424Layout Parameters

Parameter NameTypeDescription
appNameString在 RFC 5424 syslogLogging 用作 APP-NAME 的值。
charsetString将系统日志字符串转换为字节数组时使用的字符集。字符串必须是有效的Charset。如果未指定,将使用默认系统 Charset。
enterpriseNumberintegerRFC 5424中所述的 IANA 企业编号
exceptionPatternStringPatternLayout 中的转换说明符之一,它定义了使用哪个 ThrowablePatternConverter 格式化异常。可能包括对那些说明符有效的任何选项。默认值是在输出中不包含事件的 Throwable(如果有)。
facilityString该工具用于尝试对消息进行分类。工具选项必须设置为“ KERN”,“ USER”,“ MAIL”,“ DAEMON”,“ AUTH”,“ SYSLOG”,“ LPR”,“ NEWS”,“ UUCP”,“ CRON”,“ AUTHPRIV”,“ FTP”,“ NTP”,“ AUDIT”,“ ALERT”,“ CLOCK”,“ LOCAL0”,“ LOCAL1”,“ LOCAL2”,“ LOCAL3”,“ LOCAL4”,“ LOCAL5”,“ LOCAL6”或“ LOCAL7”。这些值可以指定为大写或小写字符。
formatString如果设置为“ RFC5424”,则将按照 RFC 5424 格式化数据。否则,将其格式化为 BSD Syslog 记录。请注意,尽管 BSD Syslog 记录必须为 1024 字节或更短,但 SyslogLayout 不会截断它们。 RFC5424Layout 也不截断记录,因为接收者必须接受最大 2048 字节的记录,并且可能接受更长的记录。
idString根据 RFC 5424 进行格式化时要使用的默认结构化数据 ID。如果 LogEvent 包含 StructuredDataMessage,则将使用消息中的 ID 代替此值。
includeMDCboolean指示是否将 ThreadContextMap 中的数据包含在 RFC 5424 SyslogLogging。默认为 true。
loggerFields键值对列表允许将任意 PatternLayout 模式包含在指定的 ThreadContext 字段中;没有指定默认值。要使用,请包含一个\ 嵌套元素,其中包含一个或多个\ 元素。每个\ 必须具有一个 key 属性(用于指定 MDC 结构化数据元素中的字段名称)和一个 value 属性(用于指定要用作值的 PatternLayout 模式),该属性将用于标识 MDC 结构化数据元素中的字段。
mdcExcludesString逗号分隔的 mdc 键列表,应从 LogEvent 中排除。这与 mdcIncludes 属性互斥。此属性仅适用于 RFC 5424 syslog 记录。
mdcIncludesString用逗号分隔的 mdc 密钥列表,应包含在 FlumeEvent 中。在列表中未找到的 MDC 中的任何键都将被排除。此选项与 mdcExcludes 属性互斥。此属性仅适用于 RFC 5424 syslog 记录。
mdcRequiredStringMDC 中必须存在的逗号分隔的 mdc 密钥列表。如果没有密钥,则将引发 LoggingException。此属性仅适用于 RFC 5424 syslog 记录。
mdcPrefixString为了与事件属性区分开,应该在每个 MDC 关键字之前添加一个字符串。默认字符串是“ mdc:”。此属性仅适用于 RFC 5424 syslog 记录。
mdcIdString必需的 MDC ID。此属性仅适用于 RFC 5424 syslog 记录。
messageIdString在 RFC 5424 系统日志记录的 MSGID 字段中使用的默认值。
newLineboolean如果为 true,则会在系统日志记录的末尾添加换行符。默认为 false。
newLineEscapeString用于替换消息文本中换行符的字符串。

Serialized Layout

SerializedLayout 仅使用 Java 序列化将 LogEvent 序列化为字节数组。 SerializedLayout 不接受任何参数。

从 2.9 版开始不推荐使用此布局。 Java 序列化具有固有的安全性弱点,不再建议使用此布局。包含相同信息的替代布局是JsonLayout,配置为 properties =“ true”。

Syslog Layout

SyslogLayout 将 LogEvent 格式化为 BSD Syslog 记录,该记录与 Log4j 1.2 使用的格式相同。

SyslogLayout Parameters

Parameter NameTypeDescription
charsetString将系统日志字符串转换为字节数组时使用的字符集。字符串必须是有效的Charset。如果未指定,则此布局使用 UTF-8.
facilityString该工具用于尝试对消息进行分类。工具选项必须设置为“ KERN”,“ USER”,“ MAIL”,“ DAEMON”,“ AUTH”,“ SYSLOG”,“ LPR”,“ NEWS”,“ UUCP”,“ CRON”,“ AUTHPRIV”,“ FTP”,“ NTP”,“ AUDIT”,“ ALERT”,“ CLOCK”,“ LOCAL0”,“ LOCAL1”,“ LOCAL2”,“ LOCAL3”,“ LOCAL4”,“ LOCAL5”,“ LOCAL6”或“ LOCAL7”。这些值可以指定为大写或小写字符。
newLineboolean如果为 true,则会在系统日志记录的末尾添加换行符。默认为 false。
newLineEscapeString用于替换消息文本中换行符的字符串。

XML Layout

附加log4j.dtd中定义的一系列 Event 元素。

完整的格式正确的 XML 与片段 XML

如果您配置 complete =“ true”,则附加程序将输出格式正确的 XML 文档,其中默认名称空间为 Log4j 名称空间“ http://logging.apache.org/log4j/2.0/events”。默认情况下,使用 complete =“ false”,您应将输出作为外部实体包含在单独的文件中,以形成格式正确的 XML 文档,在这种情况下,附加程序使用默认值为“ log4j”的 namespacePrefix。

格式正确的 XML 文档遵循以下模式:

<Event xmlns="http://logging.apache.org/log4j/2.0/events"
       level="INFO"
       loggerName="HelloWorld"
       endOfBatch="false"
       thread="main"
       loggerFqcn="org.apache.logging.log4j.spi.AbstractLogger"
       threadId="1"
       threadPriority="5">
  <Instant epochSecond="1493121664" nanoOfSecond="118000000"/>
  <Marker name="child">
    <Parents>
      <Marker name="parent">
        <Parents>
          <Marker name="grandparent"/>
        </Parents>
      </Marker>
    </Parents>
  </Marker>
  <Message>Hello, world!</Message>
  <ContextMap>
    <item key="bar" value="BAR"/>
    <item key="foo" value="FOO"/>
  </ContextMap>
  <ContextStack>
    <ContextStackItem>one</ContextStackItem>
    <ContextStackItem>two</ContextStackItem>
  </ContextStack>
  <Source
      class="logtest.Main"
      method="main"
      file="Main.java"
      line="29"/>
  <Thrown commonElementCount="0" message="error message" name="java.lang.RuntimeException">
    <ExtendedStackTrace>
      <ExtendedStackTraceItem
          class="logtest.Main"
          method="main"
          file="Main.java"
          line="29"
          exact="true"
          location="classes/"
          version="?"/>
    </ExtendedStackTrace>
  </Thrown>
</Event>

如果 complete =“ false”,则附加程序不会编写 XML 处理指令和根元素。

Marker

标记由 Event 元素内的 Marker 元素表示。仅当在日志消息中使用标记时,Marker 元素才会出现。标记父级的名称将在 Marker 元素的 parent 属性中提供。

漂亮与紧凑型 XML

默认情况下,XML 布局不是带有 compact =“ false”的紧凑格式(也就是不是“漂亮”),这意味着追加程序使用行尾字符和缩进线来格式化 XML。如果 compact =“ true”,则不使用行尾或缩进。消息内容当然可以包含行尾。

XmlLayout Parameters

Parameter NameTypeDescription
charsetString转换为字节数组时要使用的字符集。该值必须是有效的Charset。如果未指定,将使用 UTF-8.
compactboolean如果为 true,则附加程序不使用行尾和缩进。默认为 false。
completeboolean如果为 true,则附加程序包括 XMLHeaders 和页脚。默认为 false。
propertiesboolean如果为 true,则附加程序将线程上下文 Map 包含在生成的 XML 中。默认为 false。
locationInfoboolean如果为 true,则附加程序将位置信息包含在生成的 XML 中。默认为 false。

生成location information是一项昂贵的操作,可能会影响性能。请谨慎使用。
includeStacktraceboolean如果为 true,则包括任何已记录的Throwable的完整 stacktrace(可选,默认为 true)。
stacktraceAsStringboolean是否将 stacktrace 格式化为字符串,而不是嵌套对象(可选,默认为 false)。
includeNullDelimiterboolean是否在每个事件之后包含 NULL 字节作为定界符(可选,默认为 false)。

要在输出中包括任何自定义字段,请使用以下语法:

<XmlLayout>
    <KeyValuePair key="additionalField1" value="constant value"/>
    <KeyValuePair key="additionalField2" value="$${ctx:key}"/>
  </XmlLayout>

自定义字段始终按声明的 Sequences 排在最后。这些值支持lookups

使用 XmlLayout 需要额外的runtime dependencies

YAML Layout

将一系列 YAML 事件附加为序列化为字节的字符串。

YAML 日志事件遵循以下模式:

---
instant:
 epochSecond: 1493121664
 nanoOfSecond: 118000000
thread: "main"
level: "INFO"
loggerName: "HelloWorld"
marker:
 name: "child"
 parents:
 - name: "parent"
   parents:
   - name: "grandparent"
message: "Hello, world!"
thrown:
 commonElementCount: 0
 message: "error message"
 name: "java.lang.RuntimeException"
 extendedStackTrace:
 - class: "logtest.Main"
   method: "main"
   file: "Main.java"
   line: 29
   exact: true
   location: "classes/"
   version: "?"
contextStack:
- "one"
- "two"
endOfBatch: false
loggerFqcn: "org.apache.logging.log4j.spi.AbstractLogger"
contextMap:
 bar: "BAR"
 foo: "FOO"
threadId: 1
threadPriority: 5
source:
 class: "logtest.Main"
 method: "main"
 file: "Main.java"
 line: 29

YamlLayout Parameters

Parameter NameTypeDescription
charsetString转换为字节数组时要使用的字符集。该值必须是有效的Charset。如果未指定,将使用 UTF-8.
propertiesboolean如果为 true,则附加程序将线程上下文 Map 包含在生成的 YAML 中。默认为 false。
locationInfoboolean如果为 true,则附加程序将位置信息包括在生成的 YAML 中。默认为 false。

生成location information是一项昂贵的操作,可能会影响性能。请谨慎使用。
includeStacktraceboolean如果为 true,则包括任何已记录的Throwable的完整 stacktrace(可选,默认为 true)。
stacktraceAsStringboolean是否将 stacktrace 格式化为字符串,而不是嵌套对象(可选,默认为 false)。
includeNullDelimiterboolean是否在每个事件之后包含 NULL 字节作为定界符(可选,默认为 false)。

要在输出中包括任何自定义字段,请使用以下语法:

<YamlLayout>
    <KeyValuePair key="additionalField1" value="constant value"/>
    <KeyValuePair key="additionalField2" value="$${ctx:key}"/>
  </YamlLayout>

自定义字段始终按声明的 Sequences 排在最后。这些值支持lookups

使用 YamlLayout 需要额外的runtime dependencies

Location Information

如果其中一个布局配置了与位置相关的属性(例如 HTML locationInfo),或者配置了模式%C 或%class%F 或%file%l 或%location%L 或%line%M 或%方法之一,则 Log4j 会获取堆栈的快照,并遍历堆栈跟踪以查找位置信息。

这是一项昂贵的操作:对于同步 Logger,速度要慢 1.3-5 倍。同步 Logger 在获取此堆栈快照之前会 await 尽可能长的时间。如果不需要位置,将永远不会拍摄快照。

但是,异步 Logger 需要在将日志消息传递到另一个线程之前做出决定。之后,位置信息将丢失。对于异步 Logger 而言,获取堆栈跟踪快照的performance impact甚至更高:有位置的记录比没有位置的记录慢 30-100 倍。因此,默认情况下,异步 Logger 和异步附加器不包含位置信息。

您可以通过指定 includeLocation =“ true”覆盖 Logger 或异步附加程序配置中的默认行为。