0

我有一个使用 log4j 编写日志文件的应用程序。我无权访问源代码,但我可以假设如果我在 log4j.xml 文件中创建一个附加程序,它应该使用该附加程序而不需要更改代码。

目前我可以确认没有通过wireshark从系统生成数据包到远程系统日志服务器。我可以远程登录到端口 514 上的远程系统日志服务器并毫无问题地写入消息。我可以假设我的 XML 有问题,但是我没有消息告诉我错误是什么。

这是附加程序:

<appender name="SYSLOG" class="org.apache.log4j.net.SyslogAppender">
    <param name="Facility" value="USER" /> 
    <param name="syslogHost" value="172.16.81.39:514" />
    <param name="Threshold" value="INFO" /> 
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="[%d{yyyy/MM/dd HH:mm:ss.SSS}][%5p](%t) %m%n" />
    </layout>
</appender>

我也尝试过 Log4j 2 语法

<appender name="syslog" class="org.apache.log4j.net.SyslogAppender">
    <param name="format" value="bsd" />
    <param name="host" value="172.16.81.39" />
    <param name="port" value="514" />
    <param name="protocol" value="TCP" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="[%d{yyyy/MM/dd HH:mm:ss.SSS}][%5p](%t) %m%n" />
    </layout>
</appender>

这是相应的记录器:

<logger name="printing.com.application" additivity="false">
    <level value="INFO" />
    <appender-ref ref="SYSLOG" />
</logger>

如果我将其更改<appender-ref />为默认的 PRINTING_MONTHLY_ROLL,那么它将打印到日志文件。


编辑:仍然难倒,但我会添加一些关于我的问题的更多信息

1:如果我将默认值重命名为PRINTING_MONTHLY_ROLLSYSLOG则消息正确输出到日志文件

2:如果我给记录器一个假名,那么我会在系统日志中看到 log4j init 错误消息

3:如果我给 syslog appender 一个不正确的主机参数,它会给我一个找不到主机的错误,并且日志记录将失败。由于保存原始问题中列出的配置后我没有收到此消息,因此我只能假设语法没有错误。

4:两边的防火墙都不是问题。我可以与 telnet 建立连接,并确认端口 TCP:514 允许在正确方向的两侧。

4

1 回答 1

0

我遇到了同样的行为,Syslog appender 不会尝试连接,如果我停止并重新启动应用程序几次,有时它会正确记录但大多数情况下没有,所以我认为这是 Syslog appender 中的错误

- - 更新 - -

在我的情况下,我刚刚发现问题与 DNS 解析有关,尝试在 rsyslogd 配置中禁用来自远程主机的消息的 DNS 解析,在 arm 设备上的 ubuntu 中我在 /etc/default 中找到了该选项/rsyslog

# Options for rsyslogd
# -x disables DNS lookups for remote messages
# See rsyslogd(8) for more details
RSYSLOGD_OPTIONS="-x"
于 2016-04-22T09:28:06.540 回答