2011-06-16 78 views
7

剛開始使用log4net,並試圖讓我的頭在配置和記錄器層次結構。這個層次是基於名稱空間還是類和方法/函數層次結構?每種方法的不同appender

可以說我有以下的階層結構...

public class MyClass 
{ 
    private static readonly ILog log = LogManager.GetLogger(typeof(MyClass)); 

    public void Method1() 
    { 
    log4net.info("message"); 
    } 

    public void Method2() 
    { 
    log4net.info("message"); 
    } 

} 

是否有可能安裝在配置爲方法1的log4net.info使用一個附加目的地和方法2到log4net.info使用另一個appender,即使它們不屬於同一類型,例如SmtpAppender。如果是這樣,配置看起來如何。這是我的第一次嘗試。

<appender name="SMTP1" type="log4net.Appender.SMTPAppender"> 
</appender> 
<appender name="SMTP2" type="log4net.Appender.SMTPAppender"> 
</appender> 


<logger name="MyClass.Method1"> 
    <level value="INFO" /> 
    <appender-ref ref="SMTP1" /> 
</logger> 
<logger name="MyClass.Method2"> 
    <level value="INFO" /> 
    <appender-ref ref="SMTP2" /> 
</logger> 

回答

6

該層次結構基於「名稱」。那是什麼意思?
那麼,你可以在記錄器xml中指定一個名稱空間(例如,Foo.Bar),然後使用GetLogger方法爲該類命名空間中的類獲取記錄器,該方法需要TypeFoo.Bar下的任何「sub」名稱空間將繼承Foo.Bar的記錄器配置。
或者,您可以使用GetLogger方法基於任何舊字符串獲取記錄器,該方法需要string

您可以通過幾種不同的方式獲取記錄器。最值得注意的是,由Typestring

能夠通過string獲取,您真的可以將您的記錄器命名爲任何東西並使用任何東西獲取它們。你目前擁有的功能將不起作用,因爲log4net將根據類獲取記錄器...所以你將對這兩種方法使用相同的記錄器。

對於要你必須創建兩個記錄器是什麼:

public class MyClass 
{ 
    private static readonly ILog log = LogManager.GetLogger(typeof(MyClass).Name + "." + "Method1"); 
    private static readonly ILog log2 = LogManager.GetLogger(typeof(MyClass).Name + "." + "Method2"); 

    public void Method1() 
    { 
    log.info("message"); 
    } 

    public void Method2() 
    { 
    log2.info("message"); 
    } 
} 

這裏是相同的記錄器的XML文件:

<logger name="MyClass.Method1"> 
    <level value="INFO" /> 
    <appender-ref ref="SMTP1" /> 
</logger> 
<logger name="MyClass.Method2"> 
    <level value="INFO" /> 
    <appender-ref ref="SMTP2" /> 
</logger> 

我不是太有經驗。網絡,所以也許有人可以找到一種更好/更強大的方法來使用一些忍者反射來獲取每種方法的記錄器,但這是我能做的最好的。

6

相同的記錄器無法根據當前方法路由到多個appender,至少不是直接。不過,你可以做的是使用的log4net的過濾器

做你想做什麼。 log4net框架使用您需要的location information(例如,方法名稱)填充每個LoggingEvent以進行所需的篩選。不過,您可能需要編寫自定義IFilter,以便對其進行過濾。 IFilter是一個相當平凡的界面來實現:1方法/ 1屬性。您的過濾器的Decide()方法會對傳遞給它的每個記錄事件作出3個決定中的一個:

  • 拒絕。丟棄日誌記錄事件。事件未被記錄,並且沒有查詢過濾器鏈中的後續過濾器。
  • 中立。記錄事件被傳遞給該appender的過濾器鏈中的下一個過濾器。
  • 接受。事件被記錄。在過濾器鏈中沒有後續的過濾器被諮詢。

然後將您的過濾器添加到您想要的每個appender的過濾器鏈中。這可以即時完成,也可以通過log4net.config進行配置。

但是,您應該意識到,您獲得的位置信息的質量取決於它是調試還是發佈構建......並且我相信它是否具有可用的調試符號。

你也可能想看看的log4net的各種上下文(和上下文堆棧)

,如果你需要做的添加並以此爲基礎提供一些相關背景信息,請過濾。