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
。)