![使用 syslog-ng 如何在不丢失日志消息的情况下重置环境变量?](https://linux22.com/image/697940/%E4%BD%BF%E7%94%A8%20syslog-ng%20%E5%A6%82%E4%BD%95%E5%9C%A8%E4%B8%8D%E4%B8%A2%E5%A4%B1%E6%97%A5%E5%BF%97%E6%B6%88%E6%81%AF%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E9%87%8D%E7%BD%AE%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%EF%BC%9F.png)
在此系统上,假设有一个程序可以检测是白天还是晚上,并设置环境变量 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 编写一个模板函数来查询外部进程/环境变量。