Программный доступ к конфигурации ведения журнала Enterprise Library (объектная модель)? - PullRequest
3 голосов
/ 15 августа 2010

Я использую Enterprise Library 3.1 и хочу программно получить доступ к Блоку ведения журнала (среде выполнения, объектной модели), в частности к его прослушивателям трассировки и источникам.

Например, я хочу получить доступ к свойству Filename объекта прослушивателя трассировки, чтобы я мог знать, где находится файл журнала на диске.

Обновление: Поиск ответов, использующих объектную модель времени выполнения, а не путем анализа конфигурации XML.

Ответы [ 4 ]

2 голосов
/ 16 августа 2010

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

Чтобы получить конкретные данные для прослушивателя трассировки, вы должны посмотреть 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 
    {
    }
}
0 голосов
/ 08 февраля 2017

Другие ответы кажутся очень многословными, вот мое решение:

    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

0 голосов
/ 08 августа 2013
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 выглядит следующим образом:

web.config file

Для приложений Windows вы можете открыть файл .config с помощью System.Configuration.ConfigurationManager.OpenExeConfiguration вместо WebConfigurationManager.

0 голосов
/ 15 августа 2010

Очевидно, что некоторая необходимая информация конфиденциально инкапсулирована в экземпляре LogWriterStructureHolder (его поле называется StructureHolder ) в экземпляре Enterprise Library Logger.Writer (типа LogWriter). .
Поэтому я действительно ищу: 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 за помощь в ответе.

...