我想运行一个 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
(其中echo
和sleep
是用于运行实际 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
还有其他强大的工具可以同时查看多个日志文件,例如多尾