为什么log4net条目在某些侦听器中会“丢失”

时间:2010-01-18 16:52:58

标签: c# log4net

这个真让我挠头......

我在应用程序中使用log4net(目前版本为1.2.10)已有一段时间了。在为应用程序添加新选项时,我注意到即使log4net Debug,Error等方法从控制台appender没有看到来自该日志源的调用项。

检查了显而易见的事情(比如确保没有过滤),我注意到其他一些奇怪的东西。如果我有多个appender(例如日志文件appender和UDP appender),那么appender有时会看到日志消息的不同子集。他们看到哪个子集似乎是随机的,但通常在问题发生时,他们将无法看到来自给定日志源的所有消息。

为什么会发生这种情况,我该怎么办呢,因为丢失的消息意味着无法信任日志文件以显示远程故障的准确图片?

[以下附加信息于2010年1月19日添加]

我终于好好看看响应调用

传回的ILog对象
LogManager.GetLogger(typeof (MyTypeHere));

在某些情况下,我得到一个ILog对象,其Debug,Info,Warning,Error等设置为false。在其他情况下,ILog对象将它们正确设置为true。由于我的代码没有操作那些标记,在我的代码被传递的情况下,来自我的代码的“禁用”ILog对象消息(可以理解)根本不会传播。

我仍然无法解释两个appender之间明显的差异。

3 个答案:

答案 0 :(得分:1)

我们经常一起使用日志文件,控制台和smtp appender,我们似乎没有这些问题。在某些情况下,一些appender会因为其固有的性质而丢失消息。例如,由于传输机制,UDP appender不能保证传输所有消息。 SMTP appender也会发生同样的事情。如果您使用的是通用日志文件但是从多个进程进行日志记录,则有时该文件会被另一个进程锁定(这通常会引发异常,但可能会被代码中的某个位置捕获),因此请务必设置Minimal Lock属性在上面。此外,appender可以缓冲,因此如果进程崩溃,log4net可能没有机会清除缓冲的数据。

最后,最可靠的appender是那些在本地登录的appender,例如文件和事件日志追加器,但是你必须收获所有日志。如果要集中记录,可能需要考虑记录到数据库或消息队列。

答案 1 :(得分:1)

我是否正确理解某些通常成功记录的消息在某些时候突然停止出现(被记录)?如果是这种情况,那么我建议打开log4net的内部日志记录。另外用log4net代码调试问题(你的问题我建议在Logger类中使用CallAppenders方法。它会告诉你实际上会为日志记录事件调用哪些appender)。

如果某些消息一直没有被记录,那么我会查看log4net配置。检查是否设置了任何级别/阈值,更重要的是,如果您使用记录器,请检查其名称并确保您放入LogManager.GetLogger(...)调用的任何内容的前缀与配置中的名称记录器匹配。< / p>

我加倍jvilalta说的话。我多年来一直在使用log4net和许多类型的appender,我没有看到只有一些appender而不是所有appender都会丢失消息的情况。

答案 2 :(得分:0)

我知道这已经过时了,但我最近在asp.net mvc应用程序中发生了这种情况,追踪真的很令人沮丧。它似乎发生在使用ValidateInput(false)属性的方法上。

我的猜测是,使用此属性会跳过初始化log4net在记录时尝试访问的一些数据。我发现在web.config中添加以下内容修复了问题:

<httpRuntime requestValidationMode="2.0" />

当然它有其他副作用(与记录无关)。