使用 syslog-ng 如何在不丢失日志消息的情况下重置环境变量?

使用 syslog-ng 如何在不丢失日志消息的情况下重置环境变量?

在此系统上,假设有一个程序可以检测是白天还是晚上,并设置环境变量 DAY。我的环境变量 DAY 被拾取并用于以下工作片段:

log {
    source {
        file("/var/log/special/xxx" flags(no-parse) );
    };
    destination {
        file("/var/log/special/yyy" template("`DAY` $MESSAGE\n"));
    };
};

但最终我需要将 DAY 改为“night”。我尝试使用全局变量,但这些变量不会保留在日志消息之间,也不能使用重写规则和设置DAY

我想我可以编写一个脚本,在天黑时运行并更新 /etc/profile.d/day.csh

setenv DAY night

然后执行 systemctl restart syslog-ng

这是否会让我面临丢失一些日志消息的风险?我正在向 tcp() 和 amqp() 目标写入数据,我想这些数据可能会被中止。

HUP 它会更好吗?

我是否遗漏了什么方法?

答案1

如果你也在 syslog-ng 中使用磁盘缓冲区(在版本 3.9 中可用)作为目的地,那么您不应该在该端重新启动期间丢失消息。(顺便说一句,重新加载 syslog-ng 配置应该足够了,例如 syslog-ng-ctl reload)。如果消息速率非常高并且您在源端使用不可靠的协议(例如 UDP),则源端可能会更成问题。

但正如 thrig 所建议的那样,更好的方法是用 Python 编写一个模板函数来查询外部进程/环境变量。

相关内容