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

Log4Net is creating file but not writing to it

最近我在使 Log4Net 工作时遇到了问题 (),但之后一切正常。

我已经将其搁置了一段时间,因为我需要开发一些模块并且我将日志记录稍微搁置了。现在我看,我什至尝试更改日志文件的名称和位置(静态设置),它正在创建它但在这两种情况下都没有写入任何内容。

这是我的 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));

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

更新: 根据 stuartd 的建议,我在 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>

Which writes the following content (pastebin)

请注意,我删除了之前没有看到的第一部分,我认为它是多余的?

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

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

Here is the output 第一部分未注释掉(在其原始状态)

我也尝试了以下方法: https://logging.apache.org/log4net/release/config-examples.html https://csharp.today/log4net-tutorial-great-library-for-logging/

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

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

除此之外其他都还不错

+1 包括 debug/trace 登录您的问题。
消息 log4net: Configuring Repository [log4net-default-repository] 在此日志中多次出现,看起来像 正在设置配置两次 ,一次是通过 XmlConfiguratorAttribute,第二次是通过调用至 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 或使用 log4net.config 文件的路径调用 XmlConfigurator.Configure() (XmlConfigurator.Configure(new FileInfo("log4net.config"))) , 但 不要两者都做 .