Изменить LoggingConfiguration Programmatic (корпоративная библиотека) - PullRequest
0 голосов
/ 14 апреля 2010

У меня есть app.config в m win application и раздел loggingConfiguration (библиотека предприятия 4.1).

Мне нужно сделать это программно,

Получить список всех слушателей в loggingConfiguration

Изменить свойство fileName = ". \ Trazas \ Excepciones.log" нескольких RollingFlatFileTraceListener

Изменить несколько свойств прослушивателя 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"
       />

1 Ответ

2 голосов
/ 15 апреля 2010

Я не уверен, что вы можете сделать это программно. Вы должны сопоставить данные конфигурации с фактическими классами реализации (и свойствами). Кроме того, если в настоящее время используется конфигурация, вы должны убедиться, что программные изменения переопределят конфигурацию.

В этом примере я читаю конфигурацию, изменяю некоторые настройки, копирую конфигурацию и записываю ее обратно в файл конфигурации. Это становится трудоемким, потому что многие свойства доступны только для чтения, поэтому необходимо создавать новые объекты. Написание конфигурации должно работать, но я не проверял фактического вызова Enterprise Library после этого (и я действительно не рекомендовал бы делать это для производственного приложения).

// 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%, что вы хотели, надеюсь, это даст вам некоторые идеи.

...