3

我有一个在 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 上,我得到

2013 年 5 月 28 日晚上 8:39:09 - 当地人

在Linux上我得到

0/735016/0001 8:39:45 PM - 当地人

看来转换在 Mono 中已损坏,但这是另一天的另一个问题。

LoggingEvent我从 Linux 机器收到的对象中,该TimeStamp字段实际上包含 UTC 时间,而不是本地时间。但是,TimeStamp.Kind属性是Local

这给我带来了问题,因为源自 Windows 的日志事件确实是本地的,而来自 Mono 的日志事件是 UTC,我无法区分Kind,而且创建时刻的日志消息看起来很有趣分开看起来他们相隔5个小时。

我能做些什么来解决这个问题?

4

1 回答 1

4

最佳做法是始终将日志时间记录为 UTC:

DateTime now = DateTime.UtcNow;

这避免了几个问题:

  • 夏令时开始时的间隙
  • 夏令时停止时的重复/歧义
  • 由于时区设置,来自不同机器的日志文件未对齐

此外,如果这些是您正在谈论的服务器,您还应该将机器的时区设置为 UTC。这样,系统上的其他日志也将同时匹配,即使它们被设置为记录本地值。

另外,请注意 Windows 希望将计算机 bios 设置为本地时间,而 Linux 希望将其设置为 UTC。这可能会导致一些有趣的行为,特别是对于虚拟机,如果多个 VM 运行不同的操作系统或者主机和来宾操作系统不同。将本地时区设置为 UTC 可以避免这种情况。

关于DateTime.ToString()Mono 的奇怪输出——你是不是碰巧在树莓派上运行?这是一个已知的错误。请参阅此答案以及从那里链接的问题。

我不确定您为什么要从 Log4Net 获取 UTC 值而不是本地值LoggingEvent.TimeStamp,因为这些文档说它是本地的。但是,您可能正在使用发送 UTC 时间戳的附加程序。在常见问题解答中,有一个关于 UTC 传输的问题RemotingAppender。你可能正在做类似的事情。我不确定,因为您没有显示代码的那部分。

于 2013-05-31T02:16:10.503 回答