Advertisement
shalomshachne

Log4NetListener

Oct 5th, 2018
376
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.43 KB | None | 0 0
  1. using log4net;
  2. using log4net.Appender;
  3. using log4net.Config;
  4. using log4net.Layout;
  5. using log4net.Repository.Hierarchy;
  6. using System;
  7. using System.IO;
  8. using System.Linq;
  9.  
  10. namespace EZX.Tools.TestTools
  11. {
  12.     public class Log4NetListener : IDisposable
  13.     {
  14.  
  15.         #region Static Properties and Fields
  16.         private const string BaseAppenderName = "UnitTestAppender-";
  17.         private static readonly string UniqueID = UniqueIDGenerator.GetNextID();
  18.         private static int counter;
  19.  
  20.         public static string AppenderNamePrefix { get; private set; }
  21.  
  22.         private static Logger Root
  23.         {
  24.             get { return ((Hierarchy)LogManager.GetRepository()).Root; }
  25.         }
  26.         #endregion
  27.  
  28.         static Log4NetListener()
  29.         {
  30.             AppenderNamePrefix = BaseAppenderName + UniqueID;
  31.         }
  32.  
  33.         private MemoryAppender memAppender;
  34.  
  35.         /// <summary>
  36.         /// Attaches the listener so it would capture any log messages written.
  37.         /// </summary>
  38.         /// <param name="appenderName">Name of Appender which has a PatternLayout to use for writing test log messages</param>
  39.         /// <exception cref="InvalidOperationException">if no Appender exists with specified name</exception>
  40.         public void AttachLogListener(string appenderName)
  41.         {
  42.             var appender = LogManager.GetRepository().GetAppenders().Where(a => a.Name == appenderName).ToList();
  43.             if (appender.Count == 0)
  44.             {
  45.                 throw new InvalidOperationException(string.Format("Unable to find Appender named [{0}]! unable to setup Appender...", appenderName));
  46.             }
  47.             var patternLayout = ((PatternLayout)((AppenderSkeleton)(appender.First())).Layout);
  48.             CreateAppender(patternLayout);
  49.  
  50.         }
  51.  
  52.  
  53.         public void AttachLogListener()
  54.         {
  55.             CreateAppender(null);
  56.         }
  57.  
  58.         private void CreateAppender(ILayout patternLayout)
  59.         {
  60.             memAppender = new MemoryAppender { Layout = patternLayout, Name = GetNextAppenderName() };
  61.             BasicConfigurator.Configure(memAppender);
  62.         }
  63.  
  64.         private static string GetNextAppenderName()
  65.         {
  66.             return string.Concat(AppenderNamePrefix, ++counter);
  67.         }
  68.  
  69.         /// <summary>
  70.         /// Gets the message written to log. Use this method only after AttachLogListener() was called
  71.         /// and a message was written to log4net afterwards.
  72.         /// </summary>      
  73.         public string GetRenderedMessage()
  74.         {
  75.             if (memAppender == null)
  76.             {
  77.                 throw new InvalidOperationException("The listener was not attached. Make sure you call AttachLogListener() before writing to log.");
  78.             }
  79.             var events = memAppender.GetEvents();
  80.             string logMessage;
  81.             using (var writer = new StringWriter())
  82.             {
  83.                 foreach (var ev in events)
  84.                 {
  85.                     memAppender.Layout.Format(writer, ev);
  86.                 }
  87.                 logMessage = writer.ToString();
  88.             }
  89.             return logMessage;
  90.         }
  91.  
  92.         /// <summary>
  93.         /// Gets all message logged by this appender.
  94.         /// </summary>
  95.         /// <returns></returns>
  96.         public string GetMessages()
  97.         {
  98.             if (memAppender == null)
  99.             {
  100.                 throw new InvalidOperationException("The listener was not attached. Make sure you call AttachLogListener() before writing to log.");
  101.             }
  102.             var events = memAppender.GetEvents();
  103.             string logMessage;
  104.             using (var writer = new StringWriter())
  105.             {
  106.                 foreach (var ev in events)
  107.                 {
  108.                     ev.WriteRenderedMessage(writer);
  109.                 }
  110.                 logMessage = writer.ToString();
  111.             }
  112.             return logMessage;
  113.         }
  114.  
  115.         public static void RemoveAll()
  116.         {
  117.             var root = Root;
  118.  
  119.             var testAppenders = LogManager.GetRepository().GetAppenders()
  120.                 .Where(x => x.Name.StartsWith(AppenderNamePrefix));
  121.  
  122.             foreach (var testAppender in testAppenders)
  123.             {
  124.                 root.RemoveAppender(testAppender);
  125.             }
  126.  
  127.  
  128.         }
  129.  
  130.         /// <inheritdoc />
  131.         public void Dispose()
  132.         {
  133.             Root.RemoveAppender(memAppender);
  134.         }
  135.  
  136.  
  137.     }
  138.  
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement