【问题标题】:Multiline Log issue with rsyslogrsyslog 的多行日志问题
【发布时间】:2016-01-16 00:26:41
【问题描述】:

我有一个应用程序服务器 (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 服务器端解决?

任何帮助将不胜感激。

【问题讨论】:

标签: tomcat logging rsyslog nxlog papertrail-app


【解决方案1】:

我认为答案取决于您的日志在 rsyslog 中的最终结果。如果有一个附加程序而不是将内容发送到 syslog 套接字,则由它决定。据我所知,您可以在那里发送多行日志,但是如果附加程序在到达 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

【讨论】:

  • 所以基本上我遵循了升级程序并调整了我的 rsyslog 文件。我当前的版本是 8.13.0,带有 LF 帧分隔符,这有助于消除空间,但它实际上添加了更多字符来代替换行符。加上当日志被转储到 NXLog 服务器上时,nxlog 服务器完全忽略了这些段落日志并且无法发送到 papertrail .. 所有其他日志都被发送到 papertrail
  • 你可以试试 global(parser.escapeControlCharactersOnReceive="off") 吗?默认情况下它是打开的,我认为这就是换行符转义的原因。
  • 你的意思是 $EscapeControlCharactersOnReceive 关闭 rsyslog.conf .. 对吧?
  • 而且这会帮助我解决stackoverflow.com/questions/33233633/… 吗?
  • nxlog 确实支持带有“InputType Syslog_TLS”的八位字节分隔的帧。这适用于 TCP 和 SSL/TLS。
猜你喜欢
  • 2020-05-08
  • 2022-07-29
  • 1970-01-01
  • 2014-11-06
  • 2017-11-07
  • 2022-11-04
  • 2014-12-24
  • 1970-01-01
  • 2019-05-06
相关资源
最近更新 更多