Adding a new account now forces a logout to clear any stale Pithos cookies
[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 log = LogManager.GetLogger(source);
97                 var level = GetLevel(eventType);
98                 TaskEx.Run(()=>log.Logger.Log(GetType(), level, message, null));
99             }
100             catch(Exception ex)
101             {
102                 
103             }
104         }
105
106         private void Log(string message, Level level)
107         {
108             try
109             {
110
111             var stack = new StackTrace();
112             var type = stack.GetFrame(0).GetMethod().DeclaringType;
113             var log = LogManager.GetLogger(type);
114             log.Logger.Log(GetType(), level, message, null);
115             }
116             catch (Exception)
117             {
118             }
119         }
120
121
122         private static Level GetLevel(TraceEventType eventType)
123         {
124             var level = Level.Debug;
125             switch (eventType)
126             {
127                 case TraceEventType.Information:
128                     level = Level.Info;
129                     break;
130                 case TraceEventType.Verbose:
131                     level = Level.Verbose;
132                     break;
133                 case TraceEventType.Warning:
134                     level = Level.Info;
135                     break;
136                 case TraceEventType.Critical:
137                     level = Level.Info;
138                     break;
139                 case TraceEventType.Error:
140                     level = Level.Info;
141                     break;
142             }
143             return level;
144         }
145     }
146
147 }