log4j2 – Syslog appender和PatternLayout

我需要将事件记录到syslog中。 我使用lo4j2和syslog appender。 我在log4j2.xml appenders块看起来像这样:

              

正如您所看到的,我有一个Console appender和RollingFile appender以及一个特定的PatternLayout。 我想为Syslog appender使用相同的PatternLayout。 但是,syslog中的日志消息似乎总是使用预定义的布局。 我试着做以下事情:

    

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

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

正如这个log4j2错误报告中所提到的, log4j2的开发人员将SyslogAppender编码为SocketAppender ,硬连线到SyslogLayout

因为它旨在符合原始syslog格式或RFC 5424.不允许其他布局。

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

要解决这个问题,解决方案(在同一个bug报告中建议)是使用SocketAppender中的PatternLayout重现syslog格式,就像这样

    

这将通过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 /health 200 served in 3", "exception":"" } 

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

从文档中可以看出这一点

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

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

如果您使用RFC 5424

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

希望有所帮助!

您可以使用SocketAppender和PatternLayout格式化syslog(syslog-ng)消息。
要使用固定工具支持动态严重性(例如:’用户级消息’ – 请参阅RFC5424 ),模式应如下所示:

    

要计算Facility’用户级消息’和Severity’信息性消息’的优先级值(PRIVAL) – 请参阅RFC5424 ,以下示例可能会有所帮助:

 Syslog: Facility | Severity Numerical Code: 1 6 Bin: 0 0 0 0 1 | 1 1 0 Dec: 8 + 6 = 14 

log4j2 syslog-ng socketappender patternlayout

您可以使用LoggerFields标记向RFC5424格式化的SyslogAppender消息添加其他元素,如下所示:

       

然后我使用rsyslog的RFC5424解析模块mmpstrucdata将它们拉出来创建json树。 用于访问它们的rsyslog.conf模板如下所示:

 template(name="jsondump" type="string" string="'%$!rfc5424-sd!mdc@18060!thread%', '%$!rfc5424-sd!mdc@18060!priority%', '%$!rfc5424-sd!mdc@18060!category%', '%$!rfc5424-sd!mdc@18060!exception%'") 

我只是想做同样的事情,并认为我会分享对我有用的东西。 – 山姆

我使用了butcher82发布的配置 ,但不得不改变它以产生我需要的结果。

我到底得到的是一条消息,其中包含正确的优先级,时间戳(几天没有前导零),主机和消息部分。 syslog和log4J级别之间的映射按照org.apache.log4j.Level中的定义使用,设施设置为1(用户级消息),以简化优先级计算。

此模式应与RFC-3164兼容:

    

以下是产生的输出:

 <3>Dec 15 09:59:16 foo.bar.hostname this is a test message 

注意:可以在主机名后添加应用程序名称或pid。