NLog正在跳过日志消息。 .NET的问题?多线程问题?

问题描述:

我有一个多线程的C#.NET 4.5应用程序正在运行。NLog正在跳过日志消息。 .NET的问题?多线程问题?

在我的本地Windows 7笔记本电脑上运行,NLog记录我的所有消息。 我使用Visual Studio发布应用程序...将发布的应用程序复制到Windows Server 2008 ...并在服务器上运行该应用程序:这会导致跳过的日志消息。有人可以帮助我理解为什么以及我如何解决这个问题或建议替代NLog?

我的配置文件如下:

我已经试过这没有“异步=真正的”

<targets async="true"> 


    <target xsi:type="ColoredConsole" 
      name="ColoredConsole" 
      layout="${date} ${level} ${message} ${event-context:item=AlgID} " /> 

    <target name="xmlfile" xsi:type="File" 
      fileName="C:\QRT\Logs\LogEmiter.Nlog.xlog" keepFileOpen="true" 
      layout="${log4jxmlevent}" /> 

    <target xsi:type="File" 
      name ="LogFile" fileName="C:\QRT\Logs\QRTLog-${shortdate}.log" 
      layout ="${date:format=yyyy-MM-dd HH\:mm\:ss.fff}|${level}|${threadid}|${threadname}|${event-properties:item=FromID}|${message}${exception:format=tostring} "/> 

    <target xsi:type="File" 
      name ="TapeLogFile" fileName="C:\QRT\Logs\QRTMarketLog.txt" 
      layout ="${date:format=yyyy-MM-dd HH\:mm\:ss.fff}|${level}|${message}"/> 

    </targets> 
    <rules> 
     <!-- add your logging rules here --> 

     <logger name ="TapeLogFile" minlevel="Trace" writeTo="TapeLogFile" /> 
     <logger name ="TapeLogFile" minlevel="Trace" writeTo="ColoredConsole" final="true"/> 
     <logger name="*" minlevel="Trace" writeTo="ColoredConsole" /> 
     <logger name="*" minlevel="Trace" writeTo="xmlfile" /> 
     <logger name="*" minlevel="Trace" writeTo="LogFile" /> 


     <!-- 
     Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace) to "f" 
     <logger name="*" minlevel="Debug" writeTo="f" /> 
     --> 
     </rules> 
    </nlog> 

我登录的消息是这样的:

在我典型的课,我会初始化我的NLog帮助类,如下:

private void InitliazlieLogger() 
    { 
     LogManager.ThrowExceptions = true; 
     m_logger = new NLogHelper(LogManager.GetCurrentClassLogger()); 
     m_logger.Set("FromID", "Email"); // Class setting. 
    } 

private void DoSomething(int _x) 
{ 
    m_logger.Debug ("Print this statement: {0}", _x); 
} 

我有一个NLog辅助类...

public NLogHelper(Logger Logger) 
{ 
    m_logger = Logger; 
    m_properties = new Dictionary<string, object>(); 
} 

public void Debug(string Message, params object[] Args) 
     { 
      m_logger.Debug() 
       .Message(Message, Args) 
       .Properties(m_properties) 
       .Write(); 
      notify(Severity.Debug, Message); 
     } 

问题是某些日志消息只是跳过了。 我添加了自己的日志记录类,它手动写入文件,并将调用插入到NLogHelper.Debug中,我发现手动写入的文件有一整套日志消息,但NLog输出缺少一些。

此外,这可以在我的笔记本电脑上使用,但在Windows Server 2008上失败。我的服务器安装了.NET 4.6.1。我的Windows 7机器似乎只有4.5.2。这可能吗?作为一个方面说明:如果我上传我的所有源文件的服务器并在服务器上使用Visual Studio编译完全相同的代码,NLog似乎可以工作?!???????????????????

- 集中。

感谢 -Ed

+0

'm_logger.Debug()'将在源代码处于DEBUG模式时记录。不是吗?这意味着当您在服务器上发布源代码时,这些二进制文件将以RELEASE模式运行。这意味着它会跳过日志记录。你不觉得吗? – Savaratkar

+0

而你提到过,在你的服务器上,你从VS运行源代码,因此你再次以DEBUG模式运行它。对? – Savaratkar

+0

你是对的。我尝试了几种方法在服务器上运行。我发现“释放”需要目标系统上的“安装”,因此很难找到配置文件,所以我现在只需复制整个bin/Debug目录。无论如何,Logger.Debug日志工作。这是失踪的Logger.Info。 –

我使用下面的代码和工作的罚款。

public class ServerDataSource : IDataSource 
    { 
     private Logger _log; 
     public ServerDataSource() 
     { 
      _log = LogManager.GetLogger("ServerDataSource"); 
     } 
     public bool DoSomething() 
     { 
      try 
      { 
        _log.Info("Doing something"); 

      } 
      catch (Exception ex) 
      { 
       _log.Error("Error occurred" + ex.Message); 
      } 
     } 
} 

配置为如下

<configSections> 
    <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/> 
    </configSections> 

+0

LogManager.GetLogger和LogManager.GetCurrentClassLogger有什么不同?你是多线程的吗?你使用异步吗? –

+0

LogManager.GetCurrentClassLogger()使用当前类的名称初始化Logger对象,但LogManager.GetLogger(“ServerDataSource”)使用您在参数中提供的名称初始化Logger对象。据我所知,记录器是线程安全的。您可以创建一次记录器作为静态变量。 –

+0

嗯......好的。但是......你并没有声明它是静态的:)它听起来像差别就在于命名。 '底线是我稍微不同地实现它,因为我需要一个自定义变量(以便我可以输出类似类的多个实例的实例ID ...例如StudentID)。 '仍然不明白为什么我的实施不正确? –

编辑:这不是一个完整的答案。下面的答案解决了一半的问题。我没有注意到的是缺少的信息是INFO而不是DEBUG。将我所有的INFO日志转换为DEBUG日志解决了我的问题。看来,即使我可以在本地机器上输出INFO日志,INFO也可以在我的服务器上运行。仍然不是由根造成的。 :(

嗯,我认为工作系统(我的笔记本电脑运行Windows 7)和服务器(运行Window Server 2008)之间的唯一区别是Windows版本和.NET版本安装。

这个问题是事实,感谢Sibers发现这一点,事实上服务器有多个硬件CPU,其多线程比我的笔记本电脑更接近真正的多线程。 NLog发布了错误消息,但我没有看到它们。它试图自己写。

所以I(Sibers)改变:

<target xsi:type="File" 
     name ="LogFile" fileName="C:\QRT\Logs\QRTLog-${shortdate}.log" 
     layout ="${date:format=yyyy-MM-dd HH\:mm\:ss.fff}|${level}|${threadid}|${threadname}|${event-properties:item=FromID}|${message}${exception:format=tostring} "/> 

<target name="asyncWrapper" xsi:Type="AsyncWrapper" queueLimit="20000"> 
     <target name="LogFile" 
      xsi:type="File" 
      fileName="C:\QRT\Logs\QRTLog-${shortdate}.log" 
      layout="${date:format=yyyy-MM-dd HH\:mm\:ss.fff}|${level}|${threadid}|${threadname}|${event-properties:item=FromID}|${message}${exception:format=tostring} " 
      concurrentWrites="true" /> 
    </target> 

问题固定。 男人...花了我一个月!我正要放弃并亲自写下我自己的记录器。

-Ed

+0

我收到了一条像你一样的评论:“我正要放弃并亲自写下自己的记录器。”对,因为那样你就不会再有问题了!如果只是这么简单。假设“我无法使这个现有的东西起作用”的逻辑错误,因此更好的答案是自己实现它。只是巨大的。 – Howiecamp