code_junkie

How to log MethodName when wrapping Log4net?

Nov 11th, 2011
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.54 KB | None | 0 0
  1. loggingEvent.LocationInformation.MethodName
  2. loggingEvent.LocationInformation.ClassName
  3.  
  4. Logger.Debug("Logging to Debug");
  5. Logger.Info("Logging to Info");
  6. Logger.Warn("Logging to Warn");
  7. Logger.Error(ex);
  8. Logger.Fatal(ex);
  9.  
  10. public static class Logger
  11. {
  12. private readonly static Type ThisDeclaringType = typeof(Logger);
  13. private static readonly ILogger defaultLogger;
  14.  
  15. static Logger()
  16. {
  17. defaultLogger =
  18. LoggerManager.GetLogger(Assembly.GetCallingAssembly(),"MyDefaultLoggger");
  19.  
  20. public static void Info(string message)
  21. {
  22. if (defaultLogger.IsEnabledFor(infoLevel))
  23. {
  24. defaultLogger.Log(typeof(Logger), infoLevel, message, null);
  25. }
  26. }
  27.  
  28. private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
  29.  
  30. <layout type="log4net.Layout.PatternLayout">
  31. <conversionPattern value="%date [%thread] %-5level %logger [%M %C] - %message%newline" />
  32. </layout>
  33.  
  34. [assembly: log4net.Config.XmlConfigurator(Watch = true)]
  35.  
  36. using System;
  37. using System.ComponentModel;
  38. using System.Diagnostics;
  39. using System.Reflection;
  40. using System.Threading;
  41. using log4net;
  42. using log4net.Core;
  43.  
  44. namespace Utility
  45. {
  46. public class Logger
  47. {
  48. static Logger()
  49. {
  50. LogManager.GetLogger(typeof(Logger));
  51. }
  52.  
  53. public static void Debug(string message, params object[] parameters)
  54. {
  55. Log(message, Level.Debug, null, parameters);
  56. }
  57.  
  58. public static void Info(string message, params object[] parameters)
  59. {
  60. Log(message, Level.Info, null, parameters);
  61. }
  62.  
  63. public static void Warn(string message, params object[] parameters)
  64. {
  65. Log(message, Level.Warn, null, parameters);
  66. }
  67.  
  68. public static void Error(string message, params object[] parameters)
  69. {
  70. Error(message, null, parameters);
  71. }
  72.  
  73. public static void Error(Exception exception)
  74. {
  75. if (exception==null)
  76. return;
  77. Error(exception.Message, exception);
  78. }
  79.  
  80. public static void Error(string message, Exception exception, params object[] parameters)
  81. {
  82. string exceptionStack = "";
  83.  
  84. if (exception != null)
  85. {
  86. exceptionStack = exception.GetType().Name + " : " + exception.Message + Environment.NewLine;
  87. Exception loopException = exception;
  88. while (loopException.InnerException != null)
  89. {
  90. loopException = loopException.InnerException;
  91. exceptionStack += loopException.GetType().Name + " : " + loopException.Message + Environment.NewLine;
  92. }
  93. }
  94.  
  95. Log(message, Level.Error, exceptionStack, parameters);
  96. }
  97.  
  98.  
  99.  
  100. private static void Log(string message, Level logLevel, string exceptionMessage, params object[] parameters)
  101. {
  102. BackgroundWorker worker = new BackgroundWorker();
  103. worker.DoWork += LogEvent;
  104. worker.RunWorkerAsync(new LogMessageSpec
  105. {
  106. ExceptionMessage = exceptionMessage,
  107. LogLevel = logLevel,
  108. Message = message,
  109. Parameters = parameters,
  110. Stack = new StackTrace(),
  111. LogTime = DateTime.Now
  112. });
  113. }
  114.  
  115. private static void LogEvent(object sender, DoWorkEventArgs e)
  116. {
  117. try
  118. {
  119. LogMessageSpec messageSpec = (LogMessageSpec) e.Argument;
  120.  
  121. StackFrame frame = messageSpec.Stack.GetFrame(2);
  122. MethodBase method = frame.GetMethod();
  123. Type reflectedType = method.ReflectedType;
  124.  
  125. ILogger log = LoggerManager.GetLogger(reflectedType.Assembly, reflectedType);
  126. Level currenLoggingLevel = ((log4net.Repository.Hierarchy.Logger) log).Parent.Level;
  127.  
  128. if (messageSpec.LogLevel<currenLoggingLevel)
  129. return;
  130.  
  131. messageSpec.Message = string.Format(messageSpec.Message, messageSpec.Parameters);
  132. string stackTrace = "";
  133. StackFrame[] frames = messageSpec.Stack.GetFrames();
  134. if (frames != null)
  135. {
  136. foreach (StackFrame tempFrame in frames)
  137. {
  138.  
  139. MethodBase tempMethod = tempFrame.GetMethod();
  140. stackTrace += tempMethod.Name + Environment.NewLine;
  141. }
  142. }
  143. string userName = Thread.CurrentPrincipal.Identity.Name;
  144. LoggingEventData evdat = new LoggingEventData
  145. {
  146. Domain = stackTrace,
  147. Identity = userName,
  148. Level = messageSpec.LogLevel,
  149. LocationInfo = new LocationInfo(reflectedType.FullName,
  150. method.Name,
  151. frame.GetFileName(),
  152. frame.GetFileLineNumber().ToString()),
  153. LoggerName = reflectedType.Name,
  154. Message = messageSpec.Message,
  155. TimeStamp = messageSpec.LogTime,
  156. UserName = userName,
  157. ExceptionString = messageSpec.ExceptionMessage
  158. };
  159. log.Log(new LoggingEvent(evdat));
  160. }
  161. catch (Exception)
  162. {}//don't throw exceptions on background thread especially about logging!
  163. }
  164.  
  165. private class LogMessageSpec
  166. {
  167. public StackTrace Stack { get; set; }
  168. public string Message { get; set; }
  169. public Level LogLevel { get; set; }
  170. public string ExceptionMessage { get; set; }
  171. public object[] Parameters { get; set; }
  172. public DateTime LogTime { get; set; }
  173. }
  174. }
  175. }
Add Comment
Please, Sign In to add comment