我们有几个应用程序正在生成自己的纯文本日志文件,我希望将这些文件转发到远程syslog服务器以进行集中日志记录。我无权访问root
这些计算机,也无法重新配置syslog
以将输出重定向到远程计算机。
我在网上找到了一些解决方案,但是它们大多数是人们自制的bash脚本,并且我正在寻找更健壮的方法,适合在潜在的大批量生产环境中实施。
最好是为小尺寸而设计的东西,后台守护程序一直运行,可以跟上很多行,等等。-当前有哪些解决方案?
我们有几个应用程序正在生成自己的纯文本日志文件,我希望将这些文件转发到远程syslog服务器以进行集中日志记录。我无权访问root
这些计算机,也无法重新配置syslog
以将输出重定向到远程计算机。
我在网上找到了一些解决方案,但是它们大多数是人们自制的bash脚本,并且我正在寻找更健壮的方法,适合在潜在的大批量生产环境中实施。
最好是为小尺寸而设计的东西,后台守护程序一直运行,可以跟上很多行,等等。-当前有哪些解决方案?
Answers:
您已经拒绝了“其他人的bash脚本”,但这是一个非常常见的解决方案- 对logger
命令的某些创造性使用可以跟随文件并将其内容发送到其他地方。
我个人不会在生产环境中这样做。
更好的选择是使用较少的脚本黑客,并且使用rsyslogd
了yoonix这样的文本文件输入模块 -这是一个相当不错的解决方案,尽管在文件轮换期间可能会丢失行,并且如果您使用的是Linux系统,作为您的syslog守护程序,不需要太多其他工作。rsyslog
syslog-ng
还支持功能类似于的文件输入源rsyslog
。
恕我直言,最好的解决方案(尽管需要修改生成这些日志的应用程序)是直接登录到syslog。您不想经历中间步骤,文件等。这syslog
是SYStem LOGger,在Unix平台上写日志的东西应该将它们发送到syslog。
不幸的是,此操作的实现留给读者(和应用程序开发人员)练习,如果您的开发人员不存在,懒惰或不称职,则可能无法实现。
rsyslog
系统上当前正在运行的配置。你应该不被运行两个系统日志守护进程。不必客气,但您必须停止尝试做错事*:针对这种情况的每种正确解决方案都需要在服务器上进行管理(root)操作或对应用程序进行修改。您将不得不面对现实,并与组织中有问题的系统上扎根的任何组织打交道,否则,这个问题就
您可以将logstash与文件输入和syslog输出一起使用。
例如,使用您要监视的文件和系统日志服务器信息创建配置。
文件到syslog.conf:
input { file { path => "/var/log/kern.log" } }
output {
syslog {
facility => "kernel"
host => "syslog.example.com"
port => 514
severity => "informational"
}
}
用以下命令启动logstash
java -jar logstash-1.2.2-flatjar.jar agent -f file-to-syslog.conf
我砍死在一起tail.c
,并logger.c
为它的重量轻,速度快而稳定单一,占地面积小编译的程序(二进制)。只要它具有对日志文件的读取访问权限,它就可以工作而无需root特权。
我还对本机记录器进行了一些改进,并增加了新的(可选)功能,可以在将文本字符串发送到日志服务器之前在每个日志行的开头插入一个文本字符串。结果是一个可以独立运行的程序,而无需使用shell管道(即,不需要tail logfile | logger
)。它会一直运行,直到被明确杀死或遇到写入网络套接字的错误。如果日志文件旋转甚至消失,它甚至可以继续运行(它将继续查看该文件是否再次出现。)
它易于使用:只需为其提供一个或多个日志文件即可进行监视,并且每次将新行写入文件时,它将把该行的副本发送到您指定的本地或远程syslog服务器。如果使用该选项,请加上额外的文本字符串。
我实际上在12月份完成了该程序,但在等待Yahoo获得版权并将其提供,他们现在已经完成了。(我在Yahoo的工作中写了它)。
Filelogger程序信息和下载链接:
有很多方法可以解决此问题。但非常,非常,你应该做的第一件事是:前锋使用日志系统日志本身。
Syslog(以及许多syslog的替代品)具有内置功能,可将日志转发到位于不同地址的另一台syslog服务器。您可以轻松地做到这一点,只需更改配置文件并添加地址以将该功能转发到该地址即可。例如,将此行添加到:
*.* @192.168.1.1
...会将所有功能转发到192.168.1.1上的计算机,(希望)该服务正在运行。我在这里给出的示例是rsyslog,它是Debian上的库存syslog服务器,尽管它也可以用于其他许多服务器。请查阅有关您实施syslog的文档,man syslog
并查看有关“转发”的内容。
远程系统日志服务器可以是您喜欢的任何东西。甚至还有Splunk之类的产品,它们都可以通过Web仪表板,搜索,事件驱动的通知等将这些日志愉快地聚合到一个视图中。您可以在此处查看更多信息:http : //www.splunk.com/ 如果不能满足您的需求,您可以使用其他东西。甚至还有将转储到SQL数据库的系统日志服务器!
当然,您可以编写自己的脚本/程序/服务来为您执行此操作,但是为什么在为您完成并且已经提供给您后又重新发明轮子呢?
编辑:所以我回去重新阅读问题,并注意到一些评论。这听起来像:
因此,让我们依次解决每个问题:
root
来设置日志记录。我们只需要访问syslog API。 root
不需要写入系统日志;如果是这种情况,那么所有放弃特权的服务将无法将诊断信息写入日志文件。回复:文本转储,这很正常。但是,您应该能够使用子外壳将STDERR和STDOUT的输出传递给调用syslog API的程序。这不是火箭科学,它远非易碎,并且有据可查。实际上,这是输出重定向甚至存在的原因之一。可以放入单个shell脚本中的简单命令是:
(my-application 2>&1 | my-syslog-shunt)&
如果您有能力更改应用程序的源代码,则应在其中编写一个分流器,以将文本输出转储到syslog而不是纯文本文件中。这不应该太难。您要做的就是获取要输出的行,并通过调用将它们包装起来。然而....
您可能根本无法访问源代码,因此无法执行此操作。这意味着上面的#3可以正常工作。
Runtime.exec("logger ..."
)好的,谢谢。
我在回答我自己的问题。
swatch可能有效,但是我无法在主机上使用perl的Sys :: Syslog模块,并且主机上安装的/ usr / bin / logger不支持登录到远程服务器(util-linux-ng- 2.17.2)。
因此,我要做的第一件事是下载util-linux-2.20.1的源代码,该程序的记录程序确实支持远程记录。经过测试,很明显对日志行上允许的字符数施加了限制。深入研究源代码,我发现了一个硬编码的400个字符的限制。(如果您不相信我,请在任何Linux系统上运行“ strings / usr / bin / logger | grep 400”)。
这个限制对于apache类型的日志记录(包括nodejs)是不可接受的,因此我修改了代码并将限制提高到4096。在此期间,我还添加了一个新的命令行选项,该选项允许用户插入可选的每个日志行开头的文本字符串。我这样做是因为nodejs日志不包含主机名,就像在Apache中可能会看到的那样。
此时,我可以运行带有“ tail -F -n 0 [logfile] | ./modified_logger ....”的shell脚本,并且该脚本可以正常工作。但是我担心从监督(daemontools)甚至在后台运行它,因为如果管道的一侧或另一侧终止,则存在整个管道终止的风险。我也有关于性能的担忧(尽管未经测试)。
因此,我决定将tail功能与logger功能结合到一个可执行二进制文件中,从而避免了使用Unix管道或外部程序的需要。我是通过从gnu coreutils入侵tail.c并将我需要的内容整合到修改后的记录器程序中来实现的。
结果是一个新的二进制文件(117k大小),我将其称为“文件记录器”,并连续监视一个或多个文件,并将每行新记录通过UDP或TCP记录到本地或远程syslog中。它像一种魅力。我能够进行一些基准测试,它在大约3秒钟的时间内通过子网通过vlan和它们之间的几个物理交换机在运行syslog-ng的远程服务器上记录了大约17,000条线(1.8MB)。
要运行该程序,您需要执行以下操作(在前台,后台或在daemontools的监督下):
./filelogger -t'访问'-d -p local1.info -n [远程日志主机] -u / tmp /忽略-a $(主机名)/ tmp / myfile1 / tmp / myfile2 ...
/ tmp / myfile1和/ tmp / myfile2是受监视的文件。
“ -a”是我添加的新选项。在这种情况下,我在每个日志行的开头插入本地主机名。
这种解决方案正是我问这个问题时要寻找的解决方案类型,事实证明,直到我自己解决这个问题时,该解决方案才存在。:)