我正在使用log4net来记录和发送电子邮件。我需要根据不同的流程发送不同配置的不同电子邮件。例如,当我的一个方法完成处理时,它会向X发送一封邮件,当我的服务成功完成后,它会向Y发送另一封邮件。
我想我需要使用不同的appender和过滤器,但我无法正确配置它们。
我尝试了以下内容并尝试应用StringMatchFilter,以便包含“mandatory”的消息不会传递给Y,并且包含“successfully”的消息将不会传递给X,但没有运气。我也不确定这种过滤是否是进行这种配置的正确方法。
<log4net>
<appender name="ManFieldMailAppender" type="log4net.Appender.SmtpAppender,log4net">
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="WARN"/>
</evaluator>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="WARN" />
<acceptOnMatch value="true" />
</filter>
<filter type="log4net.Filter.StringMatchFilter">
<stringToMatch value="successfully" />
<acceptOnMatch value="false" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
<to value="x@xxx.com" />
<from value="aaa@aaa.com" />
<subject value="Products not made online" />
<smtpHost value="Host" />
<authentication value="1"/>
<username value="uid" />
<password value="pwd" />
<port value="25"/>
<bufferSize value="1" />
<lossy value="false" />
<layout type="log4net.Layout.PatternLayout,log4net">
<conversionPattern value="%newline %date %message%newline%newline%newline" />
</layout>
</appender>
<appender name="ServiceFinishedMailAppender" type="log4net.Appender.SmtpAppender,log4net">
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="WARN"/>
</evaluator>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="WARN" />
<acceptOnMatch value="true" />
</filter>
<filter type="log4net.Filter.StringMatchFilter">
<stringToMatch value="mandatory" />
<acceptOnMatch value="false" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
<to value="y@yyy.com" />
<from value="bbb@bbb.com" />
<subject value="Product Publish Service has successfully finished operating" />
<smtpHost value="Host" />
<authentication value="1"/>
<username value="uid" />
<password value="pwd" />
<port value="25"/>
<bufferSize value="1" />
<lossy value="false" />
<layout type="log4net.Layout.PatternLayout,log4net">
<conversionPattern value="%newline %date %message%newline%newline%newline" />
</layout>
</appender>
<root>
<appender-ref ref="ManFieldMailAppender" />
<appender-ref ref="ServiceFinishedMailAppender"/>
</root>
</log4net>
您认为问题是什么?
谢谢。
答案 0 :(得分:1)
首先,evaluator
告诉缓冲appender何时刷新。从配置的外观来看,我不认为你在缓冲。 (所以你也可以摆脱bufferSize
和lossy
参数。我看到您的appender过滤器链具有所需的DenyAllFilters
。但是,您的根记录器配置没有显示任何级别,请尝试添加
<root>
<level value="ALL" />
<!-- appender-refs as normal -->
</root>
通常,我不会根据消息文本决定登录到特定的appender。看起来你有一个操作的高级服务类。如果您对其他需要发送的消息具有相同的功能,并且您使用typename命名记录器,则可以为每个记录器指定一个appender。
<logger name="MyCompany.Product.Whatever">
<level value="WARN" />
<appender name="ManFieldMailAppender" type="...">
<!-- the rest of the configuration, without filtering goes here -->
</appender>
</logger>
<logger name="MyCompany.Services.Publish">
<level value="WARN" />
<appender name="ServiceFinishedMailAppender" type="...">
<!-- the rest of the configuration, without filtering goes here -->
</appender>
</logger>