#region Copyright & License
//
// Copyright 2001-2005 The Apache Software Foundation
//
// Licensed 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)
{
m_regexToMatch = new Regex(m_stringRegexToMatch, RegexOptions.Compiled);
}
}
#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
}
}