syslog-ng:时区更改和 $HOUR 宏

syslog-ng:时区更改和 $HOUR 宏

以下是来自设备的 UTC 日志行:

<166>2023-06-13T16:03:44Z ..................

我们将其存储在欧洲/伦敦时区的文件中:

destination d_all {
    file("/srv/logs/$HOST-$FACILITY-$YEAR-$MONTH-$DAY-$HOUR.log"
         time_zone("Europe/London");
};

此处time_zone("Europe/London")的工作原理是日志行本身已转换。但是,文件名中的 $HOUR 坚决不会偏离 UTC,最终导致日志未归档到正确的位置(它们在夏季会偏离一个小时)。

如何更新 $HOUR 以使用目标节中指定的时区?文档似乎说“当目标文件名中使用宏扩展时,将使用本地时区。“,但这不是我的经验,因为欧洲/伦敦是我的当地时区,但它选择了正在接收的日志文件的$HOUR。

我无法更改设备的时区。很遗憾,这就是现状。

这是在运行3.28.1-2+deb11u1

答案1

重申评论中的观点,如果文件目标包含宏,则文件名部分将使用 syslog-ng 所知道的本地时区。本地时区的默认值是根据系统设置(例如 /etc/localtime 文件)检测的,但也可以在 syslog-ng 中覆盖。

要覆盖本地时区,可以使用 local-time-zone() 选项,该选项在全局选项块中均有效:

options { local-time-zone("EST"); };

或者在文件目标声明中:

destination d_all {
    file("/install/log.$HOUR" local-time-zone("EST"));
};

如果您认为系统的默认时区设置正确,请查看“date”命令报告的内容:

$ date
Thu Jul  6 12:15:34 UTC 2023

这表明我的本地时区指向 UTC(这是在容器中)。如果我使用主机的 date 命令:

 date
Thu Jul  6 02:16:20 PM CEST 2023

例如,它现在使用 CEST。此设置由 /etc/localtime 控制,在我的系统 (Debian) 上是这样的:

$ ls -l /etc/localtime
lrwxrwxrwx 1 root root 35 Jun 19 18:58 /etc/localtime -> /usr/share/zoneinfo/Europe/Budapest

其他发行版可能以不同的方式实现这一点(例如,复制文件而不是符号链接),并且大多数发行版还具有某种用于更改此设置的高级界面。

相关内容