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


8

我们有几个应用程序正在生成自己的纯文本日志文件,我希望将这些文件转发到远程syslog服务器以进行集中日志记录。我无权访问root这些计算机,也无法重新配置syslog以将输出重定向到远程计算机。

我在网上找到了一些解决方案,但是它们大多数是人们自制的bash脚本,并且我正在寻找更健壮的方法,适合在潜在的大批量生产环境中实施。

最好是为小尺寸而设计的东西,后台守护程序一直运行,可以跟上很多行,等等。-当前有哪些解决方案?


3
您是否看过rsyslog 的文本文件输入模块
yoonix

@yoonix:不,我没有,但是我要去:)
迈克尔·马丁内斯

3
嗯,系统日志可以发送到远程系统日志服务器。配置本地系统日志以发送到远程服务器。然后,通过标准syslog调用或使用logger或其他工具访问本地syslog。
Zoredache

4
你为什么不写你的日志文件,命名管道,并有一个守护进程监听发送他们走serverfault.com/questions/189477/...
user9517

3
您不必修改应用程序,只需将与应用程序正在写入的日志文件同名的命名管道放入适当的位置即可。
user9517 2013年

Answers:


13

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


更好的选择是使用较少的脚本黑客,并且使用rsyslogdyoonix这样的文本文件输入模块 -这是一个相当不错的解决方案,尽管在文件轮换期间可能会丢失行,并且如果您使用的是Linux系统,作为您的syslog守护程序,不需要太多其他工作。rsyslog

syslog-ng还支持功能类似于的文件输入源rsyslog


恕我直言,最好的解决方案(尽管需要修改生成这些日志的应用程序)是直接登录到syslog。您不想经历中间步骤,文件等。这syslog是SYStem LOGger,在Unix平台上写日志的东西应该将它们发送到syslog。
不幸的是,此操作的实现留给读者(和应用程序开发人员)练习,如果您的开发人员不存在,懒惰或不称职,则可能无法实现。


7
@MichaelMartinez您将修改rsyslog系统上当前正在运行的配置。你应该被运行两个系统日志守护进程。不必客气,但您必须停止尝试做错事*:针对这种情况的每种正确解决方案都需要在服务器上进行管理(root)操作或对应用程序进行修改。您将不得不面对现实,并与组织中有问题的系统上扎根的任何组织打交道,否则,这个问题
不成

5
@Michael这一切告诉我们,有人试图迫使错误的团队实施此修复程序。
安德鲁B

4
@MichaelMartinez恕我直言,这听起来像是一条使技术债务严重下降的捷径。
Sirex 2013年

2
@Sirex。无论如何,这就是事物的方式。我在一个拥有数以万计的员工的组织中工作,其中大多数是技术人员(工程师,开发人员,操作人员等)
Michael Martinez

5
我猜。通常,我发现长期而言,赢得自残战斗并没有奖牌。根据我的经验,当技术债务达到顶峰时,具有讽刺意味的是,这对企业产生了影响。那些努力工作以避开房间里的大象的人们往往最终会背着罐头。因此,我想掩盖您的屁股,并让某人在写下此事的缺点时达成一致。
Sirex 2013年

6

您可以将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

+1。如果使用rsyslog的文件输入不是一个选项,则logstash是下一个最好的选择。从长远来看,从许多方面来看,它会更好。
Sirex 2013年

我对此不熟悉。如果它能满足我的需要,那将为我省去破解coreutils和util-linux的麻烦。
Michael Martinez

是的,配置看起来像这样:pastebin.com/xeC9hxD3
Sirex 2013年

看起来像一个非常酷的工具,但是绝对满足我的需要。logstash是它自己的服务,带有Web界面,需要Java等。我将继续使用文件记录器,该文件记录器轻巧,占用空间小且针对性能进行了优化。...但是,感谢您建议使用logstash,因为将来我会在其他情况下看到它的需要!
Michael Martinez

是的,它是一个罐装的jruby工具。gui实际上是kibana,它很容易打包到其中,但实际上是一个单独的项目,因此它不仅用于解析消息。它基本上是瑞士伐木的军刀。您可以定义输入和输出,并在中间可以选择查看日志,从而为它们提供上下文。-除非您还想在日志数据上使用elasticsearch,否则IT可能对您而言是过大的。
Sirex

4

我砍死在一起tail.c,并logger.c为它的重量轻,速度快而稳定单一,占地面积小编译的程序(二进制)。只要它具有对日志文件的读取访问权限,它就可以工作而无需root特权。

我还对本机记录器进行了一些改进,并增加了新的(可选)功能,可以在将文本字符串发送到日志服务器之前在每个日志行的开头插入一个文本字符串。结果是一个可以独立运行的程序,而无需使用shell管道(即,不需要tail logfile | logger)。它会一直运行,直到被明确杀死或遇到写入网络套接字的错误。如果日志文件旋转甚至消失,它甚至可以继续运行(它将继续查看该文件是否再次出现。)

它易于使用:只需为其提供一个或多个日志文件即可进行监视,并且每次将新行写入文件时,它将把该行的副本发送到您指定的本地或远程syslog服务器。如果使用该选项,请加上额外的文本字符串。

我实际上在12月份完成了该程序,但在等待Yahoo获得版权并将其提供,他们现在已经完成了。(我在Yahoo的工作中写了它)。

Filelogger程序信息和下载链接:


@slm:我按您的要求重写了
Michael Martinez

非常有用,谢谢迈克尔。您是否有可能将其打包为debian apt-get install?
joelparkerhenderson

@joelparkerhenderson。嗨,乔尔。不幸的是,可能不是因为我不与Debian合作。您是否尝试过将二进制文件复制到系统并查看其是否运行?
Michael Martinez

1

有很多方法可以解决此问题。但非常,非常,你应该做的第一件事是:前锋使用日志系统日志本身

Syslog(以及许多syslog的替代品)具有内置功能,可将日志转发到位于不同地址的另一台syslog服务器。您可以轻松地做到这一点,只需更改配置文件并添加地址以将该功能转发到该地址即可。例如,将此行添加到:

*.*    @192.168.1.1

...会将所有功能转发到192.168.1.1上的计算机,(希望)该服务正在运行。我在这里给出的示例是rsyslog,它是Debian上的库存syslog服务器,尽管它也可以用于其他许多服务器。请查阅有关您实施syslog的文档,man syslog并查看有关“转发”的内容。

远程系统日志服务器可以是您喜欢的任何东西。甚至还有Splunk之类的产品,它们都可以通过Web仪表板,搜索,事件驱动的通知等将这些日志愉快地聚合到一个视图中。您可以在此处查看更多信息:http : //www.splunk.com/ 如果不能满足您的需求,您可以使用其他东西。甚至还有将转储到SQL数据库的系统日志服务器!

当然,您可以编写自己的脚本/程序/服务来为您执行此操作,但是为什么在为您完成并且已经提供给您后又重新发明轮子呢?


编辑:所以我回去重新阅读问题,并注意到一些评论。这听起来像:

  1. 您想要汇总应用程序日志
  2. 您无权访问root
  3. 您的应用程序只是将文本转储到某处
  4. 您的应用程序不知道如何写入本地系统日志
  5. 您无法控制您的应用程序源代码

因此,让我们依次解决每个问题:

  1. syslog用于将日志聚合在一起。您可以使用任何喜欢的东西,但是存在很长一段时间是有原因的。它经过了充分的测试,调试,良好的文档记录,广为人知,并且对于大多数* nix平台而言,几乎都可以以一种或另一种形式普遍支持。
  2. 我们不需要访问权限root来设置日志记录。我们只需要访问syslog API。 root不需要写入系统日志;如果是这种情况,那么所有放弃特权的服务将无法将诊断信息写入日志文件。
  3. 回复:文本转储,这很正常。但是,您应该能够使用子外壳将STDERR和STDOUT的输出传递给调用syslog API的程序。这不是火箭科学,它远非易碎,并且有据可查。实际上,这是输出重定向甚至存在的原因之一。可以放入单个shell脚本中的简单命令是:

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

  4. 如果您有能力更改应用程序的源代码,则应在其中编写一个分流器,以将文本输出转储到syslog而不是纯文本文件中。这不应该太难。您要做的就是获取要输出的行,并通过调用将它们包装起来。然而....

  5. 您可能根本无法访问源代码,因此无法执行此操作。这意味着上面的#3可以正常工作。


有两个原因:(1)只是因为,如前所述,相关的盒子上没有root或sudo。(2)“记录器”本身可以转发到远程服务器,但是每条日志行限制为400个字符,这不适用于Apache日志。无论如何,我已经组合了一个定制解决方案,该解决方案完全可以满足我的需要(并且也改进了“记录器”)。请参阅我的“文件记录器”答案
Michael Martinez

4. Syslog不仅仅是我可以打开并向其写入文本的文件流。我编写的旁路必须打开syslog侦听的UDP端口的套接字?
Noumenon

1
@Noumenon,我的意图尚不完全清楚,但是我假设您想将程序输出通过管道传送到系统日志中,这可以通过logger命令完成。linux.die.net/man/1/logger
Avery Payne

@AveryPayne就像Runtime.exec("logger ...")好的,谢谢。
Noumenon

0

我在回答我自己的问题。

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”是我添加的新选项。在这种情况下,我在每个日志行的开头插入本地主机名。

这种解决方案正是我问这个问题时要寻找的解决方案类型,事实证明,直到我自己解决这个问题时,该解决方案才存在。:)


我可能会在某个时候在sourceforge上提供它。它的优点是占地面积小,重量轻,易于使用并且针对性能进行了优化。读取消息文本后,所有处理都在内存缓冲区中完成,然后直接传输到套接字。
Michael Martinez


4
我尽量不苛刻,但我会不客气:该解决方案是不存在的,因为它是可怕的。与其与组织中的其他团队进行交互并实施一个理智的标准解决方案,您还可以使用完全不受支持的代码来进行黑客攻击,现在需要对其进行测试/调试/维护。您轻松地忽略了50多年的综合经验,告诉您“不要那样做”-我希望您不会在自己的脸上炸毁,但是您绝对绝对地这里做错了……
voretaq7

1
是的 对....老兄,这就是开源前进的方式。如果每个人都按照自己的方式去做,那就没有进展。您如何看待GNU,Linux及其所有基于它的东西?人们正在做我在这里所做的事情。如果让您感觉更好,我确实打算将代码放入我们的软件包管理系统中,组织中的每个人都可以随意使用,部署和改进(如果他们愿意)。
Michael Martinez

FYi,这不是一个糟糕的解决方案。相反,这是一个非常有用的工具。上周当我在线搜索解决方案时,我遇到了其他人,问他们在哪里可以找到此确切功能。
Michael Martinez
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.