log4j2 和 syslog,使用 RFC5424 格式不显示日志消息的可变参数部分

Posted

技术标签:

【中文标题】log4j2 和 syslog,使用 RFC5424 格式不显示日志消息的可变参数部分【英文标题】:log4j2 and syslog, using RFC5424 format does not show varargs part of log message 【发布时间】:2015-03-03 20:11:44 【问题描述】:

我已经配置了这个 syslog appender:

    <Syslog name="syslog" format="RFC5424" host="localhost" port="514"
            protocol="UDP" appName="" includeMDC="true"
            facility="LOCAL0" enterpriseNumber="" newLine="true"
            messageId="" id="">
        <LoggerFields>
            <KeyValuePair key="c" value="%c1" />
            <KeyValuePair key="l" value="%p" />
            <KeyValuePair key="t" value="%t" />
        </LoggerFields>
    </Syslog>

local0 中的日志消息没有得到 log4j2 输出的可变参数部分。例如代码中的这条日志语句:

log.info("commit(). Query ", query.getQuery());

会在 local0.log 中产生这个输出(不是末尾的花括号):

Mar  3 20:09:22 127.0.0.1 1 2015-03-03T20:09:22.431Z app-03-prod.lax.projone.net  -  [mdc@18060 c="c.c.p.p.TransactionHelper" l="INFO" t="qtp812765588-375 - /id/1.0/credential?appKey=867ac7681942fb3ee5453b95378f155e"] commit(). Query 

但在应用程序日志文件中,我确实得到了语句的可变参数部分:

2015-03-03 20:04:25,374 INFO c.c.p.p.TransactionHelper [qtp380256045-442 - /id/1.0/session/start?appKey=940d52aac10af731c83176e65a763f87] commit(). Query INSERT INTO oid_identity (oid, app_id, app_uid, platform_id, platform_uid, creation_time) VALUES ( UNHEX( ? ), ? , ?, ? , ? , ? ) ON DUPLICATE KEY UPDATE creation_time=creation_time

我一定是在 log4j2.xml 配置中遗漏了什么?

【问题讨论】:

【参考方案1】:

在模式布局中,%t 代表线程名称,您可以使用%m 来获取消息。

如果这不能回答您的问题,您能否澄清一下您的预期结果? (您解释了重现的步骤和实际结果,但如果您能明确说明您期望/想要实现的输出,将会很有帮助。)

【讨论】:

成功了,谢谢。我现在得到了完整的消息,其中大括号替换为文本,但消息末尾仍带有大括号。知道是否可以删除吗?这就是它现在的样子Mar 3 23:06:33 127.0.0.1 1 2015-03-03T23:06:33.980Z app-03-prod.lax.projone.net - [mdc@18060 c="c.c.o.m.OIDHelper" l="ERROR" m="getTree(): Invalid OID Tree. OID F636C2FC94100000000B6C94969340B5" t="qtp812765588-310 - /id/1.0/auth/151325310530324/accesstoken?sessionId=7209236797825832277&amp;appKey=867ac7681942fb3ee5453b95378f155e"] getTree(): Invalid OID Tree. OID 看起来记录器字段被方括号 [key="value" key="value"] 包围,后跟日志消息 pattern 仅(不带参数)。这可能是 log4j2 中的错误,在这种情况下,您应该提出 Jira。 (抱歉,我对 SysLogAppender 不够熟悉,不知道它应该如何工作。)

以上是关于log4j2 和 syslog,使用 RFC5424 格式不显示日志消息的可变参数部分的主要内容,如果未能解决你的问题,请参考以下文章

通过 syslog 发送 log4j2 堆栈跟踪

log4j2 - Syslog 附加程序和 PatternLayout

Syslog协议-RFC5424 + RFC3164

log4j2 syslog 数据报大小超过 UDP 的限制

将 Apache Storm Log4j2 syslog appender 从 UDP 更改为 TCP

Mac 上的 Log4j2 Syslog Appender 格式