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
相关产品推荐
相关产品推荐

