Enterprise Library日志块的编程配置

时间:2009-11-18 21:16:54

标签: c# unit-testing logging enterprise-library

我之前使用过log4net,但我现在的雇主使用的是Enterprise Library应用程序块。我之前已经为我的核心日志记录类开发了单元测试,如下所示,并且想知道是否有人知道以下针对日志记录应用程序块的OneTimeSetup代码(对于长代码帖子而言):

public abstract class DataGathererBase
{
  public readonly log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
  public void CollectData()
  {
    this.LogDebug("Initialize started");
  }

  public static class Logger
  {
    private static LoggingSettings settings = LoggingSettings.GetLoggingSettings(new SystemConfigurationSource());

    static Logger()
    {
      log4net.Config.XmlConfigurator.Configure();
    }

    public static void LogDebug(this DataGathererBase current, string message)
    {
      if (current.logger.IsDebugEnabled)
      {
        current.logger.Debug(string.Format("{0} logged: {1}", current.GetType().Name, message));
      }
    }
  }

[TestFixture]
public class LoggerTests:DataGathererBase
{
  private ListAppender appender;
  private static ILog log;

  [TestFixtureSetUp]
  public void OneTimeSetup()
  {
    appender = new ListAppender();
    appender.Layout = new log4net.Layout.SimpleLayout();
    appender.Threshold = log4net.Core.Level.Fatal;
    log4net.Config.BasicConfigurator.Configure(appender);
    log = LogManager.GetLogger(typeof(ListAppender));
  }

  [Test]
  public void TestLogging()
  {
    this.LogDebug("Debug");
    Assert.AreEqual(0, ListAppender.logTable.Count());
  }
}

2 个答案:

答案 0 :(得分:8)

Enterprise Library 5.0引入了fluent interface,可用于以编程方式配置应用程序块。您可能会发现这是一个更舒适的选择。

答案 1 :(得分:1)

为了表示赞赏,此答案基于基于David Hayden articleAlois Kraus article, Programatic Configuraton - Enterprise Library (v2.0) Logging Block 。阅读这两篇文章,以便详细了解对Enterprise Library日志记录的编程访问。

我不熟悉ListAppender所以我创建了一个CustomTraceListener,它将日志消息粘贴在List< string>中:

  public class ListAppender : Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.CustomTraceListener
  {
    private List<string> list = new List<string>();

    public override void Write(string message)
    {
    }

    public override void WriteLine(string message)
    {
      list.Add(message);
    }

    public List<string> LogTable
    {
      get
      {
        return list;
      }
    }
  }


这是一个修改过的LoggerTests类,它以编程方式访问EL日志类来设置测试(这不使用NUnit):

  public class LoggerTests 
  {
    private ListAppender appender;
    private static LogWriter log;

    public void OneTimeSetup()
    {
      appender = new ListAppender();

      // Log all source levels
      LogSource mainLogSource = new LogSource("MainLogSource", SourceLevels.All);
      mainLogSource.Listeners.Add(appender);

      // All messages with a category of "Error" should be distributed
      // to all TraceListeners in mainLogSource.
      IDictionary<string, LogSource> traceSources = new Dictionary<string, LogSource>();
      traceSources.Add("Error", mainLogSource);

      LogSource nonExistentLogSource = null;    
      log = new LogWriter(new ILogFilter[0], traceSources, nonExistentLogSource,
                        nonExistentLogSource, mainLogSource, "Error", false, false);
    }

    public void TestLogging()
    {
      LogEntry le = new LogEntry() { Message = "Test", Severity = TraceEventType.Information };
      le.Categories.Add("Debug");
      log.Write(le);

      // we are not setup to log debug messages
      System.Diagnostics.Debug.Assert(appender.LogTable.Count == 0);

      le.Categories.Add("Error");
      log.Write(le);

      // we should have logged an error
      System.Diagnostics.Debug.Assert(appender.LogTable.Count == 1);
    }
  }