Log4Net正在创建文件但未写入文件

时间:2018-12-04 14:18:07

标签: c# entity-framework-6 log4net log4net-configuration audit-logging

最近我在使Log4Net正常工作时遇到问题(described here),但此后还可以。

我将其遗忘了一段时间是因为我需要开发一些模块,并且将日志记录留在了后面。现在看来,我什至尝试更改日志文件的名称和位置(静态设置),这是在创建日志文件,但在两种情况下均未写入任何内容。

这是我的log4Net配置文件:

<?xml version="1.0"?>
<configuration>    

<log4net>
<root>
 <level value="ALL" />
 <appender-ref ref="console" />
 <appender-ref ref="file" />
</root>
<appender name="console" type="log4net.Appender.ConsoleAppender">
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date %level %logger - %message%newline" />
  </layout>
</appender>
<appender name="file" type="log4net.Appender.RollingFileAppender">
 <file value="ApplicationLogging.log" />
 <appendToFile value="true" />
 <rollingStyle value="Size" />
 <maxSizeRollBackups value="5" />
 <maximumFileSize value="10MB" />
 <staticLogFileName value="true" />
 <layout type="log4net.Layout.PatternLayout">
 <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
 </layout>
</appender>
</log4net>
</configuration>

这是我的Global.asax

[assembly: XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

 XmlConfigurator.Configure();            
 ILog logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 logger.Info("Application started.");

我如何声明:

 readonly ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

我有时会像这样使用它:

logger.Info("some logging here");

或者对于上下文记录,我会这样使用它:

context.Database.Log = (dbLog => logger.Debug(dbLog));

文件已创建,但未写入任何内容。 谁能建议我在哪里寻找什么?

更新: 根据{{​​3}}的建议,我已经在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>

stuartd

请注意,我已经删除了我之前从未见过的第一部分,我认为这是多余的吗?

<!--<appender name="console" type="log4net.Appender.ConsoleAppender">
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date %level %logger - %message%newline" />
  </layout>
</appender>-->

无论有没有它都不起作用。

Which writes the following content (pastebin),第一部分未注释掉(处于原始状态)

我也尝试了以下方法: Here is the output https://logging.apache.org/log4net/release/config-examples.html

我不知道为什么它可以创建它但不能写它... 我似乎在网上也找不到任何东西,所有问题都与文件的创建有关,而不是写入文件。

2 个答案:

答案 0 :(得分:3)

+1,用于在问题中包含调试/跟踪日志。
消息log4net: Configuring Repository [log4net-default-repository]在此日志中多次出现,看起来正在两次配置,一次是通过XmlConfiguratorAttribute,第二次是通过调用{{ 1}}。

检查XmlConfigurator.Configure();的源代码可以发现它在内部对XmlConfiguratorAttribute进行了类似的调用

XmlConfigurator.Configure(...);

这就是发生的事情。

private void ConfigureFromFile(ILoggerRepository targetRepository, FileInfo configFile) { if (m_configureAndWatch) { XmlConfigurator.ConfigureAndWatch(targetRepository, configFile); } else { XmlConfigurator.Configure(targetRepository, configFile); } } 首先按照XmlConfiguratorAttribute文件中的定义设置记录器和附加程序,并创建空的log4net.config文件。

然后,对ApplicationLogging.log的调用将使用XmlConfigurator.Configure();中的配置(为默认位置)覆盖这些记录器和附加器,该配置不包含您正在使用的任何记录器一个单独的web.config文件。
因此,您最终将没有任何log4net.config,并且没有任何记录。

解决方案是应用Appender或使用XmlConfiguratorAttribute文件(XmlConfigurator.Configure())的路径调用log4net.config ,但两者都不做

答案 1 :(得分:1)

请检查您的应用程序是否对日志文件的目标文件夹具有写权限, 这类事情有时会导致真正的痛苦。

除了其他一切看起来还不错。