2013-07-29 27 views
5

我正在使用log4net来记录一个项目。为每个appender创建一个不同的log4net.ilog实例

我想登录到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端每个记录器的实例。 随着standrard,1个Appender的配置,我用以下:

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

但这并不指定appenderName就是,我没有找到一个方法来指定。

任何想法?

谢谢!

编辑: 我想我错过了一些东西,因为我没有定义在我的配置文件中。我不明白记录员和appender之间的分离。编辑#2: 我注意到一些奇怪的东西。在多个3记录器配置之前,我有一个记录器配置。现在,我写入3个记录器的文字写入该日志文件,尽管它不再位于配置文件中。出于某种原因,它不会加载新的配置文件。我如何强迫它这样做?

+0

我认为这是你正在寻找http://stackoverflow.com/questions/1372435/configure-log4net-to-write-to-multiple-files – Microtechie

+0

我也这么认为,语法似乎确定,但它不工作。它编译并运行得很好。但是,所有记录器的所有isLevelEnabled成员都设置为TRUE,即使这不是它们的设置方式,我写入的测试日志也没有记录。 – Niv

+0

试试这个 - [link](http://stackoverflow.com/questions/308436/log4net-programmatically-specify-multiple-loggers-with-multiple-file-appenders) – Nilesh

回答

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"); 

登录时必须使用正确的记录日志信息。您的appender被配置为在单独的文件中处理每个记录器。

与您当前密码的问题是:

System.Reflection.MethodBase.GetCurrentMethod().DeclaringType 

因为你使用静态记录器记录仪的名字大概可以格式不正确。没有System.Reflection.MethodBase.GetCurrentMethod(),因为当调用static initalize时,不存在GetCurrentMethod。您可以将其更改为typeof(..).Name。但是你需要重新配置appender来记录你的类名。

+0

我有2个问题: 1)读完位,我注意到我没有在我的配置中定义一个元素。我应该用定义一个吗? 2)我现在注意到,使用内部lo​​g4net调试,我的新配置文件根本不占用 - 它仍然使用旧的配置!我对logError,logResponse,logRequest所做的所有写作都是使用我使用的旧记录器发送的(它们被写入我之前使用的log.txt文件)。我试图清理我的项目,但它仍然无法正常工作。 – Niv

+1

只需要注意,System.Reflection.MethodBase.GetCurrentMethod()。DeclaringType'在这个上下文中确实有效......它是对记录器在其中声明的类的类型进行求值的。所以,你最终会得到像'MyCorp.MyClass'这样的记录器名称,而不是你想要的'ErrorAppender'。 –

相关问题