Statistics
| Branch: | Revision:

root / trunk / Pithos.Client.WPF / Diagnostics / log4netForwarder.cs @ 0a9d4d18

History | View | Annotate | Download (4.1 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 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
}