Statistics
| Branch: | Revision:

root / trunk / Pithos.Client.WPF / Diagnostics / log4netForwarder.cs @ 97d149c1

History | View | Annotate | Download (4 kB)

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.Warn;
135
                    break;
136
                case TraceEventType.Critical:
137
                    level = Level.Critical;
138
                    break;
139
                case TraceEventType.Error:
140
                    level = Level.Error;
141
                    break;
142
            }
143
            return level;
144
        }
145
    }
146

    
147
}