4

我有一个应用程序服务器(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 端解决这个问题,但也很困惑天气这也可以在 Nxlog 服务器端解决?

任何帮助将不胜感激。

4

1 回答 1

5

我认为答案取决于您的日志如何最终出现在 rsyslog 中。如果有一个附加程序而不是将内容发送到 syslog 套接字,则由它决定。据我所知,您可以在那里发送多行日志,但如果附加程序在到达 rsyslog 之前破坏了它们,那么您在那里无能为力。这同样适用于 UDP 转发,每个数据包都是一个日志,所以 rsyslog 只是在得到它时接受它。

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

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

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

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

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

于 2015-10-17T10:25:02.333 回答