Enterprise Library 5.0:在没有XML配置的情况下将日志写入文件

时间:2011-10-25 16:12:45

标签: c# .net logging enterprise-library

有一些用于记录到文件的代码。我不使用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 个答案:

答案 0 :(得分:3)

可能有几个原因(至少!)为什么你没有看到任何记录:

  1. 为日志记录配置的类别是“错误”和“调试”,但是当您致电MyLogger.Write时,您传递的是“我的类别”类别

  2. 可能存在权限问题。写入驱动器的根目录经常受到限制

  3. 另外,您应该将对LogWriterImpl的引用存储为基类LogWriter

    另外,除了直接使用日志记录类之外,最好是作为5.0版本的一部分发布的use the Fluent Configuration API。它使这种配置更加简单。举个例子:

    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的一部分被抽象化,那么实现更改的可能性就会降低。