Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么log4net条目会消失;“失踪”;在一些听众中_C#_Log4net - Fatal编程技术网

C# 为什么log4net条目会消失;“失踪”;在一些听众中

C# 为什么log4net条目会消失;“失踪”;在一些听众中,c#,log4net,C#,Log4net,这一次真让我抓狂 我在应用程序中使用log4net(当前版本为1.2.10)已经有一段时间了。在向应用程序添加一个新选项时,我注意到,即使从该日志源调用log4net调试、错误等方法,控制台appender也看不到它们 在检查了明显的(比如确保没有涉及过滤)之后,我注意到了一些奇怪的事情。如果我有多个appender(例如日志文件appender和UDP appender),那么appender有时会看到日志消息的不同子集。他们看到的子集似乎是随机的,但通常当问题发生时,他们将无法看到来自给定日

这一次真让我抓狂

我在应用程序中使用log4net(当前版本为1.2.10)已经有一段时间了。在向应用程序添加一个新选项时,我注意到,即使从该日志源调用log4net调试、错误等方法,控制台appender也看不到它们

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

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

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

最后,我仔细查看了ILog对象在响应调用时被传回的情况

LogManager.GetLogger(typeof (MyTypeHere));
在某些情况下,我得到的ILog对象的Debug、Info、Warning、Error等设置为false。在其他情况下,ILog对象将其正确设置为true。由于我的代码没有对这些标志进行任何操作,因此在传递代码时,来自代码的“禁用”ILog对象消息(可以理解)根本不会传播


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

我们经常一起使用日志文件、控制台和smtp appender,我们似乎没有这些问题。在某些情况下,某些附加器可能会由于其固有的特性而丢失消息。例如,由于传输机制的原因,UDP附加器不能保证传输所有消息。SMTP追加器也会发生同样的情况。如果您使用的是一个公共日志文件,但从多个进程进行日志记录,则有时该文件会被另一个进程锁定(这通常会引发异常,但它可能会在代码中的某个地方被捕获),因此请确保对其设置最小锁定属性。此外,appender可以被缓冲,因此如果出现进程崩溃,log4net可能没有机会刷新缓冲数据


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

< P>我是否正确理解一些正常登录的消息在某个时刻突然停止出现(被记录)?如果是这样,那么我建议打开log4net的内部日志记录。另外,用log4net代码调试这个问题(对于您的问题,我建议在Logger类中中断CallAppenders方法。它将告诉您日志事件实际将调用哪些appenders)

如果一些消息始终没有被记录,那么我将查看log4net配置。检查是否设置了任何级别/阈值,更重要的是,如果您使用的是Logger,请检查它们的名称,并确保输入LogManager.GetLogger(…)调用的前缀与配置中的Logger名称匹配


我把jvilalta说的话翻了一番。多年来,我一直在使用log4net处理许多类型的Appender,我没有看到只有部分Appender会丢失消息,而不是所有Appender都会丢失消息的情况。

我知道这很旧,但我最近在asp.net mvc应用程序中遇到过这种情况,跟踪这种情况确实令人沮丧。这似乎发生在使用
ValidateInput(false)
属性的方法上

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

<httpRuntime requestValidationMode="2.0" />


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

是否涉及缓冲?我知道我的文件不会立即更新。。。如果某个时候出了问题,可能缓冲区永远不会被发送到appender?嗨,你知道这件事的底细了吗?我在AdoNetAppender和RollingLogFile Appender之间遇到了同样的问题。不,我从未完全解决过这个问题,但是发现问题的代码片段被重写了,ILog对象偶尔出现,所有记录器都被禁用了。我们最好的猜测是,可能存在某种奇怪的争用条件,这偶尔会导致GetLogger调用返回在日志初始化完成之前实例化的记录器。这也是我第一次看到这个问题。在过去,我使用log4net只获得了很好的结果(并且从来没有担心过条目丢失——至少在使用基于文件的附加程序时是如此)。奇怪的是,它似乎依赖于执行。对于给定的应用程序运行,来自事件源X的项目可能会被记录,也可能不会被记录。。。但是它们的存在(或不存在)对于应用程序的执行是一致的。关于像UDP这样的非本地附加器,这是一个好的观点。我发现非常奇怪的一点是,UDP附加器实际上捕获了比控制台附加器更多的内容。正如我也向Konrad评论的那样,问题似乎取决于执行。对于给定的应用程序运行,来自事件源X的项目可能会被记录,也可能不会被记录。。。但他们的存在(或不存在)在那次竞选中是一致的,这很奇怪。您是从应用程序运行的线程进行日志记录,还是在写入日志时使用线程池或其他线程机制?日志条目(或至少应该)来自应用程序线程,或通过QueueUserWorkItem机制使用线程池处理的工作项。来自两个线程的日志条目