OSDN Git Service

2e831974712ae5719afdd644c44f253a7cb62dbe
[radegast/radegast.git] / Radegast / Core / RadegastLogger.cs
1 // 
2 // Radegast Metaverse Client
3 // Copyright (c) 2009-2013, Radegast Development Team
4 // All rights reserved.
5 // 
6 // Redistribution and use in source and binary forms, with or without
7 // modification, are permitted provided that the following conditions are met:
8 // 
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.
17 // 
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.
28 //
29 // $Id$
30 //
31 using System;
32 using System.IO;
33 using log4net.Appender;
34 using log4net.Core;
35
36 namespace Radegast
37 {
38     /// <summary>
39     /// Writes log information out onto the console
40     /// </summary>
41     public class RadegastAppender : AnsiColorTerminalAppender
42     {
43         #region Events
44         private static EventHandler<LogEventArgs> m_Log;
45
46         protected static void OnLog(object sender, LogEventArgs e)
47         {
48             EventHandler<LogEventArgs> handler = m_Log;
49             if (handler != null)
50                 try { handler(sender, e); }
51                 catch { }
52         }
53
54         private static readonly object m_LogLock = new object();
55
56         /// <summary>Raised when the GridClient object in the main Radegast instance is changed</summary>
57         public static event EventHandler<LogEventArgs> Log
58         {
59             add { lock (m_LogLock) { m_Log += value; } }
60             remove { lock (m_LogLock) { m_Log -= value; } }
61         }
62         #endregion Events
63
64         protected override void Append(LoggingEvent le)
65         {
66             try
67             {
68                 if (m_Log != null)
69                     OnLog(this, new LogEventArgs(le));
70                 
71                 Console.Write("{0} [", le.TimeStamp.ToString("HH:mm:ss"));
72                 WriteColorText(DeriveColor(le.Level.Name), le.Level.Name);
73                 Console.Write("]: - ");
74
75                 if (le.Level == Level.Error)
76                 {
77                     WriteColorText(ConsoleColor.Red, le.MessageObject.ToString());
78                 }
79                 else if (le.Level == Level.Warn)
80                 {
81                     WriteColorText(ConsoleColor.Yellow, le.MessageObject.ToString());
82                 }
83                 else
84                 {
85                     Console.Write(le.MessageObject.ToString());
86                 }
87                 Console.WriteLine();
88
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);
91             }
92             catch (Exception) { }
93         }
94
95         private void WriteColorText(ConsoleColor color, string sender)
96         {
97             try
98             {
99                 lock (this)
100                 {
101                     try
102                     {
103                         Console.ForegroundColor = color;
104                         Console.Write(sender);
105                         Console.ResetColor();
106                     }
107                     catch (ArgumentNullException)
108                     {
109                         // Some older systems dont support coloured text.
110                         Console.WriteLine(sender);
111                     }
112                 }
113             }
114             catch (ObjectDisposedException)
115             {
116             }
117         }
118
119         private static ConsoleColor DeriveColor(string input)
120         {
121             int colIdx = (input.ToUpper().GetHashCode() % 6) + 9;
122             return (ConsoleColor)colIdx;
123         }
124     }
125
126     public class LogEventArgs : EventArgs
127     {
128         public LoggingEvent LogEntry;
129
130         public LogEventArgs(LoggingEvent e)
131         {
132             LogEntry = e;
133         }
134     }
135 }
136