【问题标题】:Configure or extend log4net SmtpAppender with custom subjects使用自定义主题配置或扩展 log4net SmtpAppender
【发布时间】:2010-10-10 20:31:03
【问题描述】:

如何为生成的电子邮件主题指定布局和转换模式?

BufferSize 需要小于或等于 1,因此不会发生缓冲。

【问题讨论】:

    标签: log4net log4net-configuration


    【解决方案1】:

    CodeProject 文章 log4net NonBufferedSmtpAppenderWithSubjectLayout 看起来很有希望。


    通过从所需的基本附加程序(在我的例子中为 SmtpPickupDirAppender)继承并添加 ILayout 属性,可以在 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);
        }
    }
    

    这可以通过指定一个 subjectLayout 属性来覆盖默认主题。

    <appender name="SmtpPickupDirAppender" type="namespace.for.SmtpSubjectLayoutPickupDirAppender">
        <to value="to@domain.com" />
        <from value="from@domain.com" />
        <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>
    

    【讨论】:

    • 对于自定义属性: ThreadContext.Properties["myVal"] = "whatever";
    • public ILayout SubjectLayout 必须是 public PatternLayout SubjectLayout 才能正常工作。
    【解决方案2】:

    Here is 另一个带有自定义主题的 SmtpAppender 示例。

    【讨论】:

      【解决方案3】:

      您可以从Nuget下载它

      Source code and example

      【讨论】:

        【解决方案4】:

        因为之前建议使用 NuGet 版本的 SmtpAppenderWithSubjectLayout 的答案需要 log4net 版本 > 1.2.1,所以我使用了 NuGet 源代码,但将其修改为使用 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());
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多