Log4Net SmtpAppender用于WebEmail - 未发送

8
我正在尝试将Log4Net与Web电子邮件(Yahoo或Gmail)配合使用。如果您已经成功实现此功能,我将不胜感激并提前致谢。
我已经设置了默认的根记录器,并配置了RollingFileAppender和SmtpAppender。文件appender正常工作,但是SmtpAppender没有输出任何内容。
我是通过诊断按钮点击调用记录器的...
protected void btnReloadContractConfig_Click(object sender, EventArgs e)
{
    // DIAGNOSTIC - Test email logger
    log4net.ILog logger = log4net.LogManager.GetLogger("root");
    logger.Error("btnReloadContractConfig_Click() - This is a TEST of delivery of error messages via email, triggered from the Admin.aspx.cs code file.");
}

...并且RollingFileAppender正在接收消息...

LOC=20120921-12:03:16.319,UTC=20120921-11:03:16.319,DELTA=10078,THR=6,ERROR,LOG=root,[(null)] - btnReloadContractConfig_Click() - 这是通过Admin.aspx.cs代码文件触发错误消息通过电子邮件传递的测试。

Log4Net的web.config条目在这里:

  <appSettings>
    <add key="log4net.Internal.Debug" value="true"/>        
  <appSettings>


  <log4net 
    xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <root>
      <level value="DEBUG" />
      <appender-ref ref="LogFileAppender" />
      <appender-ref ref="SmtpAppender" />
    </root>

    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="MiniMkt01Log.txt"/>
      <!-- <file value="${TMP}\log-file.txt" /> -->
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout" >
    <header value="[Header]&#13;&#10;" />
    <conversionPattern value="LOC=%date{yyyyMMdd-HH:mm:ss.fff},UTC=%utcdate{yyyyMMdd-HH:mm:ss.fff},DELTA=%timestamp,THR=%thread,%-5level,LOG=%logger,[%property{NDC}] - %message%newline" />
      </layout>  
    </appender>

    <appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
      <to value="FacelessDevTeam@yahoo.com" />
      <from value="hiblet@yahoo.com" />
      <subject value="Logging Message" />
      <smtpHost value="smtp.yahoo.com" />
      <port value="25"/>
      <authentication value="Basic" />
      <username value="FacelessDevTeam@yahoo.com"/>
      <password value="?????[real password hidden for obvious reasons]"/>
      <!-- <EnableSsl value="true" /> -->
      <bufferSize value="10" />
      <lossy value="true" />
      <evaluator type="log4net.Core.LevelEvaluator">
    <threshold value="WARN"/>
      </evaluator>
      <layout type="log4net.Layout.PatternLayout">
    <header value="[Header]&#13;&#10;" />
    <!-- Previously... <conversionPattern value="%newline%date,%utcdate,%timestamp,[%thread],%-5level,%logger,[%property{NDC}] - %message%newline%newline%newline" /> -->
    <conversionPattern value="%newlineLOC=%date{yyyyMMdd-HH:mm:ss.fff},UTC=%utcdate{yyyyMMdd-HH:mm:ss.fff},DELTA=%timestamp,THR=%thread,%-5level,LOG=%logger,[%property{NDC}] - %message%newline%newline%newline" />
      </layout>
    </appender>

  </log4net>

在Application_Start()处理程序中,Global.asax文件正在被捕获web.config。
void Application_Start(object sender, EventArgs e) 
{
    // Start Log4Net, signal app has started
    log4net.Config.XmlConfigurator.Configure();
    log4net.ILog logger = log4net.LogManager.GetLogger("root");
    logger.Info("Application_Start()");
}

管理员网页触发邮件似乎要么无限期挂起,要么瞬间挂起(半秒钟)然后继续。
开发环境不会因为异常而崩溃,要么挂起,要么在没有错误的情况下滑动。
  • 如何从SmtpAppender中获取其他诊断信息?
  • 我能独立测试端口/配置以检查出站编程电子邮件的本地阻止吗?
  • log4net邮件是否保证已发送?如果将lossy=false,则会出现无限挂起这种情况,因为lossy属性和缓冲区大小非常敏感。

参考使用VS 2010、ASP.Net4和大量咖啡因。感谢您未来提供的任何帮助。

2个回答

13

好的,问题解决了,现在我能够接收电子邮件了。因为在互联网上找不到很多解决方案,所以我必须做以下操作。首先,我设置了一个微型控制台电子邮件程序来验证我是否能够从我的计算机发送基本的电子邮件。这需要您添加一个部分到您的web.config(或在此情况下是app.config),以配置SMTP客户端。

当我完成以上步骤并且可以从独立应用程序发送电子邮件时,我将所需的<system.net>部分复制到我的主项目的web.config文件中,结果非常顺利。出于对人类的纯爱,这里是可与Gmail配合使用的system.net部分...

<configuration>

[... your config stuff]

  <system.net>
    <mailSettings>
      <smtp deliveryMethod="Network" from="chunkyLover69@gmail.com">
        <network
          host="smtp.gmail.com"
          enableSsl="true"
          port="587"
          userName="chunkyLover69@gmail.com"
          password="yesThisIsMyRealPasswordIAmAnIdiot"
          defaultCredentials="false"/>
      </smtp>
    </mailSettings>
  </system.net>

[... some more of your config stuff]

</configuration>

这就是关键所在,我的.config文件中没有system.net部分,因此失败了。希望这能帮助其他人。


2
你能在这里发布一下 log4net SmtpAppender 的设置吗?想知道我需要哪种组合。 - ferventcoder
似乎smtp appender中的主机、端口、用户名和密码元素完全是多余的。我已经从我的appender中将它们移除,并且它愉快地使用system.net/mailSettings/smtp配置。 - JohnB
没错。我也发现我可以在我的服务器上安装HMailServer作为SMTP中继,这很有帮助。现在我有可靠的电子邮件日志记录。 - Steve Hibbert

2

对于Gmail,您需要将EnableSsl设置为true。您需要log4net版本1.2.11.0才能执行此操作。同时,为了测试目的,您可以将bufferSize设置为1,即每个日志将被写入。

为了测试目的,您也可以尝试通过编程方式配置log4net,例如:

public class TestingLog4Net
{
    public void TestSmtpAppender()
    {
        ConfigureLog4NetSmtp();
        var logger = GetLogger();

        logger.Fatal(new Exception("Testing"));
    }

    private static ILog GetLogger()
    {
        var logger = LogManager.GetLogger(typeof (TestSmtpAppender));
        return logger;
    }

    private static void ConfigureLog4NetSmtp()
    {
        var smtp = GetSmtpAppender();
        BasicConfigurator.Configure(smtp);
    }

    private static SmtpAppender GetSmtpAppender()
    {
        var smtp = new SmtpAppender
                       {
                           Name = "GMail",
                           Username = "your_user_name",
                           Password = "your_password",
                           SmtpHost = "smtp.gmail.com",
                           From = "your_sender@gmail.com",
                           To = "some_target@mail.com",
                           EnableSsl = true,
                           Port = 587,
                           Authentication = SmtpAppender.SmtpAuthentication.Basic,
                           Subject = "Testing log4net SmtpAppender",
                           BufferSize = 1,
                           Lossy = true,
                           Evaluator = new LevelEvaluator(Level.Fatal),
                           Layout =
                               new PatternLayout(
                               "%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline%newline")
                       };
        return smtp;
    }
}

下载最新的 LinqPad 测试版。选择 C# 程序作为 LinqPad 查询并将上述代码复制粘贴到查询中。使用您的 Gmail 帐户并设置一些目标电子邮件地址。这样应该可以正常工作。


log4net:ERROR [SmtpAppender] ErrorCode: GenericFailure. 发送电子邮件通知时发生错误。 System.Net.Mail.SmtpException:SMTP服务器需要安全连接或客户端未经身份验证。 服务器响应为:5.5.1 需要身份验证。 - Steve Hibbert
我猜测 enableSsl 设置没有生效。你是在使用编译好的 1.2.11 DLL,还是自己构建的?我正在使用 DLL。 - Steve Hibbert
已获取源代码并在本地构建了1.2.11版本 - 但是没有成功。尝试使用NET_2_0进行构建,但仍然失败。我感觉可能是我漏掉了一些显而易见的东西。 - Steve Hibbert

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