我有一个使用log4j写日志文件的应用程序。我无法访问源代码,但我可以假设,如果我在log4j.xml文件中创建一个appender,它应该使用该appender而不需要更改代码。
目前我可以确认没有通过wireshark从系统生成到远程syslog服务器的数据包。我可以telnet到端口514上的远程syslog服务器并写入消息没有问题。我可以假设我的XML有些不对劲,但我没有消息告诉我错误是什么。
这是Appender:
<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_ROLL
重命名为SYSLOG
,则邮件会正确输出到日志文件
2:如果我给记录器一个虚假名称,那么我在系统日志中看到log4j init错误消息
3:如果我给syslog appender一个不正确的主机参数,它会给我一个错误,指出主机无法找到并且日志记录将失败。由于在保存原始问题中列出的配置后没有收到此消息,我只能假设语法没有错误。
4:两边的防火墙都不是问题。我可以与telnet建立连接,并确认端口TCP:514在正确的方向上是允许的。
答案 0 :(得分: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"