#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 log4net.Util;
using log4net.Layout;
using log4net.Core;
namespace log4net.Appender
{
///
/// This appender forwards logging events to attached appenders.
///
///
///
/// The forwarding appender can be used to specify different thresholds
/// and filters for the same appender at different locations within the hierarchy.
///
///
/// Nicko Cadell
/// Gert Driesen
public class ForwardingAppender : AppenderSkeleton, IAppenderAttachable
{
#region Public Instance Constructors
///
/// Initializes a new instance of the class.
///
///
///
/// Default constructor.
///
///
public ForwardingAppender()
{
}
#endregion Public Instance Constructors
#region Override implementation of AppenderSkeleton
///
/// Closes the appender and releases resources.
///
///
///
/// Releases any resources allocated within the appender such as file handles,
/// network connections, etc.
///
///
/// It is a programming error to append to a closed appender.
///
///
protected override void OnClose()
{
// Remove all the attached appenders
lock(this)
{
if (m_appenderAttachedImpl != null)
{
m_appenderAttachedImpl.RemoveAllAppenders();
}
}
}
///
/// Forward the logging event to the attached appenders
///
/// The event to log.
///
///
/// Delivers the logging event to all the attached appenders.
///
///
protected override void Append(LoggingEvent loggingEvent)
{
// Pass the logging event on the the attached appenders
if (m_appenderAttachedImpl != null)
{
m_appenderAttachedImpl.AppendLoopOnAppenders(loggingEvent);
}
}
///
/// Forward the logging events to the attached appenders
///
/// The array of events to log.
///
///
/// Delivers the logging events to all the attached appenders.
///
///
protected override void Append(LoggingEvent[] loggingEvents)
{
// Pass the logging event on the the attached appenders
if (m_appenderAttachedImpl != null)
{
m_appenderAttachedImpl.AppendLoopOnAppenders(loggingEvents);
}
}
#endregion Override implementation of AppenderSkeleton
#region Implementation of IAppenderAttachable
///
/// Adds an to the list of appenders of this
/// instance.
///
/// The to add to this appender.
///
///
/// If the specified is already in the list of
/// appenders, then it won't be added again.
///
///
public virtual void AddAppender(IAppender newAppender)
{
if (newAppender == null)
{
throw new ArgumentNullException("newAppender");
}
lock(this)
{
if (m_appenderAttachedImpl == null)
{
m_appenderAttachedImpl = new log4net.Util.AppenderAttachedImpl();
}
m_appenderAttachedImpl.AddAppender(newAppender);
}
}
///
/// Gets the appenders contained in this appender as an
/// .
///
///
/// If no appenders can be found, then an
/// is returned.
///
///
/// A collection of the appenders in this appender.
///
public virtual AppenderCollection Appenders
{
get
{
lock(this)
{
if (m_appenderAttachedImpl == null)
{
return AppenderCollection.EmptyCollection;
}
else
{
return m_appenderAttachedImpl.Appenders;
}
}
}
}
///
/// Looks for the appender with the specified name.
///
/// The name of the appender to lookup.
///
/// The appender with the specified name, or null.
///
///
///
/// Get the named appender attached to this appender.
///
///
public virtual IAppender GetAppender(string name)
{
lock(this)
{
if (m_appenderAttachedImpl == null || name == null)
{
return null;
}
return m_appenderAttachedImpl.GetAppender(name);
}
}
///
/// Removes all previously added appenders from this appender.
///
///
///
/// This is useful when re-reading configuration information.
///
///
public virtual void RemoveAllAppenders()
{
lock(this)
{
if (m_appenderAttachedImpl != null)
{
m_appenderAttachedImpl.RemoveAllAppenders();
m_appenderAttachedImpl = null;
}
}
}
///
/// Removes the specified appender from the list of appenders.
///
/// The appender to remove.
/// The appender removed from the list
///
/// The appender removed is not closed.
/// If you are discarding the appender you must call
/// on the appender removed.
///
public virtual IAppender RemoveAppender(IAppender appender)
{
lock(this)
{
if (appender != null && m_appenderAttachedImpl != null)
{
return m_appenderAttachedImpl.RemoveAppender(appender);
}
}
return null;
}
///
/// Removes the appender with the specified name from the list of appenders.
///
/// The name of the appender to remove.
/// The appender removed from the list
///
/// The appender removed is not closed.
/// If you are discarding the appender you must call
/// on the appender removed.
///
public virtual IAppender RemoveAppender(string name)
{
lock(this)
{
if (name != null && m_appenderAttachedImpl != null)
{
return m_appenderAttachedImpl.RemoveAppender(name);
}
}
return null;
}
#endregion Implementation of IAppenderAttachable
#region Private Instance Fields
///
/// Implementation of the interface
///
private AppenderAttachedImpl m_appenderAttachedImpl;
#endregion Private Instance Fields
}
}