【问题标题】:send payara logs to graylog via syslog and set correct source通过 syslog 将 payara 日志发送到 graylog 并设置正确的源
【发布时间】:2021-08-11 13:36:42
【问题描述】:

我有一个在端口 1514 上运行 UDP-Syslog-Input 的 graylog 实例。 它对 linux 服务器的所有系统日志都运行得非常好。

当我尝试通过 [1] 获取 payara 日志时,消息的“源”在 graylog 中设置为“localhost”,而它通常是发送服务器的主机名。

这是次优的,因为在最好的情况下,我希望应用程序日志在 graylog 中也具有正确的来源。

我搜索了一下,发现:

https://github.com/payara/Payara/blob/payara-server-5.2021.5/nucleus/core/logging/src/main/java/com/sun/enterprise/server/logging/SyslogHandler.java#L122

似乎系统日志“源”被硬编码到 payara (localhost) 中。 有没有办法使用正确的“源”集完成发送 payara-logs?

我与应用程序服务器本身无关,我只想接收具有正确来源(发送服务器的主机名)的日志。

payara 的 /var/log/syslog 中的示例日志条目

Mar 10 10:00:20 localhost [ INFO glassfish ] Bootstrapping Monitoring Console Runtime

我怀疑我希望将上面示例中的“localhost”设置为主机的 fqdn

有什么想法吗?

最好的问候

[1] logging.properties:com.sun.enterprise.server.logging.SyslogHandler.useSystemLogging=true

【问题讨论】:

    标签: rsyslog payara graylog


    【解决方案1】:

    尝试在系统日志输入设置中启用“存储完整消息”。

    这会将 full_message 字段添加到您的日志消息中,并将包含标题,以及您在消息字段中看到的内容。然后可以查看源IP是否在UDP包中。如果是这样,请通过原始/明文 UDP 输入收集这些消息,并且源应正确显示。

    您可能必须通过提取器或管道规则解析消息的其余部分,但至少您将拥有源......

    【讨论】:

    • 嗨,@Blackbox 感谢您指出这一点。我用 full_message 进行了尝试,但不幸的是它不包括 IP 地址或任何有用的东西。源字段也仍设置为“localhost”。 full_message <30>1 2021-08-01T01:00:00+02:00 localhost - - - INFO glassfish ] 01:00:00.224 [__ejb-thread-pool11] WARN de.project.ejb.mlc.beans.MLCServiceBean - Could not do what I was told to do.我仍然不知道如何让它工作......
    【解决方案2】:

    嗯,

    这可能不是一个好的解决方案,但我为 graylog 调整了 rsyslog 模板。

    我通过 Puppet 部署 rsyslog-config,因此我可以使用事实动态生成“$YOURHOSTNAME-PAYARA”。

    这样,我至少有正确的源集。

    $template GRAYLOGRFC5424,"<%PRI%>%PROTOCOL-VERSION% %TIMESTAMP:::date-rfc3339% YOURHOSTNAME-PAYARA %APP-NAME% %PROCID% %MSGID% %STRUCTURED-DATA% %msg%\n"
    
    if $msg contains 'glassfish' then {
    *.* @loghost.domain:1514;GRAYLOGRFC5424
    & ~
    } else {
    *.* @loghost.domain:1514;RSYSLOG_SyslogProtocol23Format
    }
    

    我们做的另一件事实际上是通过 log4j 和它的 syslog appender 激活应用程序日志记录:

    <Syslog name="syslog_app" appName="DEMO" host="loghost" port="1514" protocol="UDP" format="RFC5424" facility="LOCAL0" enterpriseId="">
                            <LoggerFields>
                                    <KeyValuePair key="thread" value="%t"/>
                                    <KeyValuePair key="priority" value="%p"/>
                                    <KeyValuePair key="category" value="%c"/>
                                    <KeyValuePair key="exception" value="%ex"/>
                            </LoggerFields>
                    </Syslog>
    
    

    这样,我们可以将 glassfish 服务器日志和独立应用程序日志摄取到 graylog 中。

    根据 RFC5424,log4j.xml 中的“LoggerFields”似乎是“StructuredDataElements”的键值对。

    https://logging.apache.org/log4j/2.x/manual/appenders.html

    https://datatracker.ietf.org/doc/html/rfc5424

    【讨论】:

      【解决方案3】:

      这就是 UDP Syslog 的问题。发件人可以在标头中设置来源。这个问题没有“最佳答案”。当信息不存在时,Graylog 很难传递信息。

      听起来您可能已经找到了适合您的答案。随它去吧。使用 log4j 解决了两个问题,让您可以自己定义源代码。

      对于那些面临类似问题的人,解决源问题的更简单方法可能是使用静态字段。如果您将 payara 系统日志消息发送到他们自己的输入,您可以创建一个静态字段来替代源以识别来自该源的流量。将其命名为“app_name”或“app_source”或其他名称,并将该字段用于您需要执行的任何排序。

      或者,如果您只有一个应用程序消息源,您可以使用管道将源字段的值设置为 payara 服务器的 IP 或 FQDN。然后它会像其他所有内容一样显示。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多