将 LogStash Log4j 配置升级到 Log4j2

Upgrading LogStash Log4j configuration to Log4j2

我正在尝试将我的 Spring 引导应用程序从 Log4j 迁移到 Log4j 2。我知道 Log4j 2 更改了原始 Log4j 的 .properties 配置的语法。

这是我的原始 Log4j 配置的片段:

log4j.appender.logstash=org.apache.log4j.net.SocketAppender
log4j.appender.logstash.layout=org.apache.log4j.PatternLayout
log4j.appender.logstash.layout.ConversionPattern=%d{HH:mm:ss.SSS} %-5p %c {2} %x - %m%n
log4j.appender.logstash.Port=4560
log4j.appender.logstash.RemoteHost=logs.example.com
log4j.appender.logstash.ReconnectionDelay=10000

这是我为 Log4j 2 更新的内容:

appender.logstash.type=SocketAppender # Or 'Socket'
appender.logstash.name=logStash
appender.logstash.layout.type=PatternLayout
appender.logstash.layout.pattern=%d{HH:mm:ss.SSS} %-5p %c {2} %x - %m%n
appender.logstash.host=logs.example.com
appender.logstash.port=4560
appender.logstash.reconnectionDelayMillis=10000

但是,当我这样做时,我的控制台和文件追加器工作正常,但 LogStash 追加器抛出 Broken pipe 错误。

我已经对此进行了调查,看来我可能需要将 SocketAppender 包裹在 AsyncAppender 中并将 ref 指向我的 logStash SocketAppender(如在 this documentation) 中,但后来我得到了属性不存在的异常: appender.async.type=异步 appender.async.ref=logStash # 或者 'refs', 'appender-ref', 等等

.properties 文件不是用于异步套接字附加程序的方式吗?我可以使用一些帮助通过这个属性文件从 Log4j 1 迁移到 2。

旧版本的 logstash-log4j2 中存在问题。它在 3.2 版中得到修复。较新的版本可能取自此 link.

此外,appender 名称不是 SocketAppender,而是 Socket - 根据 documentation example,它使用在 log4j2.xml:

中的名称 Socket
<Appenders>
    <Socket name="socket" host="localhost" port="9500">
      <SerializedLayout />
    </Socket>
</Appenders>

我想你应该相应地改变你 log4j2.properties:

appender.logstash.type=Socket
appender.logstash.name=logStash
appender.logstash.layout.type=PatternLayout
...

我知道这是习惯和 "do-not-change-the-working-code" 方法的问题,但在迁移到 log4j2 时可能值得迁移到 xml 配置格式,因为文档中的大量示例是使用它。