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

Posted

技术标签:

【中文标题】Log4Net 正在创建文件但未写入文件【英文标题】:Log4Net is creating file but not writing to it 【发布时间】:2019-05-05 23:56:21 【问题描述】:

最近我在使 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));

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

更新: 正如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/

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

【问题讨论】:

是否登录到控制台? 不,不是因为我没有任何控制台,它是一个 MVC Web 应用程序。 那么为什么你有一个控制台附加程序?为什么你的 log4net 配置文件中有 &lt;system.web&gt; 部分?无论如何,我建议你 turn on log4net internal logging 看看它报告了什么。 我不知道这是否与您的问题有关,但您将 RollingFile 属性设置为 size 意味着您希望在旧文件变重时拥有新文件。 This 行 &lt;staticLogFileName value="true" /&gt; 表示只有一个文件将用于日志记录。即使它没有导致此问题,这可能会让您稍后感到头疼。 奇怪的是在调试/跟踪日志中多次看到configuring repository [log4net-default-repository];好像您要配置两次。你能删除XmlConfigurator.Configure();。还要添加&lt;param name="ImmediateFlush" value="true" /&gt; 以确保立即刷新内部缓冲区。 【参考方案1】:

+1 用于在您的问题中包含调试/跟踪日志。 消息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 中的配置覆盖这些记录器和附加程序(是默认位置),因为您使用的是单独的@987654332 @文件。 因此,您最终没有任何Appender,并且没有任何记录。

解决方案是应用XmlConfiguratorAttribute 或调用XmlConfigurator.Configure() 并使用log4net.config文件 (XmlConfigurator.Configure(new FileInfo("log4net.config"))) 的路径,但不要同时使用两者.

【讨论】:

非常感谢您提供详细解释的解决方案!这完全有道理,但老实说,我不会想到这一点。谢谢stuartd,也因为你,我能够介绍最终带来答案的“调试/跟踪日志”!我喜欢 *** 和它的用户 :)【参考方案2】:

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

除了其他看起来都不错。

【讨论】:

这不是答案,应该是评论。 @Barr J,我确信我的应用程序拥有目标文件夹的权限,以确保我已将路径设置为与正在创建的“log4net.Internal.Debug”相同的目录并正确书写(如 stuartd 所建议的那样)。更改路径、名称或扩展名也无济于事。使用 web.config 中添加的配置设置更新原始帖子。 原帖已更新。我尝试将引用删除到控制台附加程序以及该部分,只留下文件部分和引用,但我的文件仍然没有任何内容... @BarrJ,也没有用。调试时,我查看了 Appender 对象本身,这就是我所拥有的:imgur.com/a/S5ukpeS。 Count 不应该 > 0 吗?

以上是关于Log4Net 正在创建文件但未写入文件的主要内容,如果未能解决你的问题,请参考以下文章

核心转储已创建,但未写入文件?

Log4net 不将日志写入日志文件

外部 dll 调用后 log4net 写入错误的日志文件

Log4net 在记录几秒钟后将日志路径更改为安装文件夹。这是为啥?

log4net 将在哪里创建此日志文件?

数据流任务成功执行但未向 Excel 文件写入任何行