2015-10-17 157 views
2

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

rsyslog服务器发送所有日志,包括tomcat错误,异常&堆栈跟踪到系统日志服务器,但问题在于多行日志。当日志消息存储在文件中或未经任何封装地通过网络转发时,跨越多行的消息中出现的换行符会混淆简单的基于行的分析器,这些简单的基于行的分析器将每行视为单独的事件; &因此我的异常日志被换成新行。

我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服务器端也?

任何帮助将不胜感激。

+0

是的,这也可以解决在NXLog侧xm_multiline。 – b0ti

+0

可以在nxlog端进行哪些准确的配置更改? 我nxlog文件:http://stackoverflow.com/questions/33233633/nxlog-ignores-multiline-tomcat-stacktraces-while-sending-to-papertrail –

回答

2

我认为答案取决于你的日志如何在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

+0

所以基本上我也跟着升级换代过程和做调整我的rsyslog现在文件。我目前的版本是8.13.0的LF帧分隔符,它有助于摆脱空间,但它实际上增加了一些更多的字符来代替换行符。再加上当日志被转储到NXLog服务器上时,nxlog服务器完全忽略了这些分隔符日志和不能发送到papertrail ..所有其他日志被发送到papertrail虽然 –

+0

你可以尝试全局(parser.escapeControlCharactersOnReceive =“关”)?这是默认情况下,我认为这是换行的原因。 –

+0

你的意思是$ EscapeControlCharactersOnReceive关上rsyslog.conf ..对不对? –