【问题标题】:How do I use a StringMatchFilter to send logging events to different logs by their message content in log4net?如何使用 StringMatchFilter 通过 log4net 中的消息内容将日志记录事件发送到不同的日志?
【发布时间】:2011-01-25 10:14:28
【问题描述】:

我正在使用 log4net 来记录和发送电子邮件。我需要根据不同的流程发送不同配置的不同邮件。例如,当我的一个方法完成处理时,它会向 X 发送一封邮件,当我的服务成功完成时,它会向 Y 发送另一封邮件。
我想我需要使用带有过滤器的不同附加程序,但我无法正确配置它们。

我尝试了以下方法并尝试应用 StringMatchFilter,以便包含“强制”的消息不会传递给 Y,而包含“成功”的消息不会传递给 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>

你认为问题是什么?

谢谢。

【问题讨论】:

    标签: log4net log4net-configuration


    【解决方案1】:

    首先,evaluator 告诉缓冲附加程序何时刷新。从您的配置来看,我认为您没有缓冲。 (所以你也可以去掉 bufferSizelossy 参数)。我看到您的附加程序过滤器链具有所需的DenyAllFilters。但是,您的根记录器配置未显示任何级别,请尝试添加

    <root>
        <level value="ALL" />
        <!-- appender-refs as normal -->
    </root>
    

    一般来说,我不会根据消息文本决定登录到特定的附加程序。看起来您有一个用于其中一项操作的高级服务类。如果您对需要发送的其他消息有相同的要求,并且您通过 typename 命名记录器,则可以为每个记录器指定一个附加程序。

    <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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 2019-09-20
      • 1970-01-01
      • 2018-03-11
      • 1970-01-01
      相关资源
      最近更新 更多