所以,我有一个控制台应用程序。
使用log4net记录消息。
下面是我的log4net.config文件。
<?xml version="1.0"?>
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="log.txt" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
<mapping>
<level value="ERROR" />
<backColor value="Red, HighIntensity" />
</mapping>
<mapping>
<level value="WARN" />
<foreColor value="White" />
<backColor value="Yellow" />
</mapping>
<mapping>
<level value="INFO" />
<foreColor value="White" />
</mapping>
<mapping>
<level value="DEBUG" />
<backColor value="Green" />
</mapping>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="ConsoleAppender" />
<appender-ref ref="FileAppender" />
</root>
</log4net>
在我的控制台应用程序中,我有这个类来运行
public class SchedulerService
{
private static readonly ILog _log = LogManager.GetLogger(typeof(SchedulerService));
private readonly SchedulerRegistry _registry;
public SchedulerService(SchedulerRegistry schedulerRegistry)
{
_registry = schedulerRegistry;
}
public void Start()
{
JobManager.Initialize(_registry);
JobManager.JobException += JobManager_JobException;
_log.Info("SchedulerService is started");
}
private void JobManager_JobException(JobExceptionInfo info)
{
Console.WriteLine("An error just happened with a scheduled job: " + info.Exception);
_log.Error("An error just happened with a scheduled job: " + info.Exception);
}
public void Stop()
{
Console.WriteLine("SchedulerService is stopped");
}
}
因此创建了log.txt文件,但其大小为零,为空,没有任何内容记录到该文件中,并且没有任何内容记录到控制台。
我做错了什么?
非常感谢。
答案 0 :(得分:1)
您的log4net.config
是正确的。
确保:
Copy to Output Directory
文件的log4net.config
属性设置为Copy Always
。这很重要,因为在构建和运行应用程序时需要将配置文件复制到bin文件夹。通过右键单击配置文件并选择Properties
来执行此操作。然后将Copy to Output Directory
属性的值设置为Copy Always
。
您告诉log4net 加载您的配置。实现此目的的一种方法是在AssemblyInfo
文件的底部添加以下行:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]
答案 1 :(得分:0)
发现问题:)
看起来它是VS 2017的新功能,我之前没有注意到。
以前只有在通过“添加引用”或通过NuGet包管理器手动添加相应组件时,才能解析命名空间。
使用VS 2017,当您尝试解析命名空间时,它实际上会为您安装这些包。这可能很方便,但也令人沮丧,就像我的情况一样。
不知道为什么,但VS决定将此Common.Logging&amp; Common.Logging.Core包而不是我的解决方案中已经存在的log4net。 可能我盲目地信任,并没有注意到这些包与我想要使用的库无关。奇怪的是代码编译得很好:)
这就是代码无效的原因。请注意。
答案 2 :(得分:0)
试试这个方法。你必须将它命名为ColoredConsoleAppender而不是ConsoleAppender.Hope它可以工作。
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="log.txt" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
<mapping>
<level value="ERROR"/>
<foreColor value="Red"/>
</mapping>
<mapping>
<level value="INFO"/>
<foreColor value="White"/>
</mapping>
<mapping>
<level value="DEBUG"/>
<foreColor value="Green"/>
</mapping>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message%newline"/>
</layout>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level %logger - %message%newline"/>
</layout>
</appender>
<root>
<priority value="ALL"/>
<appender-ref ref="FileAppender"/>
<appender-ref ref="ColoredConsoleAppender"/>
</root>