为每个appender创建不同的log4net.ILog实例

Niv*_*Niv 5 .net c# asp.net log4net appender

我正在使用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>
Run Code Online (Sandbox Code Playgroud)

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

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

但是这没有指定appenderName,我没有找到指定它的方法.

有任何想法吗?

谢谢!

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

编辑#2:我注意到一些奇怪的东西.在多个3记录器配置之前,我有1个记录器配置.现在,我写入3个记录器的文字写入该日志文件,虽然它已不在配置文件中.出于某种原因,它不会加载新的配置文件.我怎么强迫它这样做?

Pet*_*ter 2

要使用您想要的名称,您可以创建 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");
Run Code Online (Sandbox Code Playgroud)

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

您当前代码的问题是:

System.Reflection.MethodBase.GetCurrentMethod().DeclaringType
Run Code Online (Sandbox Code Playgroud)

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