Программная настройка блока ведения журнала Enterprise Library - PullRequest
3 голосов
/ 19 ноября 2009

Ранее я использовал 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 ]

8 голосов
/ 06 ноября 2010

Enterprise Library 5.0 представила свободный интерфейс , который можно использовать для программной настройки блоков приложения. Возможно, вы найдете этот вариант более удобным.

1 голос
/ 19 ноября 2009

Чтобы отдать должное, этот ответ основан на статье Дэвида Хейдена , основанной на статье Алоиса Крауса, Programatic Configuraton - Enterprise Library (v2.0). Блок ведения журнала . Прочитайте эти две статьи, чтобы лучше понять программный доступ к ведению журналов Enterprise Library.

Я не был знаком с ListAppender, поэтому я создал CustomTraceListener, который помещает сообщения журнала в список :

  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);
    }
  }
...