我有一个在Mono 2.10.9下的Linux机器上运行的程序.它使用log4net登录到Windows 7机器上的程序.我的Linux系统时钟以及Windows机器都设置为本地时间.在每台机器上执行以下命令会产生稍微不同的结果:DateTime now = Da...
我有一个在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的问题.您可能正在做类似的事情.我不确定,因为您没有显示代码的那部分.
本文标题为:c#-Windows和Mono之间的日期时间差异以及log4net远程附加程序
基础教程推荐
- C# 利用PdfSharp生成Pdf文件的示例 2023-04-10
- 关于C#中yield关键字的深入解析 2023-02-02
- Unity实现相机截图功能 2023-02-16
- C#中通过LRU实现通用高效的超时连接探测 2023-01-06
- Unity shader实现顶点动画波动效果 2023-02-16
- C#使用RestClient调用Web API 2023-06-05
- C#操作进程的方法介绍 2023-05-22
- Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践 2023-09-28
- c#动态执行脚本的3种方式详解 2023-07-18
- C#如何绑定多个按钮到同一个事件 2023-05-31