.NET 6.0中Serilog邮件日志配置不生效问题咨询
Serilog 邮件Sink不生效排查方案
核心原因说明
通过ReadFrom.Configuration()加载配置时,Serilog对无法识别、加载失败的Sink默认做静默跳过处理,不会抛出显性异常,这也是为什么你的文件Sink正常运行、邮件Sink完全无响应的核心逻辑——文件Sink相关依赖、配置都正确所以正常加载,邮件Sink在加载链路里某一步失败被直接跳过了。
按以下优先级排查即可解决:
- 首先确认NuGet包安装正确
必须在项目中安装Serilog.Sinks.Email包,缺少这个包时配置系统找不到邮件Sink的实现,会直接跳过对应配置,没有任何报错。注意不要装成其他第三方同名的邮件Sink包,版本选和你项目里其他Serilog包匹配的稳定版即可。 - 修正Sink名称和参数名
你当前配置里写的Sink名EmailCustom是错误的,官方Serilog.Sinks.Email注册的配置识别名为Email;同时你用的参数名是多年前老版本的命名,新版本参数名已更新,正确的邮件Sink配置参考如下:
注意必须配置{ "Name": "Email", "Args": { "from": "appname@ourorg.com", "to": "myemail@ourorg.com", "host": "ourmailserver.ourorg.com", "port": 25, "enableSsl": false, "subject": "Error in App", "restrictedToMinimumLevel": "Error" } }restrictedToMinimumLevel,默认级别是Verbose的话所有级别的日志都会触发邮件发送,很容易直接把邮箱刷爆。如果你们内部SMTP需要账号认证,还要在Args里补充username和password字段传入发件账号的凭证。 - 开启Serilog自诊断定位具体错误
如果改完上面两点还是不生效,在Program.cs最顶部(调用UseSerilog之前)加如下代码,开启Serilog内部自日志,所有Sink加载、运行的内部错误都会写入指定文件,直接看错误信息就能定位问题(比如SMTP连接失败、端口被拦截、权限不足等):Serilog.Debugging.SelfLog.Enable(msg => File.AppendAllText("serilog-internal-errors.txt", msg + Environment.NewLine)); - 验证SMTP服务连通性
在运行Web应用的机器上直接测试SMTP服务器连通性:用telnet连接ourmailserver.ourorg.com的25端口,确认端口没有被本机防火墙、企业安全策略拦截,同时确认该SMTP允许你应用所在机器匿名发信(不需要认证的场景),很多企业内网SMTP会做IP白名单限制,不在白名单里的机器发起的发信请求会被直接丢弃,不会返回错误。
内容的提问来源于stack exchange,提问作者rainbowdev525
相关产品推荐
相关产品推荐

