log4net没有将任何消息写入日志文件或控制台

时间:2018-04-16 18:51:41

标签: c# console-application log4net

所以,我有一个控制台应用程序。

使用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文件,但其大小为零,为空,没有任何内容记录到该文件中,并且没有任何内容记录到控制台。

我做错了什么?

非常感谢。

3 个答案:

答案 0 :(得分:1)

您的log4net.config是正确的。

确保:

  1. Copy to Output Directory文件的log4net.config 属性设置为Copy Always。这很重要,因为在构建和运行应用程序时需要将配置文件复制到bin文件夹。通过右键单击配置文件并选择Properties来执行此操作。然后将Copy to Output Directory属性的值设置为Copy Always

  2. 您告诉log4net 加载您的配置。实现此目的的一种方法是在AssemblyInfo文件的底部添加以下行:

  3. [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>