Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using log4net;
- using log4net.Appender;
- using log4net.Config;
- using log4net.Layout;
- using log4net.Repository.Hierarchy;
- using System;
- using System.IO;
- using System.Linq;
- namespace EZX.Tools.TestTools
- {
- public class Log4NetListener : IDisposable
- {
- #region Static Properties and Fields
- private const string BaseAppenderName = "UnitTestAppender-";
- private static readonly string UniqueID = UniqueIDGenerator.GetNextID();
- private static int counter;
- public static string AppenderNamePrefix { get; private set; }
- private static Logger Root
- {
- get { return ((Hierarchy)LogManager.GetRepository()).Root; }
- }
- #endregion
- static Log4NetListener()
- {
- AppenderNamePrefix = BaseAppenderName + UniqueID;
- }
- private MemoryAppender memAppender;
- /// <summary>
- /// Attaches the listener so it would capture any log messages written.
- /// </summary>
- /// <param name="appenderName">Name of Appender which has a PatternLayout to use for writing test log messages</param>
- /// <exception cref="InvalidOperationException">if no Appender exists with specified name</exception>
- public void AttachLogListener(string appenderName)
- {
- var appender = LogManager.GetRepository().GetAppenders().Where(a => a.Name == appenderName).ToList();
- if (appender.Count == 0)
- {
- throw new InvalidOperationException(string.Format("Unable to find Appender named [{0}]! unable to setup Appender...", appenderName));
- }
- var patternLayout = ((PatternLayout)((AppenderSkeleton)(appender.First())).Layout);
- CreateAppender(patternLayout);
- }
- public void AttachLogListener()
- {
- CreateAppender(null);
- }
- private void CreateAppender(ILayout patternLayout)
- {
- memAppender = new MemoryAppender { Layout = patternLayout, Name = GetNextAppenderName() };
- BasicConfigurator.Configure(memAppender);
- }
- private static string GetNextAppenderName()
- {
- return string.Concat(AppenderNamePrefix, ++counter);
- }
- /// <summary>
- /// Gets the message written to log. Use this method only after AttachLogListener() was called
- /// and a message was written to log4net afterwards.
- /// </summary>
- public string GetRenderedMessage()
- {
- if (memAppender == null)
- {
- throw new InvalidOperationException("The listener was not attached. Make sure you call AttachLogListener() before writing to log.");
- }
- var events = memAppender.GetEvents();
- string logMessage;
- using (var writer = new StringWriter())
- {
- foreach (var ev in events)
- {
- memAppender.Layout.Format(writer, ev);
- }
- logMessage = writer.ToString();
- }
- return logMessage;
- }
- /// <summary>
- /// Gets all message logged by this appender.
- /// </summary>
- /// <returns></returns>
- public string GetMessages()
- {
- if (memAppender == null)
- {
- throw new InvalidOperationException("The listener was not attached. Make sure you call AttachLogListener() before writing to log.");
- }
- var events = memAppender.GetEvents();
- string logMessage;
- using (var writer = new StringWriter())
- {
- foreach (var ev in events)
- {
- ev.WriteRenderedMessage(writer);
- }
- logMessage = writer.ToString();
- }
- return logMessage;
- }
- public static void RemoveAll()
- {
- var root = Root;
- var testAppenders = LogManager.GetRepository().GetAppenders()
- .Where(x => x.Name.StartsWith(AppenderNamePrefix));
- foreach (var testAppender in testAppenders)
- {
- root.RemoveAppender(testAppender);
- }
- }
- /// <inheritdoc />
- public void Dispose()
- {
- Root.RemoveAppender(memAppender);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement