Как я могу использовать StringMatchFilter для отправки событий регистрации в разные журналы по их содержимому сообщения в log4net? - PullRequest
1 голос
/ 25 января 2011

Я использую 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>

Как вы думаете, в чем проблема?

Спасибо.

1 Ответ

1 голос
/ 16 июня 2011

Во-первых, evaluator сообщает буферизующим аппендерам, когда нужно очищать. Судя по вашей конфигурации, я не думаю, что вы буферизуете. (так что вы также можете избавиться от параметров bufferSize и lossy). Я вижу, что у цепочек фильтров вашего аппендера есть требуемые значения DenyAllFilters. Но в конфигурации вашего корневого логгера нет уровней, попробуйте добавить

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

В общем, я бы не принял решение войти в систему для конкретного аппендера на основании текста сообщения. Похоже, у вас есть высокоуровневый класс обслуживания для одной из операций. Если у вас есть то же самое для других сообщений, которые нужно отправить, и вы называете свои регистраторы 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>
...