[
https://issues.apache.org/jira/browse/LOG4J2-1039?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14569847#comment-14569847
]
Ralph Goers commented on LOG4J2-1039:
-------------------------------------
The "normal" operation of appenders is to apply the filters before the event is
passed to the filter. If the event is denied it will never be passed to the
filter. I am opposed to creating a one-off behavior as it will end up confusing
most users. If you want to create a "BufferingMarkerFilter" or something like
it that can achieve the same result that you are looking for I would not be
opposed to that.
> SmtpAppender needs the ability to filter out logging events that contain a
> specific Marker
> ------------------------------------------------------------------------------------------
>
> Key: LOG4J2-1039
> URL: https://issues.apache.org/jira/browse/LOG4J2-1039
> Project: Log4j 2
> Issue Type: Improvement
> Components: Appenders, Filters
> Affects Versions: 2.3
> Reporter: Tony DeFusco
> Labels: easyfix, features, patch
> Attachments: SmtpAppender.java
>
>
> I have a use case where some of my logged events have been marked with a
> custom _Marker_ (e.g. "PRIVATE"). When the _SMTP Appender_ sends out an
> e-mail with the triggering event and its cyclic buffer of collected log
> events, I do not want the log events that have been set with a custom
> _Marker_ to be included in the e-mail.
> Such a use case could be configured as follows for an _SMTP Appender_ that
> needs to respond to *WARN* level or greater:
> {code:xml}...
> <Appender type="SMTP" name="smtp" bufferSize="5"
> smtpHost="${smtpHost}" smtpPort="${smtpPort}"
> smtpProtocol="${smtpProtocol}"
> smtpUsername="${smtpUsername}" smtpPassword="${smtpPassword}"
> subject="${smtpSubject}"
> from="${smtpFrom}"
> to="${smtpTo}"
> replyTo="${smtpReplyTo}"
> cc="${smtpCc}"
> bcc="${smtpBcc}"
> >
> <Layout type="PatternLayout">
> <Pattern>%m</Pattern>
> </Layout>
> <Filters>
> <MarkerFilter marker="PRIVATE" onMatch="DENY" onMismatch="NEUTRAL"/>
> <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
> </Filters>
> </Appender>
> ...
> {code}
> Here is a patch that I made to
> _org.apache.logging.log4j.core.appender.SmtpAppender.java_ that seems to
> support this use case:
> {code:title=org.apache.logging.log4j.core.appender.SmtpAppender.java}...
> package org.apache.logging.log4j.core.appender;
> import java.io.Serializable;
> import java.util.List;
> import org.apache.logging.log4j.core.Filter;
> import org.apache.logging.log4j.core.Layout;
> import org.apache.logging.log4j.core.LogEvent;
> import org.apache.logging.log4j.core.config.plugins.Plugin;
> import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
> import org.apache.logging.log4j.core.config.plugins.PluginElement;
> import org.apache.logging.log4j.core.config.plugins.PluginFactory;
> import org.apache.logging.log4j.core.filter.CompositeFilter;
> import org.apache.logging.log4j.core.filter.MarkerFilter;
> import org.apache.logging.log4j.core.filter.ThresholdFilter;
> import org.apache.logging.log4j.core.layout.HtmlLayout;
> import org.apache.logging.log4j.core.net.SmtpManager;
> import org.apache.logging.log4j.core.util.Booleans;
> ...
> /**
> * Capture all events in CyclicBuffer. Ignore events that are
> * denied by a MarkerFilter.
> * @param event The Log event.
> * @return true if the event should be filtered.
> */
> @Override
> public boolean isFiltered(final LogEvent event) {
> boolean filtered = false;
> final Filter filter = this.getFilter();
> if (filter instanceof CompositeFilter) {
> final List<Filter> filters = ((CompositeFilter)filter).getFilters();
> for (final Filter aFilter : filters) {
> final Filter.Result filterResult = (aFilter != null) ?
> aFilter.filter(event) : Filter.Result.NEUTRAL;
> if (!Filter.Result.NEUTRAL.equals(filterResult)) {
> filtered = (Filter.Result.DENY.equals(filterResult));
> if (filtered) {
> final boolean isMarkerFilter = aFilter instanceof MarkerFilter;
> // Ignore events that are denied by a MarkerFilter.
> if (!isMarkerFilter) {
> manager.add(event);
> }
> }
> break;
> }
> }
> }
> else {
> filtered = super.isFiltered(event);
> if (filtered) {
> final boolean isMarkerFilter = filter instanceof MarkerFilter;
> if (!isMarkerFilter) {
> manager.add(event);
> }
> }
> }
> return filtered;
> }
> ...{code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]