You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4net-dev@logging.apache.org by ni...@apache.org on 2004/12/08 21:08:12 UTC

cvs commit: logging-log4net/src/Repository/Hierarchy Hierarchy.cs

nicko       2004/12/08 12:08:12

  Modified:    src/Repository/Hierarchy Hierarchy.cs
  Log:
  Updated GetAppenders() method to supported nested appenders
  
  Revision  Changes    Path
  1.8       +47 -7     logging-log4net/src/Repository/Hierarchy/Hierarchy.cs
  
  Index: Hierarchy.cs
  ===================================================================
  RCS file: /home/cvs/logging-log4net/src/Repository/Hierarchy/Hierarchy.cs,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- Hierarchy.cs	21 Oct 2004 22:15:46 -0000	1.7
  +++ Hierarchy.cs	8 Dec 2004 20:08:12 -0000	1.8
  @@ -372,26 +372,66 @@
   		}
   
   		/// <summary>
  -		/// Returns all the Appenders that are configured as an Array.
  +		/// Returns all the Appenders that are currently configured
   		/// </summary>
  -		/// <returns>All the Appenders</returns>
  +		/// <returns>An array containing all the currently configured appenders</returns>
   		/// <remarks>
  -		/// <para>Returns all the Appenders that are configured as an Array.</para>
  +		/// <para>
  +		/// Returns all the <see cref="log4net.Appender.IAppender"/> instances that are currently configured.
  +		/// All the loggers are searched for appenders. The appenders may also be containers
  +		/// for appenders and these are also searched for additional loggers.
  +		/// </para>
  +		/// <para>
  +		/// The list returned is unordered but does not contain duplicates.
  +		/// </para>
   		/// </remarks>
   		override public log4net.Appender.IAppender[] GetAppenders()
   		{
  -			System.Collections.ArrayList appenders = new System.Collections.ArrayList();
  +			System.Collections.ArrayList appenderList = new System.Collections.ArrayList();
  +
  +			CollectAppenders(appenderList, Root);
   
  -			appenders.AddRange(Root.Appenders);
   			foreach(Logger logger in GetCurrentLoggers())
   			{
  -				appenders.AddRange(logger.Appenders);
  +				CollectAppenders(appenderList, logger);
   			}
   
  -			return (log4net.Appender.IAppender[])appenders.ToArray(typeof(log4net.Appender.IAppender));
  +			return (log4net.Appender.IAppender[])appenderList.ToArray(typeof(log4net.Appender.IAppender));
   		}
   
   		#endregion Override Implementation of LoggerRepositorySkeleton
  +
  +		/// <summary>
  +		/// Collect the appenders from an <see cref="IAppenderAttachable"/>.
  +		/// The appender may also be a container.
  +		/// </summary>
  +		/// <param name="appenderList"></param>
  +		/// <param name="appender"></param>
  +		private static void CollectAppender(System.Collections.ArrayList appenderList, log4net.Appender.IAppender appender)
  +		{
  +			if (!appenderList.Contains(appender))
  +			{
  +				appenderList.Add(appender);
  +
  +				if (appender is IAppenderAttachable)
  +				{
  +					CollectAppenders(appenderList, (IAppenderAttachable)appender);
  +				}
  +			}
  +		}
  +
  +		/// <summary>
  +		/// Collect the appenders from an <see cref="IAppenderAttachable"/> container
  +		/// </summary>
  +		/// <param name="appenderList"></param>
  +		/// <param name="container"></param>
  +		private static void CollectAppenders(System.Collections.ArrayList appenderList, IAppenderAttachable container)
  +		{
  +			foreach(log4net.Appender.IAppender appender in container.Appenders)
  +			{
  +				CollectAppender(appenderList, appender);
  +			}
  +		}
   
   		#region Implementation of IBasicRepositoryConfigurator