【问题标题】:Modify loggingConfiguration Programmatic (enterprise library)修改 loggingConfiguration Programmatic(企业库)
【发布时间】:2010-04-14 18:59:45
【问题描述】:

我在 m win 应用程序中有 app.config 和 loggingConfiguration 部分(企业库 4.1)。

我需要以编程方式执行此操作,

获取 loggingConfiguration 中所有监听器的列表

修改几个RollingFlatFileTraceListener的属性fileName=".\Trazas\Excepciones.log"

修改AuthenticatingEmailTraceListener监听器的几个属性,

任何建议,我没有找到任何参考或样本

<listeners>

  <add name="Excepciones RollingFile Listener" fileName=".\Trazas\Excepciones.log" 
       formatter="Text Single Formatter" 
       footer="&lt;/Excepcion&gt;" 
       header="&lt;Excepcion&gt;"
       rollFileExistsBehavior="Overwrite" rollInterval="None" rollSizeKB="1500" timeStampPattern="yyyy-MM-dd" 
       listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.RollingFlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" traceOutputOptions="None" filter="All" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.RollingFlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />


  <add name="AuthEmailTraceListener"
            type="zzzz.Frk.Logging.AuthEmailTraceListener.AuthenticatingEmailTraceListener, zzzz.Frk.Logging.AuthEmailTraceListener"
            listenerDataType="zzzz.Frk.Logging.AuthEmailTraceListener.AuthenticatingEmailTraceListenerData, zzzz.Frk.Logging.AuthEmailTraceListener"
            formatter="Exception Formatter"
            traceOutputOptions="None"
            toAddress="xxxx@gmail.com"
            fromAddress="xxxx@gmail.com"
            subjectLineStarter=" Excepción detectada - "
            subjectLineEnder="incidencias"
            smtpServer="smtp.gmail.com"
            smtpPort="587" 
            authenticate="true"
            username="xxxxxxx@gmail.com"
            password="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
            enableSsl="true"
       />

【问题讨论】:

  • 我认为更大的问题是你能修改它,在它已经配置之后。

标签: configuration logging enterprise-library


【解决方案1】:

我不确定您是否可以通过编程方式进行操作。您必须将配置数据映射到实际的实现类(和属性)。另外,如果当前正在使用配置,则必须确保程序更改会覆盖配置。

在本例中,我读取了配置,更改了一些设置,复制了配置并将其写回配置文件。这很费力,因为许多属性是只读的,因此需要创建新对象。配置的编写应该可以工作,但我还没有测试过在这样做之后实际调用企业库(我真的不建议为生产应用程序这样做)。

// 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;
List<TraceListenerData> newListeners = new List<TraceListenerData>();

foreach(TraceListenerData listener in log.TraceListeners)
{
    // set new values for TraceListeners
    if (listener is FormattedEventLogTraceListenerData)
    {
        FormattedEventLogTraceListenerData oldData = listener as FormattedEventLogTraceListenerData;
        FormattedEventLogTraceListenerData data = 
            new FormattedEventLogTraceListenerData(oldData.Name, oldData.Source + "new", oldData.Log, oldData.MachineName, oldData.Formatter, oldData.TraceOutputOptions);

        newListeners.Add(data);
    }
    else if (listener is RollingFlatFileTraceListenerData)
    {
        RollingFlatFileTraceListenerData oldData = listener as RollingFlatFileTraceListenerData;
        RollingFlatFileTraceListenerData data =
            new RollingFlatFileTraceListenerData(oldData.Name, oldData.FileName + ".new", oldData.Header, oldData.Footer, oldData.RollSizeKB, oldData.TimeStampPattern, oldData.RollFileExistsBehavior, oldData.RollInterval, oldData.TraceOutputOptions, oldData.Formatter, oldData.Filter);

        newListeners.Add(data);
    }
}

// Replace the listeners
foreach (TraceListenerData traceListener in newListeners)
{
    log.TraceListeners.Remove(traceListener.Name);
    log.TraceListeners.Add(traceListener);
}

// Copy the LogSettings since when config.Sections.Remove() is called the original log object becomes "empty". 
LoggingSettings newLog = new LoggingSettings();

newLog.DefaultCategory = log.DefaultCategory;

foreach (var formatter in log.Formatters)
{
    newLog.Formatters.Add(formatter);
}

foreach (var filter in log.LogFilters)
{
    newLog.LogFilters.Add(filter);
}

foreach (var listener in log.TraceListeners)
{
    newLog.TraceListeners.Add(listener);
}

foreach (var source in log.TraceSources)
{
    newLog.TraceSources.Add(source);
}

newLog.LogWarningWhenNoCategoriesMatch = log.LogWarningWhenNoCategoriesMatch;
newLog.RevertImpersonation = log.RevertImpersonation;
newLog.SpecialTraceSources = log.SpecialTraceSources;
newLog.TracingEnabled = log.TracingEnabled;

// replace section
config.Sections.Remove("loggingConfiguration");
config.Sections.Add("loggingConfiguration", newLog);

// save and reload config
config.Save(ConfigurationSaveMode.Modified, true);
ConfigurationManager.RefreshSection("loggingConfiguration");

如果这不是你想要的 100%,希望它能给你一些想法。

【讨论】:

  • 适用于 4.1 version ,不适用于 5.0 不编译 LoggingSettings log = config.GetSection("loggingConfiguration") as LoggingSettings;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多