使用log4net在C#中当出现错误时发送电子邮件

34

目前我的应用程序正在使用log4net记录错误,其web.config配置如下:

<log4net>
    <appender name="FileAppender" type="log4net.Appender.RollingFileAppender">
      <file type="log4net.Util.PatternString" value="../../logs/gateway_%date{yyyyMMdd}.log" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <datePattern value="yyyyMMdd" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] – %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="RollingLogFileAppenderOutput" />
    </root>
  </log4net>

然而,客户现在希望每个错误都能以电子邮件的形式发送给他们。

如何最简单地实现这一点?能否在web.config文件中完成?


请参考以下内容,在log4net配置中添加Smtp用户名和密码: https://dev59.com/oWUp5IYBdhLWcg3wGEgR - Varun
1个回答

55

你应该使用SmtpAppender

<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
    <to value="to@example.com" />
    <from value="from@example.com" />
    <subject value="test logging message" />
    <smtpHost value="SMTPServer.example.com" />
    <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>

<logger name="ErrorLogger">
    <level value="Error" />
    <appender-ref ref="FileAppender" />
</logger>
<logger name="EmailLogger">
    <level value="Error" />
    <appender-ref ref="SmtpAppender" />
</logger>

为了仅在出现特定错误时发送电子邮件,您可以采取以下步骤

try
{
  // your logic
}
catch (MySpecificException ex)
{
   // I only send emails for exception of type MySpecificException
   LogManager.GetLogger("EmailLogger").Error(ex);
}
catch (Exception ex)
{
   // Just log to a file for the rest
   LogManager.GetLogger("ErrorLogger").Error(ex);
}

你还需要访问SMTP服务器,如果你没有一个,可以在网上找到一些好的,只需进行谷歌搜索即可。 - pengibot
然而,这意味着“每个”消息都会被发送,对吗?有没有办法只发送“特定”的错误电子邮件? - swade1987
@ClaudioRedi - 目前当我记录错误时,我只写“ErrorHandler.LogError(ex,“Gateway-Security-IsNonceSentFromDeviceValid-Failed”);”,所以我不会有两种类型的ErrorHandler.LogErrorWithMail()和ErrorHandler.LogError()。 - swade1987
@swade1987:目前我无法想出任何解决您特定问题的方法,而不改变您的日志记录逻辑。如果我有什么想法,我会告诉您的。 - Claudio Redi
链接到smtpappender无法访问。 - user3791372
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接