c# - Windows 和 Mono 之间的 DateTime 差异,以及 log4net remote appender

标签 c# datetime mono log4net utc

我有一个程序在 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/

相关文章:

c# - 将数据传递给 C# 中重写的基方法

c# - 以编程方式添加边界字段

asp.net-web-api - 无法在 Mono/xsp4 中加载类型 'System.Web.Http.WebHost.HttpControllerHandler'

.net - 用 mkbundle2 打包后,目标机器提示 libmono.so。为什么?

c# - 如何通过 C# 反射检查一个方法是否可以作为事件的处理程序?

c# - 生成 PDF 时不应用 wkHtmlToPdf css

mysql - 如何加快 MySQL 中 'where MATCH AGAINST and DATETIME' 搜索的速度?

php - 在 Laravel Blade 中获取 2 个日期时间之间的时差?

datetime - 按日期对Pandas DataFrame进行分组

c# - 如何每隔几秒截屏一次C#控制台