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

本文关键字:设置 默认 日志 Logger Log4Net 找不到 | 更新日期: 2023-09-27 18:11:58

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

我的问题是,是否有一种方法来设置log4net,以允许使用特定的logger s,但如果没有找到指定的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>

并像这样调用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");

是否有一种很好的方法来记录从bogusLogger到某种通用日志文件的消息?我最初的想法是创建一个通用的文件附加程序,它是根节点的一部分,但是这非常嘈杂,因为所有日志消息都将路由到这个文件。是否有一种方法可以只路由未在另一个日志文件中捕获的消息?

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

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

你可以在LogManager上创建一个extensionmethod来为你处理它