如何在NLog中针对不同Error类型配置不同邮件接收目标?
NLog多邮件目标区分发送实现方案
嘿,针对你提到的两类Error要分别触发NLog中A、B两个邮件目标的需求,我给你两个实用的实现思路,都是NLog官方推荐的常规做法:
方案一:通过Logger实例名称区分
这种方式适合两类Error属于不同业务模块的场景,通过创建不同名称的Logger实例,配合NLog规则来定向发送。
第一步:修改NLog配置,添加日志规则
在你的现有配置里补充<rules>节点,给不同名称的Logger绑定对应的邮件目标:
<rules> <!-- 第一类Error:指定Logger名称为"ErrorTypeA"的Error级日志发送到目标A --> <logger name="ErrorTypeA" level="Error" writeTo="A" final="true" /> <!-- 第二类Error:指定Logger名称为"ErrorTypeB"的Error级日志发送到目标B --> <logger name="ErrorTypeB" level="Error" writeTo="B" final="true" /> <!-- 可选:其他日志的处理规则(比如控制台、文件等) --> <logger name="*" level="Debug" writeTo="console" /> </rules>
说明:
final="true"用来标记该日志已被处理,不会被后续规则重复匹配,避免日志被多目标发送,根据需要选择是否添加。
第二步:代码中调用对应Logger
在业务代码里,针对两类Error分别创建并调用对应名称的Logger:
// 第一类Error使用的Logger var errorTypeALogger = NLog.LogManager.GetLogger("ErrorTypeA"); errorTypeALogger.Error("这是第一类Error,将发送到目标A的邮件收件人"); // 第二类Error使用的Logger var errorTypeBLogger = NLog.LogManager.GetLogger("ErrorTypeB"); errorTypeBLogger.Error("这是第二类Error,将发送到目标B的邮件收件人");
方案二:通过自定义日志属性过滤
如果两类Error属于同一模块,不想创建多个Logger实例,可以通过给日志添加自定义属性,再在NLog规则里根据属性值过滤发送目标,灵活性更高。
第一步:修改NLog配置,添加带条件的日志规则
同样补充<rules>节点,通过condition属性判断自定义属性的值来定向发送:
<rules> <!-- 匹配自定义属性ErrorType为TypeA的Error级日志,发送到目标A --> <logger name="*" level="Error" writeTo="A" condition="${event-properties:item=ErrorType} == 'TypeA'" final="true" /> <!-- 匹配自定义属性ErrorType为TypeB的Error级日志,发送到目标B --> <logger name="*" level="Error" writeTo="B" condition="${event-properties:item=ErrorType} == 'TypeB'" final="true" /> <!-- 其他日志规则 --> <logger name="*" level="Debug" writeTo="console" /> </rules>
第二步:代码中添加自定义属性并记录日志
调用日志时,通过WithProperty方法给日志添加自定义属性,区分不同Error类型:
// 第一类Error:添加自定义属性ErrorType=TypeA _logger.WithProperty("ErrorType", "TypeA").Error("这是第一类Error,发往目标A"); // 第二类Error:添加自定义属性ErrorType=TypeB _logger.WithProperty("ErrorType", "TypeB").Error("这是第二类Error,发往目标B");
方案选择建议
- 如果两类Error分属不同业务模块,用方案一更清晰,模块间日志边界明确;
- 如果是同一模块内的不同错误场景,用方案二更灵活,不需要维护多个Logger实例。
内容的提问来源于stack exchange,提问作者Gavin.Sun
相关产品推荐
相关产品推荐

