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