我正在使用Nlog将一些日志记录写入文本文件。部分nlog.config:

 <target name="file" xsi:type="File" fileName="${basedir}/MBWRunner_log.txt"
             layout="${date} (${level}): ${message}
Exception: ${exception:format=Method, ToString}"/>

日志文件中的行如下所示:

0001-01-01 00:00:00(Trace):MBWRunner已启动

如您所见,日期和时间均为0。我测试了{longdate}和{date:format = yyyyMMddHHmmss},结果相同。

该应用程序是一个控制台应用程序,从提升的命令行运行。

有什么线索吗?

[编辑]我已经在组织内的2台计算机上对此进行了测试,结果相同。请帮忙!

使用的代码:
  static Logger _logger = LogManager.GetCurrentClassLogger();

public static void Log(string message, LogLevel priority)
    {
      LogEventInfo eventinfo = new LogEventInfo(); ;
      eventinfo.Message = message;
      eventinfo.Level = priority;
      Log(eventinfo);
    }

static void Log(LogEventInfo logentry)
{
  _logger.Log(logentry);
}

最佳答案

更新:

@edosoft我认为问题是您使用LogEventInfo的默认构造函数。如果您在此处查看LogEventInfo的源代码

https://github.com/NLog/NLog/blob/master/src/NLog/LogEventInfo.cs

您会看到,使用默认构造函数不会填充.TimeStamp字段,因此该字段可能仅默认为DateTime的默认值,我假设它是DateTime.MinValue。您应该使用其他构造函数之一或Create方法之一。由于您仅设置“消息”和“级别”字段,因此我建议:

var logEvent = new LogEventInfo(priority, "", message); //Second param is logger name.

要么
var logEvent = LogEventInfo.Create(priority, "", message);

DateLayoutRenderer的NLog源(来自here),我们可以看到写入日志记录流一部分的日期值是这样计算的:
    protected override void Append(StringBuilder builder, LogEventInfo logEvent)
    {
        var ts = logEvent.TimeStamp;
        if (this.UniversalTime)
        {
            ts = ts.ToUniversalTime();
        }

        builder.Append(ts.ToString(this.Format, this.Culture));
    }

这里发生的是DateLayoutRenderer正在从TimeStamp对象获取LogEventInfo值(每次使用Logger.TraceLogger.DebugLogger.Info等方法时,NLog都会创建其中之一。您还可以自己创建LogEventInfo对象并使用Logger.Log记录它们方法)。

默认情况下,创建LogEventInfo对象时,其TimeStamp字段的设置如下(从LogEventInfo here的源)(请注意CurrentTimeGetter.Now的使用):
    public LogEventInfo(LogLevel level, string loggerName, IFormatProvider formatProvider, [Localizable(false)] string message, object[] parameters, Exception exception)
    {
        this.TimeStamp = CurrentTimeGetter.Now;
        this.Level = level;
        this.LoggerName = loggerName;
        this.Message = message;
        this.Parameters = parameters;
        this.FormatProvider = formatProvider;
        this.Exception = exception;
        this.SequenceID = Interlocked.Increment(ref globalSequenceId);

        if (NeedToPreformatMessage(parameters))
        {
            this.CalcFormattedMessage();
        }
    }
TimeStamp字段是使用LogEventInfo属性在TimeSource.Current.Now构造函数中设置的,其实现可以从here中看到。

(更新-在某个时候,NLog从使用CurrentTimeGetter变为了一种更通用的方法,即使用具有多种样式的TimeSource对象(其中一种CachedTimeSourceCurrentTimeGetter本质上相同))。

为了避免浏览链接的麻烦,这是CachedTimeSource的源代码:
public abstract class CachedTimeSource : TimeSource
{
    private int lastTicks = -1;
    private DateTime lastTime = DateTime.MinValue;

    /// <summary>
    /// Gets raw uncached time from derived time source.
    /// </summary>
    protected abstract DateTime FreshTime { get; }

    /// <summary>
    /// Gets current time cached for one system tick (15.6 milliseconds).
    /// </summary>
    public override DateTime Time
    {
        get
        {
            int tickCount = Environment.TickCount;
            if (tickCount == lastTicks)
                return lastTime;
            else
            {
                DateTime time = FreshTime;
                lastTicks = tickCount;
                lastTime = time;
                return time;
            }
        }
    }
}

此类的目的是使用相对便宜的操作(Environment.Ticks)来限制对相对昂贵的操作(DateTime.Now)的访问。如果Ticks的值在每次调用之间都没有变化(从一条记录的消息到另一条记录的消息),则这次检索到的DateTime.Now的值将与DateTime的值相同。最后获取的值。

由于所有这些代码都在起作用(日期/时间记录显然对大多数其他人都有效),对此问题的一种可能解释是,您正在使用Logger.Log方法来记录消息,并且您自己在构建LogEventInfo对象。默认情况下,如果您只是新建一个LogEventInfo对象,则TimeStamp属性的自动设置应该可以正常工作。它仅取决于Environment.TicksDateTime.Now和适当时重用最后一个DateTime.Now值的逻辑。

是否有可能先创建一个LogEventInfo对象,然后将其TimeStamp属性设置为DateTime.MinValue?我问,因为正在记录的日期是DateTime.MinValue

我能想到的唯一其他解释是Environment.Ticks是否由于某种原因返回-1。如果是这样,那么CurrentTimeGetter将始终返回lastDateTime私有成员变量的初始值。我无法想象Environment.Ticks返回-1的情况。

关于date - 为什么nlog无法读取当前日期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13344430/

10-09 19:21