#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. /// /// override protected 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. /// /// override protected 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. /// /// override protected 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. /// /// virtual public 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. /// virtual public 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. /// /// virtual public 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. /// /// virtual public 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. /// virtual public 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. /// virtual public 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 } }