.Net 4
我在Windows服务中使用log4net。该服务有一个内部计时器,计划每30分钟运行一次。每次处理完成后,我都希望收到一封包含所有日志记录活动的电子邮件。我找到的唯一例子是使用smtp appender,但每次记录某些内容时都会发送一封电子邮件,这不是我需要的。
我认为这是一个正常的用例,但找不到任何相关的例子......
感谢您的帮助!
答案 0 :(得分:2)
我不认为这是它的标准用法,因为SMTPAppender主要用于触发错误(这应该是罕见的)。这是appender的描述:
发生特定日志记录事件时发送电子邮件,通常是出现错误或致命错误。
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,并且每30分钟启动一次服务/计划任务,通过电子邮件发送日志文件,清理并死亡。我之前在生产Web应用程序上完成了这项工作,使用通过我们在WIX中创建的MSI部署的计划任务和批处理文件,并使用自定义操作来部署计划任务。
答案 1 :(得分:1)
我想你可以创建自己的自定义appender来缓冲日志,然后在需要时刷新它(在你的情况下每30分钟),或者在现有的appender中设置一个非常高的缓冲区大小(并希望它不会在30分钟内达到并每隔30分钟冲洗一次。
答案 2 :(得分:1)
您可以使用单独的记录器;假设您的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>
<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);
在您的完整方法中使用您的工作记录器:
{{1}}
这将允许您在作业完成电子邮件和错误电子邮件中包含不同的主题行。它们甚至可以与地址不同,使您的电子邮件客户端规则易于设置。