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
我使用下面的代码和工作的罚款。
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>
LogManager.GetLogger和LogManager.GetCurrentClassLogger有什么不同?你是多线程的吗?你使用异步吗? –
LogManager.GetCurrentClassLogger()使用当前类的名称初始化Logger对象,但LogManager.GetLogger(“ServerDataSource”)使用您在参数中提供的名称初始化Logger对象。据我所知,记录器是线程安全的。您可以创建一次记录器作为静态变量。 –
嗯......好的。但是......你并没有声明它是静态的:)它听起来像差别就在于命名。 '底线是我稍微不同地实现它,因为我需要一个自定义变量(以便我可以输出类似类的多个实例的实例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
我收到了一条像你一样的评论:“我正要放弃并亲自写下自己的记录器。”对,因为那样你就不会再有问题了!如果只是这么简单。假设“我无法使这个现有的东西起作用”的逻辑错误,因此更好的答案是自己实现它。只是巨大的。 – Howiecamp
'm_logger.Debug()'将在源代码处于DEBUG模式时记录。不是吗?这意味着当您在服务器上发布源代码时,这些二进制文件将以RELEASE模式运行。这意味着它会跳过日志记录。你不觉得吗? – Savaratkar
而你提到过,在你的服务器上,你从VS运行源代码,因此你再次以DEBUG模式运行它。对? – Savaratkar
你是对的。我尝试了几种方法在服务器上运行。我发现“释放”需要目标系统上的“安装”,因此很难找到配置文件,所以我现在只需复制整个bin/Debug目录。无论如何,Logger.Debug日志工作。这是失踪的Logger.Info。 –