簡體   English   中英

Windows和Mono以及log4net遠程appender之間的DateTime差異

[英]DateTime differences between Windows and Mono, and log4net remote appender

我在Mono 2.10.9下的Linux機器上運行程序。 它使用log4net登錄到Windows 7機器上的程序。 我的Linux系統時鍾設置為本地時間,以及我的Windows機器。 執行以下操作會在每台計算機上產生稍微不同的結果:

DateTime now = DateTime.Now;
Console.WriteLine(String.Format("{0} - Kind {1}", now, now.Kind));

在Windows上,我明白了

5/28/2013 8:39:09 PM - 親切的當地人

在Linux上,我得到了

0/735016/0001 8:39:45 PM - 親切的當地人

似乎轉換在Mono中已損壞,但這是另一天的另一個問題。

在我從Linux機器接收的LoggingEvent對象中, TimeStamp字段實際上包含UTC時間,而不是本地時間。 但是, TimeStamp.Kind屬性是Local

這引起了我的問題,因為源自Windows的日志事件實際上是本地的,而Mono的日志事件是UTC,我無法區分Kind ,看起來很有趣的是創建了日志消息分開的時刻看起來他們相隔5個小時。

我該怎么做才能解決這個問題?

最佳做法是始終將日志時間記錄為UTC:

DateTime now = DateTime.UtcNow;

這避免了幾個問題:

  • 夏令時開始時的間隙
  • 夏令時停止時的復制/模糊
  • 由於時區設置,來自不同計算機的日志文件未對齊

此外,如果這些是您正在討論的服務器 ,則還應將計算機的時區設置為UTC。 這樣,系統上的其他日志也會在同一時間匹配,即使它們被設置為記錄本地值。

另外,請注意Windows希望將計算機BIOS設置為本地時間,而Linux則希望將其設置為UTC。 如果多個VM使用不同的操作系統運行,或者主機和客戶機操作系統不同,這可能會導致一些有趣的行為,特別是對於虛擬機。 將本地時區設置為UTC可以避免這種情況。

關於Mono中DateTime.ToString()的奇怪輸出 - 您是否偶然在Raspberry Pi上運行? 這是一個已知的錯誤。 請參閱此答案以及從那里鏈接的問題。

我不確定你為什么從Log4Net的LoggingEvent.TimeStamp獲取UTC值而不是本地值,因為這些文檔說它是本地的。 但是,您可能正在使用發送UTC時間戳的appender。 常見問題解答中 ,有一個問題涉及由RemotingAppender傳輸的UTC。 你可能會做類似的事情。 我不確定,因為你沒有顯示你的部分代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM