rsyslog的多行日志问题

时间:2015-10-17 07:53:17

标签: tomcat logging rsyslog nxlog papertrail-app

我有一个应用服务器(Ubuntu 14.04),它运行着tomcat服务器。同一个应用服务器由“ rsyslog ”服务器组成,该服务器配置为将日志发送到 NXlog 服务器(在Ubuntu 14.04上)。

rsyslog服务器发送所有日志,包括tomcat错误,例外&堆栈跟踪到syslog服务器,但问题是多行日志。当日志消息存储在文件中或通过网络转发而没有任何封装时,跨越多行的消息中出现的换行符混淆了简单的基于行的解析器,它将每一行视为一个单独的事件; &安培;因此我的异常日志在新行中被破坏。

我的rsyslog版本是: 7.4.4

rsyslog.conf文件如下所示:

#################
#### MODULES ####
#################
$EscapeControlCharactersOnReceive off
$LocalHostName nishant-app

$ModLoad imuxsock # provides support for local system logging
$ModLoad imklog   # provides kernel logging support (previously done by rklogd)i
#$ModLoad immark  # provides --MARK-- message capability
$ModLoad imfile
$ModLoad omrelp
#$ModLoad omhdfs

# provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514

module(load="imfile" PollingInterval="10")
###########################
#### GLOBAL DIRECTIVES ####
###########################
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#

#
# Use traditional timestamp format.
# To enable high precision timestamps, comment out the following line.
#
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# Filter duplicated messages
$RepeatedMsgReduction on

#
# Set the default permissions for all log files.
#
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser syslog
$PrivDropToGroup syslog

#
# Where to place spool files
#
$WorkDirectory /var/spool/rsyslog

#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf           ## This includes all the conf files which tells rsyslog which logs need to be sent

所以基本上我需要发送tomcat stack-traces&例外,异常不会分散在多行中。

  • 我希望在rsyslog结束时解决这个问题,但也很困惑 天气这可以在Nxlog服务器端解决吗?

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:3)

我认为答案取决于您的日志如何在rsyslog中结束。如果有一个appender而不是将东西发送到syslog套接字,它就可以了。据我所知,你可以在那里发送多行日志,但是如果appender在进入rsyslog之前就破坏了它们,那么你可以做的并不多。这同样适用于UDP转发,每个数据包都是一个日志,因此rsyslog只需要它就可以获取它。

如果通过TCP发送,则消息的默认分隔符为换行符。虽然rsyslog支持八位字节分隔的框架,但这也是发送方可以处理的事情。

但是,如果你正在追踪文件,那么这就是你可以做的事情。虽然您可能需要最新版本的rsyslog(有Ubuntu软件包here)。有了它,您将获得此用例的两个重要功能:

  • inotify模式(默认情况下使用)。在性能方面比轮询模式好很多,并且可以很好地与日志轮换一起使用
  • startmsg.regex (允许您指定正则表达式以确定哪一行应属于当前事件以及哪一行应该启动一个新行)

关键是,对于多行日志,您(或更确切地说,rsyslog)必须找出另一种分隔消息的方法。使用imfile,即使在7.4.4中,也可以选择使用ReadMode,默认为0(换行符是分隔符),但是你可以将它设置为2(如果行以空格/制表符开头它属于前一个)。

您可以在此处找到imfile周围的所有选项:http://www.rsyslog.com/doc/master/configuration/modules/imfile.html