log4j2 - 系统日志附加器和 PatternLayout

2022-09-03 00:22:35

我需要将事件记录到系统日志中。我使用 lo4j2 和 syslog appender。我的附加块看起来像这样:log4j2.xml

<appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
        <Syslog name="syslog" host="localhost" port="514" protocol="UDP" charset="ISO-8859-1">
        </Syslog>
        <RollingFile name="AppLog" fileName="/var/log/app.log"
                     filePattern="/var/log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
            </Policies>
        </RollingFile>          
    </appenders>

如您所见,我有一个控制台追加器和RollingFile追加器,具有特定的Patulalayout。我想对系统日志附加器使用相同的PatternLayout。但是,系统日志中的日志消息似乎始终使用预定义的布局。我试图执行以下操作:

<Syslog name="syslog" host="localhost" port="514" protocol="UDP" charset="ISO-8859-1">
    <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Syslog>

但这没有任何影响。系统日志消息仍然具有相同的预先定义的格式。

如何确定进入系统日志的日志消息的格式?


答案 1

如此 log4j2 错误报告所述,log4j2 的开发人员将 SyslogAppender 编码为硬连线到 SyslogLayout 的 SocketAppender

因为它旨在符合原始系统日志格式或 RFC 5424。不应允许使用其他布局。

不幸的是,他们没有意识到RFC 5424规范不会对日志中包含的消息强制执行任何特定格式,在Log4j2中实现只是日志的一部分。%m

为了解决这个问题,一个解决方案(在同一个错误报告中建议)是使用SocketAppender中的PatternLayout重现系统日志格式,就像这样

<Socket name="SYSLOG" host="localhost" port="514" protocol="UDP">
  <PatternLayout
    pattern="&lt;1&gt;%d{MMM dd HH:mm:ss} ${hostName} appName: {
      &quot;host&quot;:&quot;${hostName}&quot;,
      &quot;thread&quot;:&quot;%t&quot;,
      &quot;level&quot;:&quot;%p&quot;,
      &quot;logger&quot;:&quot;%c{1}&quot;,
      &quot;line&quot;:%L,
      &quot;message&quot;:&quot;%enc{%m}&quot;,
      &quot;exception&quot;:&quot;%exception&quot;
      }%n"
  />
</Socket>

这会通过 UDP 将格式良好的 RFC5424 日志写入本地 514 端口。下面是一个示例日志输出:

Sep 14 10:40:50 app-hostname app-name: { "host":"host-name-01", "thread":"http-nio-8080-exec-4", "level":"DEBUG", "logger":"ExecuteTimeInterceptor", "line":52, "message":"GET &#x2F;health 200 served in 3", "exception":"" }

答案 2

我不相信你可以在基本的Syslog附加器上使用模式。

从文档中它指出

“SyslogAppender是一个SocketAppender,它以符合BSD Syslog格式或RFC 5424的格式将其输出写入主机和端口指定的远程目标”http://logging.apache.org/log4j/2.x/manual/appenders.html#SyslogAppender

但是,它确实允许您指定“格式= RFC 5424”

如果使用 RFC 5424

然后,您可以将PatterLayout放在loggerFields参数中。查看 http://logging.apache.org/log4j/2.x/manual/layouts.html#RFC5424Layout

希望有所帮助!


推荐