合并来自不同 runit 服务的 svlogd 日志

合并来自不同 runit 服务的 svlogd 日志

我想运行一个 Node.js 应用程序,其中多个 Node 进程运行完全相同的代码。我在用着运行启动和管理 Node 进程,因为它有好厨师支持。为了说明设置,假设我正在运行 2 个 runit 服务目录:

/etc/sv/test-1/run

#!/bin/sh
echo running test 1
sleep 9999

/etc/sv/test-2/run

#!/bin/sh
echo running test 2
sleep 9999

(其中echosleep是用于运行实际 Node 应用程序的测试占位符。)

这很好用...除了默认情况下,runit程序svlogd希望将每个服务的日志放在单独的目录中。问题是,我不想在多个位置查看一个应用程序的所有日志条目。

我第一次尝试写入svlogd同一个日志文件如下所示:

/etc/sv/test-1/log/run

#!/bin/sh
exec svlogd -tt /var/log/test

/etc/sv/test-2/log/run

#!/bin/sh
exec svlogd -tt /var/log/test

只是这个不行。无论哪个日志服务先启动,都运行良好。第二个启动的日志服务不会运行,因为它被另一个日志服务锁定。为了显示:

$ sudo /etc/service/test-2/log/run
svlogd: warning: unable to lock directory: /var/log/test: temporary failure
svlogd: fatal: no functional log directories.

有什么更好的方法来设置它?如何才能在一个地方查看runit运行相同代码的不同服务的所有日志条目?

答案1

据我所知,svlogd不支持将日志合并到单个文件中。但是,它确实支持记录到套接字。我的解决方法是指示svlogd通过 UDP 将日志条目转发到正在运行的系统日志实例。

/etc/sv/test-1/log/run

#!/bin/sh
exec svlogd -tt /var/log/test/1

/var/log/test/1/config

ptest-1: 
U127.0.0.1

/etc/sv/test-2/log/run

#!/bin/sh
exec svlogd -tt /var/log/test/2

/var/log/test/2/config

ptest-2: 
U127.0.0.1

从那里开始,只需配置 rsyslog 来执行您想要的操作即可。

答案2

使用“记录器”记录系统日志

如果您对 syslog 感到满意,请使用logger代替svlogd。为记录器提供运行脚本的全部意义在于,您可以运行任何您喜欢的程序来进行日志记录。

/etc/sv/test-1/log/run

#!/bin/sh
exec logger -i -p daemon.notice -t my_service

查看时合并

另一个好主意是让日志位于不同的位置,然后使用脚本在您查看文件时将它们合并在一起。例如,使用时间戳,svlogd您可以

cat /var/log/test/*/current | sort | less

还有其他强大的工具可以同时查看多个日志文件,例如多尾

相关内容