最近我在使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>
请注意,我已经删除了我之前从未见过的第一部分,我认为这是多余的吗?
<!--<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
我不知道为什么它可以创建它但不能写它... 我似乎在网上也找不到任何东西,所有问题都与文件的创建有关,而不是写入文件。
答案 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)
请检查您的应用程序是否对日志文件的目标文件夹具有写权限, 这类事情有时会导致真正的痛苦。
除了其他一切看起来还不错。