Merge branch 'master' of https://code.grnet.gr/git/pithos-ms-client
[pithos-ms-client] / trunk / Pithos.Client.WPF / Diagnostics / log4netForwarder.cs
1 using System;
2 using System.Diagnostics;
3 using System.Text;
4 using log4net;
5 using log4net.Core;
6
7 namespace Pithos.Client.WPF.Diagnostics
8 {
9     public class Log4NetForwarder : TraceListener
10     {
11         public override void Write(string message)
12         {
13             WriteLine(message);
14         }
15
16         public override void Write(object o)
17         {
18             WriteLine(o);
19         }
20
21         public override void Write(object o, string category)
22         {
23             WriteLine(o, category);
24         }
25
26         public override void Write(string message, string category)
27         {
28             WriteLine(message, category);
29         }
30
31         public override void WriteLine(string message)
32         {
33             Log(message, Level.Debug);
34         }
35
36
37         public override void WriteLine(object o)
38         {
39             Log(o.ToString(), Level.Debug);
40         }
41
42         public override void WriteLine(object o, string category)
43         {
44             using (ThreadContext.Stacks["Category"].Push(category))
45             {
46                 Log(o.ToString(), Level.Debug);
47             }
48         }
49
50         public override void WriteLine(string message, string category)
51         {
52             using (ThreadContext.Stacks["Category"].Push(category))
53             {
54                 Log(message, Level.Debug);
55             }
56         }
57
58         public override void Fail(string message)
59         {
60             Log(message, Level.Error);
61         }
62
63         public override void Fail(string message, string detailMessage)
64         {
65             Log(String.Format("{0} {1}", message, detailMessage), Level.Error);
66         }
67
68
69
70         public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id)
71         {
72             var message = String.Format("Event ID: [{0}]", id);
73             Log(source, eventType, message);
74         }
75
76         public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string format, params object[] args)
77         {
78             var builder = new StringBuilder();
79             builder.AppendFormat("Event ID: [{0}] ", id);
80             builder.AppendFormat(format, args);
81             var message = builder.ToString();
82
83             Log(source, eventType, message);
84         }
85
86         public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string message)
87         {
88             Log(source, eventType, message);
89         }
90
91         private void Log(string source, TraceEventType eventType, string message)
92         {
93             var log = LogManager.GetLogger(source);
94             var level = GetLevel(eventType);
95             log.Logger.Log(GetType(), level, message, null);
96         }
97
98         private void Log(string message, Level level)
99         {
100             var stack = new StackTrace();
101             var type = stack.GetFrame(0).GetMethod().DeclaringType;
102             var log = LogManager.GetLogger(type);
103             log.Logger.Log(GetType(), level, message, null);
104         }
105
106
107         private static Level GetLevel(TraceEventType eventType)
108         {
109             var level = Level.Debug;
110             switch (eventType)
111             {
112                 case TraceEventType.Information:
113                     level = Level.Info;
114                     break;
115                 case TraceEventType.Verbose:
116                     level = Level.Verbose;
117                     break;
118                 case TraceEventType.Warning:
119                     level = Level.Warn;
120                     break;
121                 case TraceEventType.Critical:
122                     level = Level.Critical;
123                     break;
124                 case TraceEventType.Error:
125                     level = Level.Error;
126                     break;
127             }
128             return level;
129         }
130     }
131
132 }