我目前正在使用log4net构建一个ASP.Net-MVC应用程序进行日志记录,但是记录器似乎只是随意停止。它会愉快地记录一段时间,然后停止,然后在一段时间后再次启动。我甚至不确定是什么让它恢复记录。我不是在谈论丢失的一些消息 - 有时它会长时间消失,例如一小时左右。
为什么会像这样停下来开始?我应该如何正确配置它,以便它不会随意停止?
这是我的配置:
<log4net debug="true">
<appender name="RollingLogFileAppender"
type="log4net.Appender.RollingFileAppender">
<file value="..\Logs\\CurrentLog.txt" />
<appendToFile value="true" />
<datePattern value="yyyyMMdd" />
<rollingStyle value="Date" />
<filter type="log4net.Filter.LevelRangeFilter">
<acceptOnMatch value="true" />
<levelMin value="INFO" />
<levelMax value="FATAL" />
</filter>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern
value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" />
</layout>
</appender>
<root>
<level value="INFO" />
<appender-ref ref="RollingLogFileAppender" />
</root>
答案 0 :(得分:57)
Log4Net将fail silently如果出现问题并且无法写入其appender。这实际上是一件好事,因为它意味着一些失败的日志记录不会导致一个健康的系统崩溃,但是当一些东西没有像你期望的那样记录时会很烦人。
最好的办法是打开log4net自己的internal logging进行一些诊断,并(希望)找出失败的原因。
所以在你的app的配置文件中添加:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="log4net.Internal.Debug" value="true"/>
</appSettings>
</configuration>
将打开内部日志记录,并将其发送到System.Diagnostics.Trace
,以便您添加:
<configuration>
...
<system.diagnostics>
<trace autoflush="true">
<listeners>
<add
name="textWriterTraceListener"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="C:\tmp\log4net.txt" />
</listeners>
</trace>
</system.diagnostics>
...
</configuration>
将其捕获到文件中。
答案 1 :(得分:1)
尽早在应用程序生命周期中发送测试日志消息,只需要一个简单的LogManager.GetLogger("Init").Info("Starting logging")
即可。如果其他一些引用的代码首先开始记录,那么初始化过程的一部分可能会失败(因为它从另一个程序集加载设置,它只执行一次)。
请在此处阅读:https://logging.apache.org/log4net/release/faq.html#first-log
答案 2 :(得分:0)
还要检查是否仍在AssemblyInfo.cs文件中配置了log4net。在我的情况下,签到导致在此文件中删除以下行:
[assembly:log4net.Config.XmlConfigurator(Watch = true)]
这又导致log4net停止记录...
答案 3 :(得分:0)
在与Log4Net纠缠了一段时间之后,我发现它将完全停止记录。不管我尝试了什么,我都无法将其恢复正常工作。似乎在您未在代码的前几行中初始化日志时会出现问题,但是模糊指示不足以使我可靠地使日志在另一个程序加载的dll中工作,依此类推。
我也从未设法激活内部日志。
我最终决定创建一个专用的dll,我的程序可以调用该dll以使用Log4Net可靠地创建日志。 dll仅执行此操作,创建日志的代码被隔离,并且永不更改。我认为通过这种方式,我将能够可靠地创建日志文件并将其写入。到目前为止,这种方法已经解决了我花费了无数令人沮丧的时间进行登录的问题。
我在此SO线程上发布了代码: