2010-08-14 9 views
3

J'utilise Enterprise Library 3.1 et je veux accéder par programme au Logging Block (runtime, modèle d'objet) en particulier à ses écouteurs et sources de trace.Accès par programme à la configuration de la bibliothèque de l'entreprise (modèle objet)?

Par exemple, je souhaite accéder à la propriété Filename d'un objet écouteur de trace afin que je puisse savoir où se trouve le fichier journal sur le disque.

Mise à jour: Vous recherchez des réponses qui utilisent le modèle d'objet d'exécution, pas en analysant la configuration XML.

+0

Une question similaire a été posée sur CodePlex en 2007: http://entlib.codeplex.com/Thread/View.aspx?ThreadId = 16380 –

+0

Est-il acceptable d'utiliser le modèle d'objet de configuration EL pour déterminer les propriétés? Utilisez-vous la configuration programmatique de EL sans configuration XML? –

+0

@Tuzo: Merci de demander. J'utilise la configuration XML, et pour vous d'utiliser le modèle d'objet de configuration EL est acceptable. Pour clarifier davantage ce qui n'est pas acceptable, c'est contourner n'importe quel modèle d'objet EL, par exemple, en extrayant un ancien analyseur XML et en chargeant la configuration avec. J'espère que cela t'aides. –

Répondre

2

Vous pouvez accéder à la configuration de journalisation par programmation à l'aide du modèle objet (utilisé pour la configuration).

Pour obtenir les données spécifiques de l'écouteur de trace, vous devez consulter TraceListenerData (et les sous-classes spécifiques).

Cet exemple montre comment lire dans la configuration, puis obtenir les 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

J'aime beaucoup mieux que ma tentative d'exécution/réflexion. Merci. –

+0

Note: Fonctionne dans ** 4.1 ** _versión_, pas pour *** 5.0 *** ** Ne compile pas ** 'LoggingSettings log = config.GetSection (" loggingConfiguration ") comme LoggingSettings;' – Kiquenet

0

Apparemment quelques informations nécessaires est privé encapsulées dans une instance LogWriterStructureHolder (son champ est nommé structureHolder) sur la bibliothèque Enterprise Logger.Writer instance (de type LogWriter). Je recherche effectivement: Logger.Writer.structureHolder (mais ce champ est privé).

je réflexion pour le sortir ....

Ce sont les espaces de noms importants:

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

Ce code est la réflexion pour sortir les données privées nécessaires:

// 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. 

Si quelqu'un peut trouver un point d'entrée non-privé pour ces mêmes données, veuillez le poster dans une réponse. Merci.

Félicitations à .NET Reflector pour faciliter cette réponse.

0
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; 
} 

fichier web.config est comme suit:

web.config file

Pour application Windows, vous pouvez ouvrir le fichier .config avec System.Configuration.ConfigurationManager.OpenExeConfiguration au lieu de WebConfigurationManager.

0

Les autres réponses semblent très bavard, voici ma solution:

public static TraceListenerData GetTraceListener(string name) 
    { 
     var log = ConfigurationManager.GetSection("loggingConfiguration") as LoggingSettings; 

     return log.TraceListeners.Single(tl => tl.Name == name); 
    } 

Une fois que vous avez appelé cette méthode d'assistance, vous pouvez jeter le résultat à quel type l'auditeur est tel que RollingFlatFileTraceListenerData, EmailTraceListenerData, FormattedEventLogTraceListenerData, FormattedDatabaseTraceListenerData