rsyslog 的多行日志问题

Multiline Log issue with rsyslog

我有一个应用程序服务器 (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 堆栈跟踪和异常,这样异常就不会分散在多行中。

我们将不胜感激任何帮助。

我认为答案取决于您的日志如何在 rsyslog 中结束。如果有一个 appender 而不是将内容发送到 syslog 套接字,则由它决定。据我所知,您可以在那里发送多行日志,但是如果附加程序在到达 rsyslog 之前破坏了它们,那么您在那里无能为力。 UDP转发也是一样,每个数据包都是一个日志,所以rsyslog拿来就拿。

如果通过TCP发送,消息的默认分隔符是换行符。尽管 rsyslog 支持八位字节分隔的框架,但这又是发送方要处理的事情。

但是,如果您要拖尾文件,您可以在这里做些事情。尽管您可能需要最新版本的 rsyslog(有 Ubuntu 个软件包 here)。有了它,您将获得此用例的两个重要功能:

  • inotify 模式(默认使用)。在性能和日志轮换方面比轮询模式好得多
  • startmsg.regex(允许您指定一个正则表达式来确定哪一行应该属于当前事件,哪一行应该开始一个新事件)

重点是,对于多行日志,您(或者更确切地说,rsyslog)必须想出另一种分隔消息的方法。使用imfile,即使在7.4.4中,也有使用ReadMode的选项,默认为0(换行符是分隔符),但您可以将其设置为2(如果行以space/tab开头,则属于上一行).

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