在Log4Net中找不到Logger时设置默认日志

jst*_*ick 4 .net c# logging log4net

我使用Log4Net作为我们应用程序的日志记录机制.我们的配置包含在配置文件中,在我们的代码中,我们以编程方式调用FileAppenders我们想要调用的几个记录器(主要是使用)中的哪一个.最近我意识到我们的一个日志文件没有被填充,我跟踪它的字符串不匹配,在我们的配置文件中的名称和我们在代码中以编程方式调用的名称之间.因为LogManager找不到指定的记录器,所以返回了root,这对于我们的配置而言没有设置为有意义地记录在任何地方.

我的问题是,有没有办法设置log4net以允许使用特定的loggers,但logger如果logger找不到指定的话,这将回归到一般?

例如,使用这样的配置文件

<configuration>
<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>

<log4net>
    <root>
        <level value="ALL" />
        <appender-ref ref="ConsoleAppender" />
    </root>

    <logger name="TestFileLogger">
        <level value="ALL" />
        <appender-ref ref="TestFileAppender" />
    </logger>

    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
        <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-5p [%x] - %m%n" />
        </layout>
    </appender>

    <appender name="TestFileAppender" type="log4net.Appender.RollingFileAppender">
        <param name="File" value="TestLog" />
        <param name="DatePattern" value=".yyyyMMdd&quot;.log&quot;" />
        <param name="AppendToFile" value="true" />
    </appender>

</log4net>
</configuration>
Run Code Online (Sandbox Code Playgroud)

并在C#中调用记录器就像这样

var fileLogger = LogManager.GetLogger("TestFileLogger");
fileLogger.Info("This logs appropriately.");

var bogusLogger = LogManager.GetLogger("Bogus");
bogusLogger.Info("This should go to a general log. Bogus is not a recognized appender");
Run Code Online (Sandbox Code Playgroud)

有没有一种很好的方法将消息记录bogusLogger到某种通用日志文件中?我最初的想法是创建一个通用文件appender,它是根节点的一部分,但这非常嘈杂,因为所有日志消息都将路由到此文件.有没有办法只路由未在另一个日志文件中捕获的邮件?

Hen*_*ing 6

您可以使用LogManager.Exists("Bogus")来确定是否应该使用伪记录器或默认实现.

您可以在LogManager上创建一个可以为您处理它的扩展方法.

  • 谢谢你的建议!`LogManager.Exists`是一个很好的方法来实际判断记录器是否实际存在,因为如果找不到指定的记录器,`LogManager.GetLogger`将始终返回`root`.小注意:`LogManager`是静态的,因此不能有扩展方法,但是包装类工作得很好! (2认同)