这个真的让我摸不着头脑....
我在应用程序中使用 log4net(当前版本 1.2.10)已有一段时间了。在向应用程序添加新选项时,我注意到即使 log4net Debug、Error 等方法被调用,控制台附加程序也看不到来自该日志源的项目。
检查了明显的内容(比如确保不涉及过滤)后,我注意到其他一些奇怪的事情。如果我有多个附加程序(例如日志文件附加程序和 UDP 附加程序),那么附加程序有时会看到日志消息的不同子集。他们看到的子集似乎是随机的,但通常当问题发生时,他们将无法看到来自给定日志源的所有消息。
为什么会发生这种情况,我该怎么办,因为丢失的消息意味着无法信任日志文件来显示远程故障的准确图片?
[以下附加信息于 2010 年 1 月 19 日添加]
我终于仔细查看了响应调用而传回的 ILog 对象
LogManager.GetLogger(typeof (MyTypeHere));
在某些情况下,我得到一个 ILog 对象,其中 Debug、Info、Warning、Error 等设置为 false。在其他情况下,ILog 对象将它们正确设置为 true。由于我的代码对这些标志没有任何操作,因此在传递我的代码时,来 self 的代码的“禁用”ILog 对象消息(可以理解)根本不会传播。
我仍然无法解释两个附加程序之间明显的差异。
最佳答案
我们经常一起使用日志文件、控制台和 smtp 附加程序,我们似乎没有这些问题。在某些情况下,某些 appender 可能会因为其固有特性而丢失消息。例如,由于传输机制的原因,UDP appender 不能保证传输所有消息。 SMTP appender 也会发生同样的事情。如果您使用一个公共(public)日志文件但从多个进程记录日志,有时该文件会被另一个进程锁定(这通常会引发异常,但它可能会在您的代码中的某处被捕获),因此请务必设置 Minimal Lock 属性在上面。此外,appender 可以被缓冲,因此如果进程崩溃,log4net 可能没有机会清除缓冲的数据。
最后,最可靠的附加程序是那些在本地记录的附加程序,例如文件和事件日志附加程序,但是您必须收集所有日志。如果您想集中记录,您可能需要考虑记录到数据库或消息队列。
关于c# - 为什么某些监听器中的 log4net 条目可能会变为 "missing",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2087675/