Author: bodewig
Date: Thu Nov  3 16:22:24 2011
New Revision: 1197200

URL: http://svn.apache.org/viewvc?rev=1197200&view=rev
Log:
ColoredConsoleAppender using Console.ForegroundColor on .NET 2.0+.  
LOG4NET-292.  Submitted by Pavlos Touboulidis

Added:
    logging/log4net/trunk/src/Appender/ManagedColoredConsoleAppender.cs   (with 
props)
Modified:
    logging/log4net/trunk/pom.xml
    logging/log4net/trunk/src/log4net.vs2008.csproj
    logging/log4net/trunk/src/log4net.vs2010.csproj

Modified: logging/log4net/trunk/pom.xml
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/pom.xml?rev=1197200&r1=1197199&r2=1197200&view=diff
==============================================================================
--- logging/log4net/trunk/pom.xml (original)
+++ logging/log4net/trunk/pom.xml Thu Nov  3 16:22:24 2011
@@ -224,6 +224,9 @@
       <name>Douglas de la Torre</name>
     </contributor>
     <contributor>
+      <name>Pavlos Touboulidis</name>
+    </contributor>
+    <contributor>
       <name>Thomas Voss</name>
     </contributor>
   </contributors>

Added: logging/log4net/trunk/src/Appender/ManagedColoredConsoleAppender.cs
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/src/Appender/ManagedColoredConsoleAppender.cs?rev=1197200&view=auto
==============================================================================
--- logging/log4net/trunk/src/Appender/ManagedColoredConsoleAppender.cs (added)
+++ logging/log4net/trunk/src/Appender/ManagedColoredConsoleAppender.cs Thu Nov 
 3 16:22:24 2011
@@ -0,0 +1,342 @@
+#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
+
+// Compatibility:
+//     
http://msdn.microsoft.com/en-us/library/system.console.foregroundcolor.aspx
+// Disable for unsupported targets
+#if !NETCF 
+#if !SSCLI
+#if !CLI_1_0
+
+// The original ColoredConsoleAppender was written before the .NET framework
+// (and Mono) had built-in support for console colors so it was written using
+// Win32 API calls. The AnsiColorTerminalAppender, while it works, isn't
+// understood by the Windows command prompt.
+// This is a replacement for both that uses the new (.NET 2) Console colors
+// and works on both platforms.
+
+// On Mono/Linux (at least), setting the background color to 'Black' is
+// not the same as the default background color, as it is after
+// Console.Reset(). The difference becomes apparent while running in a
+// terminal application that supports background transparency; the
+// default color is treated as transparent while 'Black' isn't.
+// For this reason, we always reset the colors and only set those
+// explicitly specified in the configuration (Console.BackgroundColor
+// isn't set if ommited).
+
+using System;
+using log4net.Layout;
+using log4net.Util;
+using System.Globalization;
+
+namespace log4net.Appender
+{
+       /// <summary>
+       /// Appends colorful logging events to the console, using the .NET 2
+       /// built-in capabilities.
+       /// </summary>
+       /// <remarks>
+       /// <para>
+       /// ManagedColoredConsoleAppender appends log events to the standard 
output stream
+       /// or the error output stream using a layout specified by the 
+       /// user. It also allows the color of a specific type of message to be 
set.
+       /// </para>
+       /// <para>
+       /// By default, all output is written to the console's standard output 
stream.
+       /// The <see cref="Target"/> property can be set to direct the output 
to the
+       /// error stream.
+       /// </para>
+       /// <para>
+       /// When configuring the colored console appender, mappings should be
+       /// specified to map logging levels to colors. For example:
+       /// </para>
+       /// <code lang="XML" escaped="true">
+       ///     <mapping>
+       ///             <level value="ERROR" />
+       ///             <foreColor value="DarkRed" />
+       ///             <backColor value="White" />
+       ///     </mapping>
+       ///     <mapping>
+       ///             <level value="WARN" />
+       ///             <foreColor value="Yellow" />
+       ///     </mapping>
+       ///     <mapping>
+       ///             <level value="INFO" />
+       ///             <foreColor value="White" />
+       ///     </mapping>
+       ///     <mapping>
+       ///             <level value="DEBUG" />
+       ///             <foreColor value="Blue" />
+       ///     </mapping>
+       /// </code>
+       /// <para>
+       /// The Level is the standard log4net logging level while
+       /// ForeColor and BackColor are the values of <see 
cref="System.ConsoleColor"/>
+       /// enumeration.
+       /// </para>
+       /// <para>
+       /// Based on the ColoredConsoleAppender
+       /// </para>
+       /// </remarks>
+       /// <author>Rick Hobbs</author>
+       /// <author>Nicko Cadell</author>
+       /// <author>Pavlos Touboulidis</author>
+       public class ManagedColoredConsoleAppender: AppenderSkeleton
+       {
+               /// <summary>
+               /// Initializes a new instance of the <see 
cref="ManagedColoredConsoleAppender" /> class.
+               /// </summary>
+               /// <remarks>
+               /// The instance of the <see 
cref="ManagedColoredConsoleAppender" /> class is set up to write 
+               /// to the standard output stream.
+               /// </remarks>
+               public ManagedColoredConsoleAppender() 
+               {
+               }
+               
+               #region Public Instance Properties
+               /// <summary>
+               /// Target is the value of the console output stream.
+               /// This is either <c>"Console.Out"</c> or 
<c>"Console.Error"</c>.
+               /// </summary>
+               /// <value>
+               /// Target is the value of the console output stream.
+               /// This is either <c>"Console.Out"</c> or 
<c>"Console.Error"</c>.
+               /// </value>
+               /// <remarks>
+               /// <para>
+               /// Target is the value of the console output stream.
+               /// This is either <c>"Console.Out"</c> or 
<c>"Console.Error"</c>.
+               /// </para>
+               /// </remarks>
+               virtual public string Target
+               {
+                       get { return m_writeToErrorStream ? ConsoleError : 
ConsoleOut; }
+                       set
+                       {
+                               string v = value.Trim();
+                               
+                               if (string.Compare(ConsoleError, v, true, 
CultureInfo.InvariantCulture) == 0) 
+                               {
+                                       m_writeToErrorStream = true;
+                               } 
+                               else 
+                               {
+                                       m_writeToErrorStream = false;
+                               }
+                       }
+               }
+
+               /// <summary>
+               /// Add a mapping of level to color - done by the config file
+               /// </summary>
+               /// <param name="mapping">The mapping to add</param>
+               /// <remarks>
+               /// <para>
+               /// Add a <see cref="LevelColors"/> mapping to this appender.
+               /// Each mapping defines the foreground and background colors
+               /// for a level.
+               /// </para>
+               /// </remarks>
+               public void AddMapping(LevelColors mapping)
+               {
+                       m_levelMapping.Add(mapping);
+               }
+               #endregion // Public Instance Properties
+
+               #region Override implementation of AppenderSkeleton
+               /// <summary>
+               /// This method is called by the <see 
cref="AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent)"/> method.
+               /// </summary>
+               /// <param name="loggingEvent">The event to log.</param>
+               /// <remarks>
+               /// <para>
+               /// Writes the event to the console.
+               /// </para>
+               /// <para>
+               /// The format of the output will depend on the appender's 
layout.
+               /// </para>
+               /// </remarks>
+               override protected void Append(log4net.Core.LoggingEvent 
loggingEvent) 
+               {
+                       System.IO.TextWriter writer;
+                       
+                       if (m_writeToErrorStream)
+                               writer = Console.Error;
+                       else
+                               writer = Console.Out;
+                       
+                       // Reset color
+                       Console.ResetColor();
+                       
+                       // see if there is a specified lookup
+                       LevelColors levelColors = 
m_levelMapping.Lookup(loggingEvent.Level) as LevelColors;
+                       if (levelColors != null)
+                       {
+                               // if the backColor has been explicitly set
+                               if (levelColors.HasBackColor)
+                                       Console.BackgroundColor = 
levelColors.BackColor;
+                               // if the foreColor has been explicitly set
+                               if (levelColors.HasForeColor)
+                                       Console.ForegroundColor = 
levelColors.ForeColor;
+                       }
+                       
+                       // Render the event to a string
+                       string strLoggingMessage = 
RenderLoggingEvent(loggingEvent);
+                       // and write it
+                       writer.Write(strLoggingMessage);
+
+                       // Reset color again
+                       Console.ResetColor();
+               }
+
+               /// <summary>
+               /// This appender requires a <see cref="Layout"/> to be set.
+               /// </summary>
+               /// <value><c>true</c></value>
+               /// <remarks>
+               /// <para>
+               /// This appender requires a <see cref="Layout"/> to be set.
+               /// </para>
+               /// </remarks>
+               override protected bool RequiresLayout
+               {
+                       get { return true; }
+               }
+
+               /// <summary>
+               /// Initialize the options for this appender
+               /// </summary>
+               /// <remarks>
+               /// <para>
+               /// Initialize the level to color mappings set on this appender.
+               /// </para>
+               /// </remarks>
+               public override void ActivateOptions()
+               {
+                       base.ActivateOptions();
+                       m_levelMapping.ActivateOptions();
+               }
+               #endregion // Override implementation of AppenderSkeleton
+
+               #region Public Static Fields
+               /// <summary>
+               /// The <see cref="ManagedColoredConsoleAppender.Target"/> to 
use when writing to the Console 
+               /// standard output stream.
+               /// </summary>
+               /// <remarks>
+               /// <para>
+               /// The <see cref="ManagedColoredConsoleAppender.Target"/> to 
use when writing to the Console 
+               /// standard output stream.
+               /// </para>
+               /// </remarks>
+               public const string ConsoleOut = "Console.Out";
+
+               /// <summary>
+               /// The <see cref="ManagedColoredConsoleAppender.Target"/> to 
use when writing to the Console 
+               /// standard error output stream.
+               /// </summary>
+               /// <remarks>
+               /// <para>
+               /// The <see cref="ManagedColoredConsoleAppender.Target"/> to 
use when writing to the Console 
+               /// standard error output stream.
+               /// </para>
+               /// </remarks>
+               public const string ConsoleError = "Console.Error";
+               #endregion // Public Static Fields
+
+               #region Private Instances Fields
+               /// <summary>
+               /// Flag to write output to the error stream rather than the 
standard output stream
+               /// </summary>
+               private bool m_writeToErrorStream = false;
+
+               /// <summary>
+               /// Mapping from level object to color value
+               /// </summary>
+               private LevelMapping m_levelMapping = new LevelMapping();
+               #endregion // Private Instances Fields
+
+               #region LevelColors LevelMapping Entry
+               /// <summary>
+               /// A class to act as a mapping between the level that a 
logging call is made at and
+               /// the color it should be displayed as.
+               /// </summary>
+               /// <remarks>
+               /// <para>
+               /// Defines the mapping between a level and the color it should 
be displayed in.
+               /// </para>
+               /// </remarks>
+               public class LevelColors : LevelMappingEntry
+               {
+                       /// <summary>
+                       /// The mapped foreground color for the specified level
+                       /// </summary>
+                       /// <remarks>
+                       /// <para>
+                       /// Required property.
+                       /// The mapped foreground color for the specified level.
+                       /// </para>
+                       /// </remarks>
+                       public ConsoleColor ForeColor
+                       {
+                               get { return (this.foreColor); }
+                               // Keep a flag that the color has been set
+                               // and is no longer the default.
+                               set { this.foreColor = value; this.hasForeColor 
= true; }
+                       }
+                       private ConsoleColor foreColor;
+                       private bool hasForeColor;
+            internal bool HasForeColor {
+                get {
+                    return hasForeColor;
+                }
+            }
+
+                       /// <summary>
+                       /// The mapped background color for the specified level
+                       /// </summary>
+                       /// <remarks>
+                       /// <para>
+                       /// Required property.
+                       /// The mapped background color for the specified level.
+                       /// </para>
+                       /// </remarks>
+                       public ConsoleColor BackColor
+                       {
+                               get { return (this.backColor); }
+                               // Keep a flag that the color has been set
+                               // and is no longer the default.
+                               set { this.backColor = value; this.hasBackColor 
= true; }
+                       }
+                       private ConsoleColor backColor;
+            private bool hasBackColor;
+            internal bool HasBackColor {
+                get {
+                    return hasBackColor;
+                }
+            }
+               }
+               #endregion // LevelColors LevelMapping Entry
+       }
+}
+
+#endif // !CLI_1_0
+#endif // !SSCLI
+#endif // !NETCF

Propchange: logging/log4net/trunk/src/Appender/ManagedColoredConsoleAppender.cs
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: logging/log4net/trunk/src/log4net.vs2008.csproj
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net.vs2008.csproj?rev=1197200&r1=1197199&r2=1197200&view=diff
==============================================================================
--- logging/log4net/trunk/src/log4net.vs2008.csproj (original)
+++ logging/log4net/trunk/src/log4net.vs2008.csproj Thu Nov  3 16:22:24 2011
@@ -151,6 +151,9 @@
     <Compile Include="Appender\LocalSyslogAppender.cs">
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="Appender\ManagedColoredConsoleAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
     <Compile Include="Appender\MemoryAppender.cs">
       <SubType>Code</SubType>
     </Compile>

Modified: logging/log4net/trunk/src/log4net.vs2010.csproj
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net.vs2010.csproj?rev=1197200&r1=1197199&r2=1197200&view=diff
==============================================================================
--- logging/log4net/trunk/src/log4net.vs2010.csproj (original)
+++ logging/log4net/trunk/src/log4net.vs2010.csproj Thu Nov  3 16:22:24 2011
@@ -169,6 +169,7 @@
     <Compile Include="Appender\LocalSyslogAppender.cs">
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="Appender\ManagedColoredConsoleAppender.cs" />
     <Compile Include="Appender\MemoryAppender.cs">
       <SubType>Code</SubType>
     </Compile>


Reply via email to