日志文件和夏令时

日志文件和夏令时

Linux 日志文件如何处理夏令时?当你回退时,你不仅会得到无序的值,而且还可能得到重复的值。

我认为我应该将系统时间设置为 UTC,然后将日志文件处理为本地时区,然后再交给日志文件查看器。

答案1

日志文件是纯文本文件,每行都附加在末尾。因此,使用非 UTC 时区时不会丢失数据。

当然,您可能会使用可能会造成混淆的工具来查看文件。但是,使用 UTC 的通常原因是为了避免歧义:您不必知道本地时区即可解释数据。

所以是的,在日志文件中使用 UTC 是好东西, 和经常做,但如果您不这样做,日志文件不会丢失数据。

答案2

日志文件不“处理”时区,它们只是记录某些应用程序或服务在那里写入的内容。因此,如果应用程序“仅写入消息”和“直接写入日志文件”,那么您就不走运了。

一些系统日志服务器(如 syslog-ng)允许您通过时间戳“装饰”“原始”日志数据,其中可以选择使用 UTC 或本地时间(带或不带偏移)。

还有可用的日志记录程序(例如 logger),它可以用作标准输出日志记录和系统日志服务的中间者。

答案3

日志文件可以使用时间格式,例如 ISO 8601 或其同类 RFC 3339,将本地时间显示为 UTC 的调整。

如果时间条目以 Z 结尾,或者以连字符 (8601)、减号或加号结尾,后跟偏移值,则它使用基于 UTC 的格式。

当日志基于 UTC 时,日光显示为偏移量的变化。该偏移量允许明确地指示当地时间和日光。

如果调整时钟,后续条目在时间上仍然可能重叠。

答案4

正如其他人所解释的那样,日志文件的本质是人们无法获得的出故障条目,无论时间戳发生什么情况。您设想的问题是歧义,其中选择不当的时间戳机制不能唯一地表示单个时间点。

这使得糟糕的系统管理员很难通过阅读日志来确定事情发生的时间。事实上,(例如)仅具有时间戳的日志条目Apr 3 02:14:57并不表示该时间是本地时间还是 UTC,也不表示(为了示例,假设它是本地时间,特别是澳大利亚东部时间)是否是 02 :14:57 澳大利亚东部时间或 02:14:57 澳大利亚东部时间。

但这是不公正地假设存在“Linux 日志文件”这样的单一事物。并非所有日志文件都以相同的方式工作,自 20 世纪 80 年代以来,人们一直在放弃这种类型的时间戳。

例如:我们这些多年来一直使用 daemontools 及其同类产品的人已经Linux 日志文件使用 TAI64N 时间戳。日志条目如下所示:

@40000000577d024d2d10bb6d 你好!

这一长串十六进制数字是 TAI64N 时间戳。它只不过是从非常遥远的过去的某个点(1970-01-01 00:00:00 国际原子时间之前的 2 62)开始的 64 位秒计数,后面跟着一个 32 位纳秒计数。

TAI 没有不同的时区变体。它甚至没有重复的“闰”秒。每一秒都有一个唯一的固定数字。

事实上,将这些时间戳处理成人类可读的本地时间正是tai64nlocal程序的工作:

jdebp % echo @40000000577d024d2d10bb6d 你好\! | TZ=UTC0 tai64nlocal
2016-07-06 13:05:45.756071277 您好!
jdebp % echo @40000000577d024d2d10bb6d 你好\! | TZ=PST8PDT tai64nlocal
2016-07-06 06:05:45.756071277 您好!
杰德BP%

时区和 DST 更改对以下内容的影响为零我的“Linux日志文件”,我可以读取任何我想要的时区的日志文件。 (我还可以使用sort's选项将多个日志文件合并排序为一个-m。)

相关内容