【发布时间】:2017-06-20 00:07:25
【问题描述】:
我有以下配置:
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{ABSOLUTE}
[%thread] %level %logger - %message%newline"/>
</layout>
</appender>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="Logs\Log.txt" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<maximumFileSize value="5MB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{ABSOLUTE}
[%thread] %level %logger - %message%newline" />
</layout>
<encoding value="utf-8" />
</appender>
<logger name="TraceLogger" additivity="false">
<level value="INFO" />
<appender-ref ref="RollingFileAppender"/>
<appender-ref ref="ConsoleAppender" />
</logger>
</log4net>
我已经在 XmlConfigurator 上运行了配置:
static class ProgramEntry
{
static void Main(string[] args)
{
log4net.Config.XmlConfigurator.Configure();
...
我的 web.config 有:
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false" />
</configSections>
...
<log4net configSource="Config\log4net.config" />
...
<system.diagnostics>
<trace autoflush="true" indentsize="0">
<listeners>
<add name="Log4NetTraceListener" type="BLAH.Log4netTraceListener, BLAH" />
</listeners>
</trace>
</system.diagnostics>
我有一个 Trace 监听器实现:
public class Log4netTraceListener : System.Diagnostics.TraceListener
{
private readonly ILog log;
public Log4netTraceListener()
{
log = LogManager.GetLogger("TraceLogger");
// disable logging to trace write if logging fails, or else we'll end up in a deadlock.
log4net.Util.LogLog.EmitInternalMessages = false;
}
private string level = "Info";
public override void Write(string message)
{
if (message.Contains("Error:"))
{
level = "Error";
}
else if (message.Contains("Warning:"))
{
level = "Warning";
}
else if (message.Contains("Information:"))
{
level = "Info";
}
else
{
if (log != null)
{
LogMessage(message);
}
}
}
public override void WriteLine(string message)
{
if (log != null)
{
LogMessage(message);
}
// reset the level
level = "Info";
}
private void LogMessage(string message)
{
if (level == "Info")
{
log.Info(message);
}
if (level == "Error")
{
log.Error(message);
}
if (level == "Warning")
{
log.Warn(message);
}
}
}
Trace 监听器开始运行,似乎找到了“TraceLogger”,但它的 appenders 集合是空的。
我可能做错了什么?真正的问题是
编辑
发现错误:
log4net:ERROR 无法解析配置文件。是个 指定为: System.Configuration.ConfigurationErrorsException:无法打开 configSource 文件“Config\log4net.config”。 (C:\Users\awdawd\Documents\Visual Studio 2015\Projects\BLAH\BLAH\BLAH\bin\Debug\DataFactoryPreparationManager.exe.Config 第 36 行)
我的 app.config 在根目录下,我的 Config 文件夹在这个目录下
【问题讨论】:
-
configSource文件路径相对于配置文件本身的位置。它也只能引用自己目录中的文件/文件夹。 -
我的 app.config 在我的项目的根目录中。我错过了什么吗?我的 Config 文件夹在这个目录下
-
运行时在哪里?您的应用程序实际上是从
bin\Debug文件夹运行的吗? (错误消息表明确实如此) log4net 配置文件是否复制到bin\Debug\Config? -
天哪,我的解决方案中的文件是 log4net.config,但每当我保存它时,它都会变成大写 Log4Net.config。到底是什么
标签: log4net