使用多个log4net文件记录器

Tim*_*ker 3 log4net log4net-configuration

我有文件appenders FileA,FileB和FileC.FileA我添加到根元素,因为我希望它是一个全部捕获,(更多内容见下文).FileB和FileC我用于特定的消息,并为每个appender创建命名记录器.在代码中,我加载了我用于大多数消息的日志,如下所示:

private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
Run Code Online (Sandbox Code Playgroud)

其他记录器,我这样加载

private static readonly log4net.ILog commandLog = log4net.LogManager.GetLogger("LoggerFileB");
Run Code Online (Sandbox Code Playgroud)

发生的事情是我得到了我对LoggerFileB的期望,即只有特殊的消息.问题是这些消息也出现在LoggerFileA中,这是我添加到root的全部.我可以为catch-all创建一个特定的命名实例,而不是将其添加到根元素,但我希望调用类型作为输出中的记录器名称.创建命名记录器意味着%logger输出日志的名称而不是类型.有没有办法准确地得到我想要的东西(显示记录器名称作为类型,但不显示记录到其他命名记录器的消息)?希望我错过了一些东西,并且有一个简单的解决方案.

这是我的log.config在这种情况下的样子.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <log4net>
        <appender name="FileA" type="log4net.Appender.RollingFileAppender">
            <file value="FileA.txt" />
            ...snip...
        </appender>
        <appender name="FileB" type="log4net.Appender.RollingFileAppender">
            <file value="FileB.txt" />
            ...snip...
        </appender>
        <appender name="FileC" type="log4net.Appender.RollingFileAppender">
            <file value="FileC.txt" />
            ...snip...
        </appender>
        <root>
            <level value="ALL" />
            <appender-ref ref="LoggerFileA" />
        </root>
        <logger name="LoggerFileB">
            <level value="ALL" />
            <appender-ref ref="FileB" />
        </logger>
        <logger name="LoggerFileC">
            <level value="ALL" />
            <appender-ref ref="FileC" />
        </logger>
    </log4net>
</configuration>
Run Code Online (Sandbox Code Playgroud)

Ste*_*gli 13

你可以使用set additivityto to false:

<logger name="LoggerFileB" additivity="false">
Run Code Online (Sandbox Code Playgroud)