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 配置文件中有<system.web>
部分?无论如何,我建议你 turn on log4net internal logging 看看它报告了什么。
我不知道这是否与您的问题有关,但您将 RollingFile 属性设置为 size 意味着您希望在旧文件变重时拥有新文件。 This 行 <staticLogFileName value="true" />
表示只有一个文件将用于日志记录。即使它没有导致此问题,这可能会让您稍后感到头疼。
奇怪的是在调试/跟踪日志中多次看到configuring repository [log4net-default-repository]
;好像您要配置两次。你能删除XmlConfigurator.Configure();
。还要添加<param name="ImmediateFlush" value="true" />
以确保立即刷新内部缓冲区。
【参考方案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 正在创建文件但未写入文件的主要内容,如果未能解决你的问题,请参考以下文章