【问题标题】:Programmatically access Enterprise Library Logging configuration (object model)?以编程方式访问企业库日志记录配置(对象模型)?
【发布时间】:2011-03-29 23:09:02
【问题描述】:

我正在使用Enterprise Library 3.1 并希望以编程方式访问Logging Block(运行时、对象模型),特别是它的跟踪侦听器和源。

例如,我想访问跟踪侦听器对象的Filename 属性,以便知道日志文件在磁盘上的位置。

更新:寻找使用运行时对象模型的答案,而不是通过解析 XML 配置。

【问题讨论】:

  • 2007 年在 CodePlex 上提出了类似的问题:entlib.codeplex.com/Thread/View.aspx?ThreadId=16380
  • 是否可以使用EL配置对象模型来确定属性?您是否使用没有 XML 配置的 EL 编程配置?
  • @Tuzo:谢谢你的提问。我使用的是XML配置,而你使用EL配置对象模型是可以接受的。为了进一步澄清什么是不可接受的,请回避任何 EL 对象模型,例如,提取一个普通的旧 XML 解析器并使用它加载配置。希望这会有所帮助。

标签: c# .net logging enterprise-library


【解决方案1】:

您可以使用对象模型(用于配置)以编程方式访问日志记录配置。

要获取跟踪侦听器的特定数据,您应该查看TraceListenerData(以及特定的子类)。

这个例子展示了如何读取配置然后获取 TraceListeners:

// Open config file
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = @"MyApp.exe.config";

Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);

// Get EL log settings
LoggingSettings log = config.GetSection("loggingConfiguration") as LoggingSettings;

// Get TraceListener info
foreach(TraceListenerData listener in log.TraceListeners)
{
    // Check for listener types you care about
    if (listener is RollingFlatFileTraceListenerData)
    {
        RollingFlatFileTraceListenerData data = listener as RollingFlatFileTraceListenerData;
        Console.WriteLine(string.Format("Found RollingFlatFileLIstener with Name={0}, FileName={1}, Header={2}, Footer={3}, RollSizeKB={4}, TimeStampPattern={5},RollFileExistsBehavior={6}, RollInterval={7}, TraceOutputOptions={8}, Formatter={9}, Filter={10}",
            data.Name, data.FileName, data.Header, data.Footer, data.RollSizeKB, 
            data.TimeStampPattern, data.RollFileExistsBehavior, data.RollInterval,
            data.TraceOutputOptions, data.Formatter, data.Filter);
    }
    else // other trace listener types e.g. FlatFileTraceListenerData 
    {
    }
}

【讨论】:

  • 我比我的运行时/反射尝试更喜欢这个。谢谢。
  • 注意:适用于 4.1 version ,不适用于 5.0 不编译 LoggingSettings log = config.GetSection("loggingConfiguration") as LoggingSettings;
【解决方案2】:

显然,一些需要的信息被私人封装在企业库 Logger.Writer 实例(类型为 @987654323 @)。
所以我有效地寻找:Logger.Writer.structureHolder(但该字段是私有的)。

我用反射把它拉出来了....

这些是重要的命名空间:

using System.Reflection;
using Microsoft.Practices.EnterpriseLibrary.Logging;

这是提取所需私有数据的反射代码:

// Get the private field.
FieldInfo fiLogStructHolder 
    = typeof(LogWriter).GetField("structureHolder", BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic);

// Obtain field value to get the private data.
LogWriterStructureHolder structureHolder 
    = (LogWriterStructureHolder)fiLogStructHolder.GetValue(Logger.Writer);

// Access the value's .TraceSources property of Type Dictionary<string, LogSource>.
// The string is the name of the category from configuration. 
int numSources = structureHolder.TraceSources.Count;

// Furthermore, access the listeners of any logging source by specifying:
int numListeners = structureHolder.TraceSources[0].Listeners.Count
                                             // ^-- Note: Picked first source for example.

如果有人可以找到相同数据的非私人入口点,请将其发布在答案中。谢谢。

感谢.NET Reflector 为这个答案提供了便利。

【讨论】:

    【解决方案3】:
    public static EmailTraceListenerData GetEmailLogConfiguration()
    {
        var rootWebConfig1 = WebConfigurationManager.OpenWebConfiguration("/");
        var section = rootWebConfig1.GetSection("loggingConfiguration");
        var loggingSection = section as Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings;
    
        if (loggingSection != null) {
            // Reference to Microsoft.Practices.EnterpriseLibrary.Logging.dll and
            // Microsoft.Practices.EnterpriseLibrary.Common.dll required for the code below
            foreach (Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.TraceListenerData listener in loggingSection.TraceListeners) {
                var emailTraceListenerData = listener as EmailTraceListenerData;
                if (emailTraceListenerData != null) {
                    // Can obtain FromAddress, ToAddress, SmtpServer and SmtpPort 
                    // as property of  emailTraceListenerData;
                    return emailTraceListenerData;
                }
            }
        }
        return null;
    }
    

    Web.config 文件如下:

    对于 Windows 应用程序,您可以使用System.Configuration.ConfigurationManager.OpenExeConfiguration而不是 WebConfigurationManager 打开 .config 文件。

    【讨论】:

      【解决方案4】:

      其他答案似乎很冗长,这是我的解决方案:

          public static TraceListenerData GetTraceListener(string name)
          {
              var log = ConfigurationManager.GetSection("loggingConfiguration") as LoggingSettings;
      
              return log.TraceListeners.Single(tl => tl.Name == name);
          }
      

      调用此帮助方法后,您可以将结果转换为侦听器的任何类型,例如 RollingFlatFileTraceListenerData、EmailTraceListenerData、FormattedEventLogTraceListenerData、FormattedDatabaseTraceListenerData

      【讨论】:

        猜你喜欢
        • 2010-12-18
        • 2011-09-26
        • 1970-01-01
        • 2010-09-26
        • 2015-10-12
        • 1970-01-01
        • 2011-03-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多