C# Log4Net正在创建文件,但未写入该文件
最近我遇到了一个让Log4Net工作()的问题,但在那之后就没问题了 由于我需要开发一些模块,日志记录也有点落后,所以我已经把它放在后面一段时间了。现在我看到了,我甚至尝试更改日志文件的名称和位置(静态设置),它正在创建日志文件,但在这两种情况下都没有写入任何内容 这是我的log4Net配置文件:C# Log4Net正在创建文件,但未写入该文件,c#,entity-framework-6,log4net,log4net-configuration,audit-logging,C#,Entity Framework 6,Log4net,Log4net Configuration,Audit Logging,最近我遇到了一个让Log4Net工作()的问题,但在那之后就没问题了 由于我需要开发一些模块,日志记录也有点落后,所以我已经把它放在后面一段时间了。现在我看到了,我甚至尝试更改日志文件的名称和位置(静态设置),它正在创建日志文件,但在这两种情况下都没有写入任何内容 这是我的log4Net配置文件: readonly ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().Declari
readonly ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
我在web.config中添加了以下内容:
<appSettings>
<add key="log4net.Internal.Debug" value="true"/>
</appSettings>
<system.diagnostics>
<trace autoflush="true">
<listeners>
<add
name="textWriterTraceListener"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="C:\log4net.txt" />
</listeners>
</trace>
</system.diagnostics>
请注意,我已经删除了我以前没有看到的第一部分,我认为它是多余的
<!--<appender name="console" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %level %logger - %message%newline" />
</layout>
</appender>-->
请检查您的应用程序是否对日志文件的目标文件夹具有写入权限,
这种事情有时会导致真正的痛苦
除此之外,其他一切看起来都很好。+1感谢您在问题中加入调试/跟踪日志。
消息log4net:Configuring Repository[log4net default Repository]
多次出现在此日志中,看起来配置设置了两次,一次是通过XmlConfigurator属性设置的,第二次是通过调用XmlConfigurator.Configure()代码>
检查XmlConfiguratorAttribute
的源代码发现,它在内部对XmlConfigurator.Configure(…)进行了类似的调用代码>
事情就是这样
XmlConfiguratorAttribute
最初按照log4net.config
文件中的定义设置记录器和附加器,并创建空的ApplicationLogging.log
文件
然后调用XmlConfigurator.Configure()
使用web.config
(默认位置)中的配置覆盖这些记录器和附加器,该配置不包含任何内容,因为您正在使用单独的log4net.config
文件。
因此,您最终没有任何追加器
,并且不会记录任何内容
解决方案是应用XmlConfiguratorAttribute
或调用XmlConfigurator.Configure()
以及log4net.config
文件的路径(XmlConfigurator.Configure(新文件信息(“log4net.config”)
),但是不要同时做这两件事,它是登录到控制台的吗?不是,因为我没有任何控制台,它是一个MVC web应用程序。那么为什么你有一个控制台附加器呢?为什么在log4net配置文件中有一个
部分?无论如何,我建议您看看它报告了什么。我不知道这是否与您的问题有关,但您正在将RollingFile属性设置为size,这意味着您希望在旧文件变重时拥有新文件。第
行表示只有一个文件将用于日志记录。这可能会让你以后有点头疼,即使它没有引起这个问题。奇怪的是,在调试/跟踪日志中多次看到配置存储库[log4net default repository]
;就像配置了两次一样。能否删除XmlConfigurator.Configure()代码>。还要添加
,以确保立即刷新内部缓冲区。这不是答案,应该是注释。@Barr J,我确信我的应用程序拥有目标文件夹的权限,以确保我已将路径设置为与“log4net.internal.Debug”相同的目录,该目录正在正确创建和写入(如stuartd所建议)。更改路径、名称或扩展也没有帮助。使用web.config.original post updated中添加的配置设置更新原始post。我试着删除控制台appender的ref以及部分,只留下file部分和ref,但我的文件中仍然没有任何内容…@BarrJ,也不起作用。调试时,我查看了Appender对象本身,这就是我得到的:。计数不应该大于0吗?非常感谢您提供了解释清楚的解决方案!这完全有道理,但老实说,我不会想到这一点。也谢谢你stuartd,因为你,我能够介绍“调试/跟踪日志”,它最终给出了答案!我喜欢stackoverflow及其用户:)
context.Database.Log = (dbLog => logger.Debug(dbLog));
<appSettings>
<add key="log4net.Internal.Debug" value="true"/>
</appSettings>
<system.diagnostics>
<trace autoflush="true">
<listeners>
<add
name="textWriterTraceListener"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="C:\log4net.txt" />
</listeners>
</trace>
</system.diagnostics>
<!--<appender name="console" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %level %logger - %message%newline" />
</layout>
</appender>-->
private void ConfigureFromFile(ILoggerRepository targetRepository, FileInfo configFile)
{
if (m_configureAndWatch)
{
XmlConfigurator.ConfigureAndWatch(targetRepository, configFile);
}
else
{
XmlConfigurator.Configure(targetRepository, configFile);
}
}