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