2012-02-06 35 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的方法将不会被执行。