3

我有文件附加程序 FileA、FileB 和 FileC。FileA 我添加到根元素中,因为我希望它是一个包罗万象的东西,(更多内容见下文)。FileB 和 FileC 我用于特定消息并为每个附加程序创建命名记录器。在代码中,我加载了用于大多数消息的日志,如下所示:

private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

其他记录器,我这样加载

private static readonly log4net.ILog commandLog = log4net.LogManager.GetLogger("LoggerFileB");

正在发生的事情是我在 LoggerFileB 中得到了我所期望的,即只有特殊消息。问题是这些消息也显示在 LoggerFileA 中,这是我添加到 root 的全部内容。我可以为包罗万象创建一个特定的命名实例,而不是将其添加到根元素,但我希望调用类型作为输出中的记录器名称。创建命名记录器意味着 %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>
4

1 回答 1

13

您可以使用设置additivity为 false:

<logger name="LoggerFileB" additivity="false">
于 2010-10-28T07:39:50.743 回答