【问题标题】:Creating a different log4net.ILog instance for each appender为每个 appender 创建不同的 log4net.ILog 实例
【发布时间】:2013-07-29 06:53:08
【问题描述】:

我正在使用 log4net 记录一个项目。

我想登录 3 个不同的文件:请求、响应和错误。

<log4net debug="true">
    <!--To turn off an appender, simply set it's threshold value to "OFF"-->
    <appender type="log4net.Appender.RollingFileAppender" name="RequestAppender">
        <file value="requests.txt" />
        <threshold value="INFO" />
        <appendToFile value="true" />
        <rollingStyle value="Size" />
        <maxSizeRollBackups value="10" />
        <maximumFileSize value="10MB" />
        <staticLogFileName value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" />
        </layout>
    </appender>

    <appender type="log4net.Appender.RollingFileAppender" name="ResponseAppender">
        <file value="responses.txt" />
        <threshold value="INFO" />
        <appendToFile value="true" />
        <rollingStyle value="Size" />
        <maxSizeRollBackups value="10" />
        <maximumFileSize value="10MB" />
        <staticLogFileName value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" />
        </layout>
    </appender>

    <appender type="log4net.Appender.RollingFileAppender" name="ErrorAppender">
        <file value="errors.txt" />
        <threshold value="ERROR" />
        <appendToFile value="true" />
        <rollingStyle value="Size" />
        <maxSizeRollBackups value="10" />
        <maximumFileSize value="10MB" />
        <staticLogFileName value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" />
        </layout>
    </appender>

</log4net>

但是,我不知道如何为 .NET 端的每个记录器获取一个实例。 使用标准的 1 个 appender 配置,我曾经遵循:

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

但这并没有指定appenderName,我也没有找到指定的方法。

有什么想法吗?

谢谢!

编辑: 我想我遗漏了一些东西,因为我的配置文件中没有定义。我不明白记录器和附加器之间的分离。

编辑#2: 我注意到了一些奇怪的事情。在多个 3 个记录器配置之前,我有一个 1 个记录器配置。现在,我写入 3 个记录器的内容写入该日志文件,尽管它不再在配置文件中。由于某种原因,它不会加载新的配置文件。我怎样才能强迫它这样做?

【问题讨论】:

  • 我想这就是你要找的stackoverflow.com/questions/1372435/…
  • 我也是这么认为的,语法看起来还可以,但它不起作用。它编译并运行得很好。但是,所有记录器的所有 isLevelEnabled 成员都设置为 TRUE,即使它们不是这样设置的,而且我编写的测试日志也没有被记录。
  • 试试这个 - link

标签: c# asp.net .net log4net appender


【解决方案1】:

要使用您想要的名称,您可以创建 3 个记录器:

 private static readonly log4net.ILog logError = log4net.LogManager.GetLogger("ErrorAppender");
 private static readonly log4net.ILog logResponse = log4net.LogManager.GetLogger("ResponseAppender");
 private static readonly log4net.ILog logRequest = log4net.LogManager.GetLogger("RequestAppender");

记录日志消息时,您必须使用正确的记录器。您的附加程序配置为在单独的文件中处理每个记录器。

您当前代码的问题是:

System.Reflection.MethodBase.GetCurrentMethod().DeclaringType

因为您使用静态记录器,所以记录器名称可能无法正确形成。没有System.Reflection.MethodBase.GetCurrentMethod(),因为调用静态初始化时没有GetCurrentMethod。您可以将其更改为typeof(..).Name。但是,您的附加程序需要重新配置以记录您的类名。

【讨论】:

  • 我有 2 个问题: 1)读了一点之后,我注意到我没有在我的配置中定义一个 元素。我应该用 定义 吗? 2)我现在注意到,使用内部 log4net 调试,我的新配置文件根本不需要 - 它仍然使用旧配置!我对 logError、logResponse、logRequest 所做的所有写入都被发送,就好像它们是使用我拥有的旧记录器发送的一样(它们被写入我以前使用的 log.txt 文件)。我尝试清理我的项目,但仍然无法正常工作。
  • 请注意,System.Reflection.MethodBase.GetCurrentMethod().DeclaringType 确实在这种情况下工作......它评估记录器在其中声明的类的类型。所以你最终会得到一个像 MyCorp.MyClass 这样的记录器名称,而不是你想要的 ErrorAppender
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多