You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NLog配置问题:添加致命错误邮件日志后覆盖原有配置且邮件未发送

解决NLog添加邮件目标及邮件发送问题

问题1:添加邮件目标而非覆盖原有配置

你当前使用SimpleConfigurator.ConfigureForTargetLogging会完全替换NLog的原有配置,导致从NLog.config加载的文件目标丢失。正确的做法是修改现有配置,添加新的邮件目标和日志规则:

调整后的代码建议

将邮件目标的配置代码从ConfigureServices移至Configure方法(避免提前构建服务提供商的不良实践),并修改为:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IEmailSender emailSender, EmailConfiguration emailConfig)
{
    // 其他Configure代码...

    // 创建邮件目标
    var mailTarget = new MailTarget()
    {
        Name = "FatalErrorMail",
        SmtpServer = emailConfig.SmtpServer,
        SmtpUserName = emailConfig.UserName,
        SmtpPort = emailConfig.Port,
        SmtpPassword = emailSender.Decrypt(emailConfig.Password),
        To = emailConfig.To,
        EnableSsl = true, // 根据SMTP服务器要求设置,比如Gmail需要启用
        Subject = "应用程序致命错误通知",
        Body = "${longdate}\n${level}\n${message}\n${exception:format=ToString}"
    };

    // 获取现有NLog配置(若未加载则创建新配置)
    var nlogConfig = LogManager.Configuration ?? new LoggingConfiguration();
    
    // 添加邮件目标到配置
    nlogConfig.AddTarget(mailTarget.Name, mailTarget);
    
    // 添加日志规则:所有日志的Fatal级别发送至邮件目标
    var loggingRule = new LoggingRule("*", LogLevel.Fatal, mailTarget);
    nlogConfig.LoggingRules.Add(loggingRule);
    
    // 更新NLog配置
    LogManager.Configuration = nlogConfig;
}

同时,ConfigureServices中仅保留邮件配置的注册:

public void ConfigureServices(IServiceCollection services)
{
    var emailConfig = Configuration.GetSection("EmailConfiguration").Get<EmailConfiguration>();
    services.AddSingleton(emailConfig);
    // 其他服务注册...
}

问题2:调试邮件未发送的问题

1. 启用NLog内部日志

NLog内部日志会记录邮件发送过程中的错误(如SMTP连接失败、认证错误等)。在NLog.config中添加以下配置:

<nlog internalLogFile="nlog-internal.log" internalLogLevel="Debug">
    <!-- 原有配置 -->
</nlog>

或通过代码启用:

LogManager.InternalLogLevel = LogLevel.Debug;
LogManager.InternalLogFile = "nlog-internal.log";

查看生成的nlog-internal.log文件,排查具体错误信息。

2. 验证SMTP配置正确性

  • 确认SmtpServer、SmtpPort是否匹配服务商要求(例如:Gmail用smtp.gmail.com,端口587;Outlook用smtp.office365.com,端口587)。
  • 检查EnableSsl是否开启:多数现代SMTP服务器要求SSL/TLS加密。
  • 验证解密后的密码是否正确:可临时将解密后的密码输出到日志(生产环境禁止),确认解密逻辑无问题。

3. 检查网络与环境限制

  • 确认服务器防火墙未阻止SMTP端口(如587、465)的出站连接。
  • 部分SMTP服务商(如Gmail)可能需要开启“低安全性应用访问”或使用应用专用密码(若开启两步验证)。

4. 检查收件邮箱

  • 确认收件邮箱地址正确,且邮件未被归类到垃圾邮件文件夹。
  • 测试用其他工具(如Telnet、在线SMTP测试工具)连接目标SMTP服务器,验证凭据和连接有效性。

内容的提问来源于stack exchange,提问作者Mark Cilia Vincenti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:10:20