我有一个程序在 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 使用不同的操作系统运行,或者如果主机和 guest 操作系统不同。将本地时区设置为 UTC 可避免这种情况。
关于 Mono 中 DateTime.ToString()
的奇怪输出 - 您是否偶然在 Raspberry Pi 上运行?这是一个已知的错误。参见 this answer以及从那里链接的问题。
我不确定为什么您从 Log4Net 的 LoggingEvent.TimeStamp
获取 UTC 值而不是本地值,因为 these docs说是本地的。但是,您可能正在使用发送 UTC 时间戳的附加程序。在 the FAQ ,有一个问题是关于 RemotingAppender
传输的 UTC。你可能正在做类似的事情。我不确定,因为您没有显示那部分代码。
关于c# - Windows 和 Mono 之间的 DateTime 差异,以及 log4net remote appender,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16803773/