2012-02-06 30 views
0

是否可以將log4net配置爲擁有兩個smtp appender - 一個只在日誌級別> = WARN時發送電子郵件,另一個發送所有內容,但不會在同一時間發送兩個郵件。log4net基於日誌級別的smtpappender主題

<appender name="SmtpAppenderWarn" type="log4net.Appender.SmtpAppender"> 
    <to value="[email protected]" /> 
    <from value="[email protected]" /> 
    <subject value="Import completed with warnings/errors" /> 
    <smtpHost value="localhost" /> 
    <bufferSize value="512" /> 
    <lossy value="true" /> 
    <evaluator type="log4net.Core.LevelEvaluator"> 
    <threshold value="WARN"/> 
    </evaluator> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline%newline" /> 
    </layout> 
</appender> 
<appender name="SmtpAppenderSuccess" type="log4net.Appender.SmtpAppender"> 
    <to value="[email protected]" /> 
    <from value="[email protected]" /> 
    <subject value="Import completed successfully" /> 
    <smtpHost value="localhost" /> 
    <bufferSize value="512" />  
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date %-5level %logger: %message%newline" /> 
    </layout> 
    <filter type="log4net.Filter.LevelMatchFilter"> 
    <levelToMatch value="INFO" /> 
    </filter>  
</appender> 

我我的應用程序有:

Log.Info("Importer is starting..."); 
//my logic 
//if warn Log.Warn("Warning..."); 
Log.Info("Import finished"); 

所以我使用INFO所有的時間。現在,當我遇到WARN時,這兩條消息都正在發送。我當然希望有成功信息的人沒有發送。

回答

0

你追加程序可以有最大/最小值,如下所示:

<levelMin value="INFO" /> 
<levelMax value="INFO" /> 

<levelMin value="WARN" /> 
<levelMax value="WARN" /> 

所以,你可以使用不同的附加目的地的不同範圍。我相信這應該適合你。

+0

這是行不通的,因爲我的等於 我不想只有第二個對於WARNs而言也適用於更高級別 – christof 2012-02-09 13:32:49

+0

這不起作用 – 2015-10-06 06:10:40

0

我已經通過重寫log4net的SendBuffer方法解決了這個問題:

namespace MyProject 
{ 
    public class SmtpAppenderInfoOnly : SmtpAppender 
    { 
     protected override void SendBuffer(log4net.Core.LoggingEvent[] events) 
     { 
      foreach (var loggingEvent in events) 
      { 
       if (loggingEvent.Level != Level.Info) 
        return; 
      } 

      base.SendBuffer(events); 
     } 
    } 
} 

然後在配置文件中:

<appender name="SmtpAppenderSuccess" type="MyProject.SmtpAppenderInfoOnly,MyDll"> 

這樣,當SendBuffer被取消sendmail的方法將不會被執行。