在此系统上,假设有一个程序可以检测是白天还是晚上,并设置环境变量 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 编写一个模板函数来查询外部进程/环境变量。