#region Apache License // // Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright ownership. // The ASF licenses this file to you under the Apache License, Version 2.0 // (the "License"); you may not use this file except in compliance with // the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #endregion using System; using System.Text.RegularExpressions; using log4net; using log4net.Core; using log4net.Util; namespace log4net.Filter { /// /// Simple filter to match a string in the rendered message /// /// /// /// Simple filter to match a string in the rendered message /// /// /// Nicko Cadell /// Gert Driesen public class StringMatchFilter : FilterSkeleton { #region Member Variables /// /// Flag to indicate the behavior when we have a match /// protected bool m_acceptOnMatch = true; /// /// The string to substring match against the message /// protected string m_stringToMatch; /// /// A string regex to match /// protected string m_stringRegexToMatch; /// /// A regex object to match (generated from m_stringRegexToMatch) /// protected Regex m_regexToMatch; #endregion #region Constructors /// /// Default constructor /// public StringMatchFilter() { } #endregion #region Implementation of IOptionHandler /// /// Initialize and precompile the Regex if required /// /// /// /// This is part of the delayed object /// activation scheme. The method must /// be called on this object after the configuration properties have /// been set. Until is called this /// object is in an undefined state and must not be used. /// /// /// If any of the configuration properties are modified then /// must be called again. /// /// override public void ActivateOptions() { if (m_stringRegexToMatch != null) { #if NETSTANDARD1_3 m_regexToMatch = new Regex(m_stringRegexToMatch); #else m_regexToMatch = new Regex(m_stringRegexToMatch, RegexOptions.Compiled); #endif } } #endregion /// /// when matching or /// /// /// /// The property is a flag that determines /// the behavior when a matching is found. If the /// flag is set to true then the filter will the /// logging event, otherwise it will the event. /// /// /// The default is true i.e. to the event. /// /// public bool AcceptOnMatch { get { return m_acceptOnMatch; } set { m_acceptOnMatch = value; } } /// /// Sets the static string to match /// /// /// /// The string that will be substring matched against /// the rendered message. If the message contains this /// string then the filter will match. If a match is found then /// the result depends on the value of . /// /// /// One of or /// must be specified. /// /// public string StringToMatch { get { return m_stringToMatch; } set { m_stringToMatch = value; } } /// /// Sets the regular expression to match /// /// /// /// The regular expression pattern that will be matched against /// the rendered message. If the message matches this /// pattern then the filter will match. If a match is found then /// the result depends on the value of . /// /// /// One of or /// must be specified. /// /// public string RegexToMatch { get { return m_stringRegexToMatch; } set { m_stringRegexToMatch = value; } } #region Override implementation of FilterSkeleton /// /// Check if this filter should allow the event to be logged /// /// the event being logged /// see remarks /// /// /// The rendered message is matched against the . /// If the occurs as a substring within /// the message then a match will have occurred. If no match occurs /// this function will return /// allowing other filters to check the event. If a match occurs then /// the value of is checked. If it is /// true then is returned otherwise /// is returned. /// /// override public FilterDecision Decide(LoggingEvent loggingEvent) { if (loggingEvent == null) { throw new ArgumentNullException("loggingEvent"); } string msg = loggingEvent.RenderedMessage; // Check if we have been setup to filter if (msg == null || (m_stringToMatch == null && m_regexToMatch == null)) { // We cannot filter so allow the filter chain // to continue processing return FilterDecision.Neutral; } // Firstly check if we are matching using a regex if (m_regexToMatch != null) { // Check the regex if (m_regexToMatch.Match(msg).Success == false) { // No match, continue processing return FilterDecision.Neutral; } // we've got a match if (m_acceptOnMatch) { return FilterDecision.Accept; } return FilterDecision.Deny; } else if (m_stringToMatch != null) { // Check substring match if (msg.IndexOf(m_stringToMatch) == -1) { // No match, continue processing return FilterDecision.Neutral; } // we've got a match if (m_acceptOnMatch) { return FilterDecision.Accept; } return FilterDecision.Deny; } return FilterDecision.Neutral; } #endregion } }