logback logstash 编码器 Syslog header 未设置

logback logstash encoder Syslog header not set

我正在尝试以 JSON 格式将 Java 日志记录到 Syslog,但我发现了一个奇怪的问题,即 Syslog header 未按预期设置。

我正在 Mac 上进行测试,并在数据包发送到 UDP 514 端口(通过环回接口)时使用 wireshark 抓取数据包

我的logback.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <conversionRule conversionWord="syslogStart" converterClass="ch.qos.logback.classic.pattern.SyslogStartConverter"/>

  <appender name="stash" class="net.logstash.logback.appender.LogstashSocketAppender">
    <host>localhost</host>
    <port>514</port>
    <prefix class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
      <layout class="ch.qos.logback.classic.PatternLayout">
        <pattern>%syslogStart{LOCAL5}</pattern>
      </layout>
    </prefix>
  </appender>

  <root level="INFO">
    <appender-ref ref="stash"/>
  </root>
</configuration>

当我查看 wireshark 的输出时,我只看到 JSON 被记录(没有给出 PRI header 字段)

 [truncated]Syslog message: (unknown): {"@timestamp":"2016-03-22T12:13:37.270+11:00","@version":1,"message":"Started App in 4.327 seconds (JVM running for 4.92)","logger_name":"au.com.xxx.App","threa

如果我切换到标准的 logback Syslog appender(非 JSON 输出)

...
  <appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
    <syslogHost>127.0.0.1</syslogHost>
    <Facility>LOCAL5</Facility>
    <SuffixPattern>%-5level MyApp %logger %msg</SuffixPattern>
  </appender>
...

我确实在 wireshark 数据包

中看到了正确的 header 设施原始值 <174> 和解析值 LOCAL5.INFO
 Syslog message: LOCAL5.INFO: Mar 22 12:31:03 sbmelmac-06390.local INFO  App au.com.App Started App in 11.292 seconds (JVM running for 29.336)

需要 syslog header(在 syslog conf 中)将日志消息路由到正确的文件,因此没有它我无法根据设施过滤器过滤掉日志条目。

我正在使用 SpringBoot (1.2.7)、(使用 logback 1.1.3)、apache camel (2.16.1) 和 logstash-logback-encoder (4.6)

当我在调试中 运行 时,似乎从未调用 SyslogStartConverter.convert 方法。

干杯 罗伊

经过大量摸索之后,看起来问题出在示例的包装 LayoutWrappingEncoder 部分。

当我使用最新的 SpringBoot 版本时,logback 配置异常会阻止应用程序启动(即使引发异常,以前的版本也不会阻止应用程序启动)。

Application startup failed
java.lang.IllegalStateException: Logback configuration error detected: 
ERROR in ch.qos.logback.core.joran.util.PropertySetter@10d307f1 - A "ch.qos.logback.core.encoder.LayoutWrappingEncoder" object is not assignable to a "ch.qos.logback.core.Layout" variable.
ERROR in ch.qos.logback.core.joran.util.PropertySetter@10d307f1 - The class "ch.qos.logback.core.Layout" was loaded by 
ERROR in ch.qos.logback.core.joran.util.PropertySetter@10d307f1 - [sun.misc.Launcher$AppClassLoader@73d16e93] whereas object of type 
ERROR in ch.qos.logback.core.joran.util.PropertySetter@10d307f1 - "ch.qos.logback.core.encoder.LayoutWrappingEncoder" was loaded by [sun.misc.Launcher$AppClassLoader@73d16e93].

因此,如果我删除包装 LayoutWrappingEncoder 并在前缀中使用 Pattern 实现,代码将工作并且我在系统日志中看到正确的 Facility 详细信息 headers。

 <conversionRule conversionWord="syslogStart" converterClass="ch.qos.logback.classic.pattern.SyslogStartConverter"/>
 <appender name="JSON_SYSLOG" class="net.logstash.logback.appender.LogstashSocketAppender">
    <host>127.0.0.1</host>
    <port>514</port>
    <prefix class="ch.qos.logback.classic.PatternLayout">
       <pattern>%syslogStart{LOCAL5}</pattern>
    </prefix>
  </appender>

并且生成的 wireshark 数据包具有设施信息(LOCAL5.INFO|错误)

 [truncated]Syslog message: LOCAL5.INFO: Mar 22 14:12:18 sbmelmac-06390.local {"@timestamp":"2016-03-22T14:12:18.494+11:00","@version":1,"message":"Started App in 4.597 seconds (JVM running for 5.18)","logger":"au.com.myapp.