[英]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.