Программный доступ к конфигурации ведения журнала библиотеки предприятия (объектная модель)?
Я использую корпоративную библиотеку 3.1 и хочу программно получить доступ к блоку ведения журнала (среда выполнения, объектная модель), а именно к его Прослушивателям трассировки и источникам.
Например, я хочу получить доступ к свойству Filename
объекта прослушивателя трассировки, чтобы узнать, где находится файл журнала на диске.
Update: поиск ответов, использующих объектную модель среды выполнения, а не путем синтаксического анализа конфигурации XML.
4 ответа:
Вы можете получить доступ к конфигурации ведения журнала программно, используя объектную модель (используемую для настройки).
Чтобы получить конкретные данные для прослушивателя трассировки, вы должны посмотреть на 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 { } }
По-видимому, некоторая необходимая информация приватно инкапсулируется в экземпляр
Я использовал отражение, чтобы вытащить его....LogWriterStructureHolder
(его поле называется structureHolder) в регистраторе корпоративной библиотеки .Экземпляр 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.
Если кто-нибудь может Найдите не закрытую точку входа для этих же данных, пожалуйста, разместите ее в ответе. Спасибо.
Спасибо .Чистый отражатель для облегчения этого ответа.
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; }
Паутина.конфигурационный файл выглядит следующим образом:
Для приложения Windows, вы можете открыть .конфигурационный файл с
System.Configuration.ConfigurationManager.OpenExeConfiguration
вместо WebConfigurationManager.
Другие ответы кажутся очень многословными, вот мое решение:
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