Enterprise Library 5.0: запись журнала в файл без настройки XML - PullRequest
1 голос
/ 25 октября 2011

Есть некоторый код для входа в файл. Я не использую app.config

class Program
{
   static void Main(string[] args)
   {
      MyLogger.Write("This is message error", "My Category");
      Console.ReadKey();
   }      
}

public static class MyLogger
{
   static readonly LogWriterImpl _writer;

   static MyLogger()
   {
      TextFormatter formatter = new TextFormatter
            ("Timestamp: {timestamp}{newline}" +
            "Message: {message}{newline}" +
            "Category: {category}{newline}");

      var logFileListener = new Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.FlatFileTraceListener
      (
         "c:\\messages.log", "----------", "----------", formatter
      );


      LogSource mainLogSource = new LogSource("MainLogSource", SourceLevels.All);
      mainLogSource.Listeners.Add(logFileListener);
      LogSource nonExistantLogSource = new LogSource("Empty");

      IDictionary<string, LogSource> traceSources = new Dictionary<string, LogSource>();
      traceSources.Add("Error", mainLogSource);
      traceSources.Add("Debug", mainLogSource);


      _writer = new LogWriterImpl
      (
         new Microsoft.Practices.EnterpriseLibrary.Logging.Filters.ILogFilter[0],
         traceSources,
         nonExistantLogSource,
         nonExistantLogSource,
         mainLogSource,
         "Error",
         false,
         true
         );
   }

   public static void Write(string message)
   {
      Write(message, "Error");
   }

   public static void Write(string message, string category)
   {
      LogEntry entry = new LogEntry();

      entry.Categories.Add(category);
      entry.Message = message;

      _writer.Write(entry);
   }
}

Эта программа работает без ошибок, но она не создает файл журнала c: \ messages.log и не записывает сущность журнала. Где ошибка? Я не хочу использовать файл конфигурации приложения в моем проекте

1 Ответ

3 голосов
/ 26 октября 2011

Может быть несколько причин (по крайней мере!), Почему вы не видите никаких записей:

  1. Категории, которые настроены для ведения журнала: «Ошибка» и «Отладка», но когда вы звоните MyLogger.Write, вы передаете категорию «Моя категория»

  2. Возможно, проблема с разрешением. Запись в корень диска часто ограничена

Кроме того, вы, вероятно, должны хранить ссылку на LogWriterImpl в качестве базового класса LogWriter.

С другой стороны, вместо непосредственного использования классов ведения журналов предпочтительно использовать API конфигурации Fluent , выпущенный как часть версии 5.0. Это делает этот тип конфигурации намного проще. Как пример:

var builder = new ConfigurationSourceBuilder();

builder.ConfigureLogging()
       .WithOptions
         .DoNotRevertImpersonation()
       .LogToCategoryNamed("My Category")
         .SendTo.FlatFile("MyMessages")
           .FormatWith(new FormatterBuilder()
             .TextFormatterNamed("Text Formatter")
               .UsingTemplate("Timestamp: {timestamp}...{newline})}"))
             .ToFile("c:\\messages.log");

var configSource = new DictionaryConfigurationSource();
builder.UpdateConfigurationWithReplace(configSource);
EnterpriseLibraryContainer.Current 
  = EnterpriseLibraryContainer.CreateDefaultContainer(configSource);

Это также более ремонтопригодно и поддерживается. Например. меньше шансов, что не будет существенных изменений в реализации, например, когда LogWriter было сделано абстрактным как часть версии 5.

...