--- /dev/null
+using System;
+using System.Diagnostics;
+using System.Text;
+using log4net;
+using log4net.Core;
+
+namespace Pithos.Client.WPF.Diagnostics
+{
+ public class Log4NetForwarder : TraceListener
+ {
+ public override void Write(string message)
+ {
+ WriteLine(message);
+ }
+
+ public override void Write(object o)
+ {
+ WriteLine(o);
+ }
+
+ public override void Write(object o, string category)
+ {
+ WriteLine(o, category);
+ }
+
+ public override void Write(string message, string category)
+ {
+ WriteLine(message, category);
+ }
+
+ public override void WriteLine(string message)
+ {
+ Log(message, Level.Debug);
+ }
+
+
+ public override void WriteLine(object o)
+ {
+ Log(o.ToString(), Level.Debug);
+ }
+
+ public override void WriteLine(object o, string category)
+ {
+ using (ThreadContext.Stacks["Category"].Push(category))
+ {
+ Log(o.ToString(), Level.Debug);
+ }
+ }
+
+ public override void WriteLine(string message, string category)
+ {
+ using (ThreadContext.Stacks["Category"].Push(category))
+ {
+ Log(message, Level.Debug);
+ }
+ }
+
+ public override void Fail(string message)
+ {
+ Log(message, Level.Error);
+ }
+
+ public override void Fail(string message, string detailMessage)
+ {
+ Log(String.Format("{0} {1}", message, detailMessage), Level.Error);
+ }
+
+
+
+ public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id)
+ {
+ var message = String.Format("Event ID: [{0}]", id);
+ Log(source, eventType, message);
+ }
+
+ public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string format, params object[] args)
+ {
+ var builder = new StringBuilder();
+ builder.AppendFormat("Event ID: [{0}] ", id);
+ builder.AppendFormat(format, args);
+ var message = builder.ToString();
+
+ Log(source, eventType, message);
+ }
+
+ public override void TraceEvent(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string message)
+ {
+ Log(source, eventType, message);
+ }
+
+ private void Log(string source, TraceEventType eventType, string message)
+ {
+ var log = LogManager.GetLogger(source);
+ var level = GetLevel(eventType);
+ log.Logger.Log(GetType(), level, message, null);
+ }
+
+ private void Log(string message, Level level)
+ {
+ var stack = new StackTrace();
+ var type = stack.GetFrame(0).GetMethod().DeclaringType;
+ var log = LogManager.GetLogger(type);
+ log.Logger.Log(GetType(), level, message, null);
+ }
+
+
+ private static Level GetLevel(TraceEventType eventType)
+ {
+ var level = Level.Debug;
+ switch (eventType)
+ {
+ case TraceEventType.Information:
+ level = Level.Info;
+ break;
+ case TraceEventType.Verbose:
+ level = Level.Verbose;
+ break;
+ case TraceEventType.Warning:
+ level = Level.Warn;
+ break;
+ case TraceEventType.Critical:
+ level = Level.Critical;
+ break;
+ case TraceEventType.Error:
+ level = Level.Error;
+ break;
+ }
+ return level;
+ }
+ }
+
+}