【发布时间】:2016-04-26 01:27:09
【问题描述】:
.Net 4
我在 Windows 服务中使用 log4net。该服务有一个内部计时器,并计划每 30 分钟运行一次。每次处理完成时,我都希望收到一封包含所有日志记录活动的电子邮件。我发现的唯一示例是使用 smtp 附加程序,但每次记录某些内容时都会发送一封电子邮件,这不是我需要的。
我认为这是一个正常的用例,但找不到任何相关示例...
感谢您的帮助!
【问题讨论】:
.Net 4
我在 Windows 服务中使用 log4net。该服务有一个内部计时器,并计划每 30 分钟运行一次。每次处理完成时,我都希望收到一封包含所有日志记录活动的电子邮件。我发现的唯一示例是使用 smtp 附加程序,但每次记录某些内容时都会发送一封电子邮件,这不是我需要的。
我认为这是一个正常的用例,但找不到任何相关示例...
感谢您的帮助!
【问题讨论】:
我认为这不是它的标准用法,因为 SMTPAppender 主要用于触发错误(这应该很少见)。这是附加程序的描述:
当特定日志事件发生时发送电子邮件,通常是错误或致命错误。
Looking at the documentation for SMTPAppender,我看到了one of the properties is a class which evaluates the input message, and decides whether to trigger the e-mail to be sent。
您可以创建一个自定义类,该类将在发送特定消息、特定来源等时发送电子邮件。
我不确定您是否可以使用自定义类从配置中设置它。您可以programatically add the appender 并设置该属性。
您可能需要增加the BufferSize property 才能获得所需的日志历史记录。
或者你可以roll your own appender。不过,我想不出你会如何设计它与 SMTPAppender 有很大不同,除了可能使你的缓冲区不受限制(这有点危险)。
或者你可以简单地log to a rolling log file appender,每三十分钟启动一个服务/计划任务,通过电子邮件发送日志文件,清理,然后死掉。我之前在生产网络应用程序上完成了此操作,使用计划任务和批处理文件,通过我们在 WIX 中创建的 MSI 进行部署,并使用自定义操作来部署计划任务。
【讨论】:
我想您可以创建自己的自定义附加程序来缓冲日志,然后在需要时刷新它(在您的情况下每 30 分钟一次),或者在现有附加程序中设置一个非常高的缓冲区大小(并希望它不会在这 30 分钟内到达)并每 30 分钟冲洗一次。
【讨论】:
您可以用作单独的记录器;假设您的 log4net.config 看起来像这样:
<log4net xmlns="urn:log4net">
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<threshold value="All" />
<file value="../Logs/MyApp/myapp.log" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyy-MM-dd.'log'" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="10MB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d{HH':'mm':'ss'.'fff} [%4t] %-5p %M - %m %15property{ipAddress} - %property{orderId}%n" />
</layout>
</appender>
<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
<to value="<your to address>" />
<from value="<your from address>" />
<subject value="<your subject line>" />
<smtpHost value="<your smtp host>"/>
<username value="<your username>" />
<password value="<your password>" />
<port value="25" />
<authentication value="Basic" />
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="Error" />
</evaluator>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline[%property{log4net:HostName}] [%date] [%-5level] [%logger] - [%message]%newlineIp[%property{IpAddress}] Session[%property{SessionId}] OrderId[%property{OrderId}] UserAgent[%property{UserAgent}]%newline%newline%exception" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="RollingLogFileAppender" />
<appender-ref ref="SmtpAppender" />
</root>
</log4net>
然后你可以修改它看起来像这样:
<log4net xmlns="urn:log4net">
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<threshold value="All" />
<file value="../Logs/MyApp/myapp.log" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyy-MM-dd.'log'" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="10MB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d{HH':'mm':'ss'.'fff} [%4t] %-5p %M - %m %15property{ipAddress} - %property{orderId}%n" />
</layout>
</appender>
<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
<to value="<your to address>" />
<from value="<your from address>" />
<subject value="<your subject line>" />
<smtpHost value="<your smtp host>"/>
<username value="<your username>" />
<password value="<your password>" />
<port value="25" />
<authentication value="Basic" />
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="Error" />
</evaluator>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline[%property{log4net:HostName}] [%date] [%-5level] [%logger] - [%message]%newlineIp[%property{IpAddress}] Session[%property{SessionId}] OrderId[%property{OrderId}] UserAgent[%property{UserAgent}]%newline%newline%exception" />
</layout>
</appender>
<appender name="SmtpJobAppender" type="log4net.Appender.SmtpAppender">
<to value="<job to address>" />
<from value="<job from address>" />
<subject value="<job subject line>" />
<smtpHost value="<your smtp host>"/>
<username value="<your username>" />
<password value="<your password>" />
<port value="25" />
<authentication value="Basic" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline[%property{log4net:HostName}] [%date] [%-5level] [%logger] - [%message]%newlineIp[%property{IpAddress}] Session[%property{SessionId}] OrderId[%property{OrderId}] UserAgent[%property{UserAgent}]%newline%newline%exception" />
</layout>
</appender>
<logger name="Any.Name.You.Want.To.Indicate.This.Is.Your.Job.Completed.Log">
<level value="ALL"/>
<appender-ref ref="SmtpJobAppender"/>
</logger>
<root>
<level value="INFO" />
<appender-ref ref="RollingLogFileAppender" />
<appender-ref ref="SmtpAppender" />
</root>
</log4net>
在课程中,你有你的工作完成功能,你可以声明你的工作记录器:
private static readonly ILog JobLogger = LogManager.GetLogger("Any.Name.You.Want.To.Indicate.This.Is.Your.Job.Completed.Log");
并在您的完整方法中使用您的作业记录器:
JobLogger.Info("Job complete - process time was " + process.Time);
这将允许您在工作完成电子邮件和错误电子邮件中使用不同的主题行。它们甚至可以有不同的地址,使您的电子邮件客户端规则易于设置。
【讨论】: