2010-10-10 14 views

risposta

15

L'articolo CodeProject sembra promettente.


ereditando dalla appender di base necessaria (SmtpPickupDirAppender nel mio caso) e l'aggiunta di una proprietà ILayout è possibile cambiare argomento nel metodo Append.

public class SmtpSubjectLayoutPickupDirAppender : log4net.Appender.SmtpPickupDirAppender 
{ 
    public SmtpSubjectLayoutPickupDirAppender() 
     : base() 
    { 

    } 

    public ILayout SubjectLayout 
    { 
     get; 
     set; 
    } 

    protected override void Append(log4net.Core.LoggingEvent loggingEvent) 
    { 
     if (this.BufferSize <= 1 && this.SubjectLayout != null) 
     { 
      StringWriter subjectWriter = new StringWriter(System.Globalization.CultureInfo.InvariantCulture); 
      this.SubjectLayout.Format(subjectWriter, loggingEvent); 
      this.Subject = subjectWriter.ToString(); 
     } 

     base.Append(loggingEvent); 
    } 
} 

Questo può quindi essere configurato specificando una proprietà subjectLayout per ignorare l'oggetto predefinito.

<appender name="SmtpPickupDirAppender" type="namespace.for.SmtpSubjectLayoutPickupDirAppender"> 
    <to value="[email protected]" /> 
    <from value="[email protected]" /> 
    <subject value="test logging message" /> 

    <subjectLayout type="log4net.Layout.PatternLayout, log4net"> 
     <conversionPattern value="Logging message - %message"/> 
    </subjectLayout> 

    <pickupDir value="C:\SmtpPickup" /> 
    <bufferSize value="1" /> 
    <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> 
+3

per le proprietà personalizzate: ThreadContext.Properties [ "myVal"] = "qualunque"; –

+0

'public ILayout SubjectLayout' deve essere' public PatternLayout SubjectLayout' affinché funzioni. – TheCodeKing

1

Here is un altro esempio di SmtpAppender con soggetti personalizzati.

0

Perché i answeres precedenti che suggerisce di utilizzare la versione di NuGet SmtpAppenderWithSubjectLayout bisogni versione log4net> 1.2.1, ho usato il codice sorgente NuGet ma modificato per utilizzare il log4net 1.2.1

public class SmtpAppenderWithSubjectLayout : SmtpAppender 
    { 
     public PatternLayout SubjectLayout { get; set; } 

     protected override void SendBuffer(LoggingEvent[] events) 
     { 
      PrepareSubject(events); 

      base.SendBuffer(events); 
     } 

     protected virtual void PrepareSubject(IEnumerable<LoggingEvent> events) 
     { 
      var subjects = new List<string>(); 

      foreach (LoggingEvent @event in events) 
      { 
       if (Evaluator.IsTriggeringEvent(@event)) 
       { 
        var subjectWriter = new StringWriter(System.Globalization.CultureInfo.InvariantCulture); 
        SubjectLayout.Format(subjectWriter, @event); 
        subjects.Add(subjectWriter.ToString()); 
       } 
      } 

      Subject = string.Join(", ", subjects.ToArray()); 
     } 
    } 
Problemi correlati