未设置 logback logstash 编码器 Syslog 标头
Posted
技术标签:
【中文标题】未设置 logback logstash 编码器 Syslog 标头【英文标题】:logback logstash encoder Syslog header not set 【发布时间】:2016-03-22 01:41:46 【问题描述】:我正在尝试以 JSON 格式将 Java 日志记录到 Syslog,但我发现了一个奇怪的问题,即 Syslog 标头未按预期设置。
我在 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>%syslogStartLOCAL5</pattern>
</layout>
</prefix>
</appender>
<root level="INFO">
<appender-ref ref="stash"/>
</root>
</configuration>
当我查看 wireshark 的输出时,我只看到记录了 JSON(没有给出 PRI 标头字段)
[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 数据包中看到了正确的标头设施原始值 和解析值 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 标头(在 syslog conf 中)将日志消息路由到正确的文件,因此如果没有这个,我将无法根据设施过滤器过滤掉日志条目。
我正在使用 SpringBoot (1.2.7),(它使用 logback 1.1.3)、apache camel (2.16.1) 和 logstash-logback-encoder (4.6)
当我在调试中运行时,看起来 SyslogStartConverter.convert 方法从未被调用过。
干杯 罗伊
【问题讨论】:
【参考方案1】:经过一番摸索后,看起来这是示例中包装 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 实现,则代码可以正常工作,并且我会在 syslog 标头中看到正确的 Facility 详细信息。
<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>%syslogStartLOCAL5</pattern>
</prefix>
</appender>
并且生成的wireshark数据包具有设施信息(LOCAL5.INFO|ERROR)
[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.
【讨论】:
以上是关于未设置 logback logstash 编码器 Syslog 标头的主要内容,如果未能解决你的问题,请参考以下文章