c#-Windows和Mono之间的日期时间差异以及log4net远程附加程序

我有一个在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 – Kind local

在Linux上我得到

0/735016/0001 8:39:45 PM – Kind local

看来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上运行?这是一个已知的错误.请参阅this answer和从那里链接的问题.

我不确定为什么您从Log4Net的LoggingEvent.TimeStamp中获取UTC值而不是本地值,因为these docs表示它是本地的.但是,有可能您使用的是发送UTC时间戳的附加程序.在the FAQ中,存在一个有关RemotingAppender传输的UTC的问题.您可能正在做类似的事情.我不确定,因为您没有显示代码的那部分.

上一篇:转换为单击一次应用程序或exe后为什么不进行日志记录?


下一篇:C#-Log4net附加程序始终为空