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

时间:2016-01-12 22:08:28

标签: c# .net nlog

我有一个运行多线程C#.NET 4.5的应用程序。

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

我的配置文件如下:

我在没有" async = true"

的情况下尝试了这个
<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似乎有用吗?!?

-Confused。

由于 -Ed

2 个答案:

答案 0 :(得分:2)

编辑:这不是一个完整的答案。下面的答案解决了一半的问题。我没有注意到的是,丢失的消息是INFO而不是DEBUG。将我的所有INFO日志转换为DEBUG日志修复了我的问题。似乎即使我可以在本地计算机上输出INFO日志,INFO也可以在我的服务器上运行。仍然不是根本原因。 :(

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

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

所以我(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

答案 1 :(得分:0)

我使用以下代码并正常工作。

 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>