Linux:如何将日志文件中的新行发送到远程系统日志?

我们有几个应用程序正在生成自己的纯文本日志文件,我想转发到远程syslog服务器进行集中式日志logging。 我没有权限访问这些机器,也不能重新configurationsyslog以将输出redirect到远程机器。

我已经在网上find了一些解决scheme,但是他们大多是人们自制的bash脚本,而且我正在寻找更适合在潜在大批量生产环境中实施的更强大的function。

最好是devise一个小脚印的眼睛,保持运行的背景守护进程,可以跟上很多线条等。 – 目前有哪些解决scheme可用?

您已经拒绝了“其他人的bash脚本”,但这是一个非常常见的解决scheme – logger命令的一些创造性使用可以跟随一个文件并将其内容发送到别处。
我个人不会在生产环境中这样做。


一个更好的select,需要较less的脚本hackery是使用rsyslogd和像yoonix提到的文本文件input模块 – 这是一个相当不错的解决scheme,虽然有一些潜在的文件旋转过程中丢失的行,如果你在一个Linux系统用rsyslog作为你的系统日志守护进程,不需要额外的工作。

syslog-ng也支持一个类似于rsyslog 的文件input源 。


恕我直言, 最好的解决scheme – 尽pipe需要修改生成这些日志的应用程序 – 是直接login到系统日志。 你不想要通过中间步骤,文件等 – syslog是SYStem LOGger,在Unix平台上写日志的东西应该发送到syslog。
不幸的是,这样做的实现留给读者(和应用程序开发人员)来做,如果你的开发人员不存在,懒惰或无能为力,这可能是不可能的。

您可以使用logstash与文件input和syslog输出。

例如,使用要监视的文件(或文件)和系统日志服务器信息创buildconfiguration。

文件到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.clogger.c一起tail.c成了一个轻量级,快速和稳定的单个小型脚本编译程序(二进制)。 只要它具有读取日志文件的访问权限,那么它就可以工作,而不需要root权限。

我还对本地logging器进行了一些改进,并添加了一个新的(可选的)function,即在每个日志行开头插入一个文本string,然后将其发送到日志服务器。 结果就是一个可以自行运行的程序,不需要使用shellpipe道(也就是不需要tail logfile | logger )。 它将永远运行,直到明确的死亡或遇到写入networking套接字的错误。 如果日志文件被旋转甚至消失,它甚至会继续运行(它将继续查看文件是否再次出现)。

使用起来非常简单:只需要​​给它一个或多个日志文件进行监视,并且每次将新行写入文件时,都会将该行的副本发送到您指定的本地或远程系统日志服务器。 加上额外的文本string,如果你使用该选项。

我实际上已经在十二月份完成了这个项目,但正在等待雅虎采取版权并将其提供给他们,现在他们已经完成了。 (我把它写成了我在雅虎工作的一部分)。

filelogger程序信息和下载链接:

  • 关于文件logging器的博客文章
  • GitHub Repo for filelogger

我正在回答我自己的问题。

swatch可能已经工作了,但是我无法让perl的Sys :: Syslog模块在主机上工作,而安装在主机上的/ usr / bin / logger不支持login到远程服务器(util-linux-ng- 2.17.2)。

所以,我做的第一件事就是下载util-linux-2.20.1的源代码,为此logging器程序支持远程login。 经过testing,很明显对日志行允许的字符数量有限制。 挖掘源代码,我发现一个硬编码的400个字符的限制。 (如果你不相信我,在任何Linux系统上运行“strings / usr / bin / logger | grep 400”)。

这个限制对于apachetypes的日志logging(包括nodejs)来说是不可接受的,所以我修改了代码并将限制增加到4096.当我在这个时候,我还添加了一个新的命令行选项,允许一个插入一个可选的文本string在每个日志行的开头。 我这样做是因为nodejs日志不包含在apache中可能会看到的主机名。

此时,我可以使用“tail -F -n 0 [logfile] | ./modified_logger ….”运行一个shell脚本,并且工作正常。 但是我对于监督(daemontools)或甚至是后台运行这个问题有一些担忧,因为如果pipe道的一端或另一端终止,那么整个pipe道就会终止。 我也有担心(尽pipe未经testing)的performance。

所以我决定将尾部function与logging器function结合成一个可执行的二进制文件,以避免使用Unixpipe道或外部程序。 我是通过从gnu coreutils入侵tail.c来完成的,并将我需要的东西合并到修改的logging器程序中。

结果是一个新的二进制文件(117k大小),我称之为“文件logging器”,它连续监视一个或多个文件,并通过UDP或TCPlogging每一个新行到本地或远程系统日志。 它像一个魅力。 我能够进行一些基准testing,并在跨越子网的约3秒钟内logging约17,000行(1.8MB),其间有一个vlan和一对物理交换机,运行syslog-ng的远程服务器。

运行该程序,您可以执行以下操作(在前台,后台或daemontools监督下):

./filelogger -t'access'-d -p local1.info -n [remote loghost] -u / tmp / ignored -a $(hostname)/tmp/myfile1/tmp/myfile2 …

/ tmp / myfile1和/ tmp / myfile2是被监视的文件。

“-a”是我添加的新选项。 在这种情况下,我在每个日志行的开头插入本地主机名。

当我提出这个问题时,这种解决scheme就是我正在寻找的解决scheme,而事实certificate,这个解决scheme直到我自己做出来才有了。 🙂

有很多方法可以解决这个问题。 但是,应该做的第一件事是:使用syslog本身转发日志。

系统日志(以及许多syslog的替代品)具有内置function,可以将日志logging转发到位于不同地址的另一个系统日志服务器。 您可以通过更改configuration文件并附加地址来转发设施来轻松完成。 例如,将此行添加到:

 *.* @192.168.1.1 

…将转发所有设施到机器192.168.1.1,(希望)有服务运行。 我在这里给出的例子是rsyslog,它是Debian上的股票系统日志服务器,虽然它应该适用于其他许多服务器。 用man syslog来查阅syslog的实现文档,看看它是怎么说的“forwarding”。

远程系统日志服务器可以是任何你喜欢的。 甚至还有像Splunk这样的产品,通过Web仪表板,search,事件驱动的通知等将这些日志高效地聚合到一个视图中。您可以在这里看到更多信息: http : //www.splunk.com/ If那不符合你的需求,你可以使用别的东西。 甚至有系统日志服务器将转储到SQL数据库!

当然,你可以写你自己的脚本/程序/服务来为你做这件事,但是为什么在你完成并已经给你的时候重新发明轮子呢?


编辑:所以我回去重读这个问题,并注意到几个意见。 这听起来像:

  1. 你想聚合你的应用程序日志
  2. 您无权访问根
  3. 你的应用程序只是在某处转储文本
  4. 您的应用程序不知道如何写入本地系统日志
  5. 您无法控制您的应用程序源代码

所以让我们依次对每一个进行说明:

  1. 系统日志是为了将日志聚合在一起。 你可以使用任何你喜欢的东西,但有一个原因,为什么它已经存在了很长一段时间。 它经过了良好的testing,debugging良好,logging完备,知名度高,大多数* nix平台几乎得到了各种支持。
  2. 我们不需要访问root来设置日志logging。 我们只需要访问syslog API。 root不是写入syslog的要求; 如果是这种情况,则所有这些放弃权限的服务将无法将诊断写入日志文件。
  3. Re:文本转储,这是正常的。 但是,您应该可以使用子shell将STDERR和STDOUT的输出传递给调用syslog API的程序。 这不是火箭科学,它远非易碎,而且有很好的文献logging。 实际上,这是输出redirect甚至存在的原因之一。 一个简单的命令可以扔到一个shell脚本中:

    (my-application 2>&1 | my-syslog-shunt)&

  4. 如果您有能力更改应用程序的源代码,则应该在其中写入一个分路,将文本输出转储到syslog而不是纯文本文件。 这不应该太难 你所要做的就是采用你要输出的行,然后用电话打包。 然而….

  5. 你可能根本无法访问源代码,所以你不能这样做。 这意味着像#3以上的东西可以正常工作。