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