2 // Radegast Metaverse Client
3 // Copyright (c) 2009-2013, Radegast Development Team
4 // All rights reserved.
6 // Redistribution and use in source and binary forms, with or without
7 // modification, are permitted provided that the following conditions are met:
9 // * Redistributions of source code must retain the above copyright notice,
10 // this list of conditions and the following disclaimer.
11 // * Redistributions in binary form must reproduce the above copyright
12 // notice, this list of conditions and the following disclaimer in the
13 // documentation and/or other materials provided with the distribution.
14 // * Neither the name of the application "Radegast", nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 using log4net.Appender;
39 /// Writes log information out onto the console
41 public class RadegastAppender : AnsiColorTerminalAppender
44 private static EventHandler<LogEventArgs> m_Log;
46 protected static void OnLog(object sender, LogEventArgs e)
48 EventHandler<LogEventArgs> handler = m_Log;
50 try { handler(sender, e); }
54 private static readonly object m_LogLock = new object();
56 /// <summary>Raised when the GridClient object in the main Radegast instance is changed</summary>
57 public static event EventHandler<LogEventArgs> Log
59 add { lock (m_LogLock) { m_Log += value; } }
60 remove { lock (m_LogLock) { m_Log -= value; } }
64 protected override void Append(LoggingEvent le)
69 OnLog(this, new LogEventArgs(le));
71 Console.Write("{0} [", le.TimeStamp.ToString("HH:mm:ss"));
72 WriteColorText(DeriveColor(le.Level.Name), le.Level.Name);
73 Console.Write("]: - ");
75 if (le.Level == Level.Error)
77 WriteColorText(ConsoleColor.Red, le.MessageObject.ToString());
79 else if (le.Level == Level.Warn)
81 WriteColorText(ConsoleColor.Yellow, le.MessageObject.ToString());
85 Console.Write(le.MessageObject.ToString());
89 if (RadegastInstance.GlobalInstance.GlobalLogFile != null && (!RadegastInstance.GlobalInstance.GlobalSettings.ContainsKey("log_to_file") || RadegastInstance.GlobalInstance.GlobalSettings["log_to_file"]))
90 File.AppendAllText(RadegastInstance.GlobalInstance.GlobalLogFile, RenderLoggingEvent(le) + Environment.NewLine);
95 private void WriteColorText(ConsoleColor color, string sender)
103 Console.ForegroundColor = color;
104 Console.Write(sender);
105 Console.ResetColor();
107 catch (ArgumentNullException)
109 // Some older systems dont support coloured text.
110 Console.WriteLine(sender);
114 catch (ObjectDisposedException)
119 private static ConsoleColor DeriveColor(string input)
121 int colIdx = (input.ToUpper().GetHashCode() % 6) + 9;
122 return (ConsoleColor)colIdx;
126 public class LogEventArgs : EventArgs
128 public LoggingEvent LogEntry;
130 public LogEventArgs(LoggingEvent e)