2010-05-12 6 views
0

Je veux définir une poignée d'appenders (ADO.NET) dans ma bibliothèque, mais permettre aux utilisateurs de ma bibliothèque de configurer l'utilisation de ces appenders. Quelque chose comme cela semble être ce que je veux:Les appendeurs log4net peuvent-ils être définis dans leurs propres fichiers XML?

XmlConfigurator.Configure(appenderStream1); 
XmlConfigurator.Configure(appenderStream2); 
XmlConfigurator.Configure(); 

Mais cela ne semble pas fonctionner, malgré la sortie de débogage contenant des messages comme celui-ci:

mode de mise à jour de configuration [Merge].

Quelle est la bonne façon de procéder? Ou, y a-t-il une alternative à demander aux utilisateurs de dupliquer de gros morceaux de configuration XML?

Solution:
Merci à la suggestion de Stephan, j'ai pu mettre en œuvre la méthode d'initialisation du journal suivant. Il lit d'abord la section .config dans un XmlDocument puis ajoute des appenders externes (qui sont dans mon cas des ressources incorporées) au document, pour finalement envoyer le tout à log4net.

static readonly string[] AppenderConfigs = 
{ 
    "Logging.EntryPointAppender.xml", 
    "Logging.TracingAppender.xml", 
    "Logging.MessagesAppender.xml", 
}; 

public static void Initialize() 
{ 
    // this first bit reads the log4net config in the application's config file 
    var section = (XmlElement)ConfigurationManager.GetSection("log4net"); 
    if (section == null) 
     return; 
    XmlDocument xml = new XmlDocument(); 
    using (var xml_reader = new XmlNodeReader(section)) 
     xml.Load(xml_reader); 

    // then we augment the above XML with the content of our embedded resources 
    foreach (var appender_config in AppenderConfigs) 
     using (var stream = EmbeddedResource.Open("My.Assembly", appender_config)) 
      AddToConfig(xml, stream); 
    XmlConfigurator.Configure(xml.DocumentElement); 
} 

static void AddToConfig(XmlDocument config, Stream xmlStream) 
{ 
    var fragment = config.CreateDocumentFragment(); 
    using (var reader = new StreamReader(xmlStream)) 
     fragment.InnerXml = reader.ReadToEnd(); 
    config.LastChild.AppendChild(fragment); 
} 
+0

Vous devriez faire de votre solution une réponse à la question. –

Répondre

1

je faire ce qui suit:

  • lire tous les fragments xml
  • les combiner vous (avec LINQ ou autre) à une configuration log4net valide "fichier" (en mémoire bien sûr)
  • alimentez cela à log4net
+0

Bah, j'ai oublié de revenir à cette question après la mise en œuvre de votre suggestion! J'ai modifié le code résultant pour apparaître dans mon OP. Je vous remercie! – ladenedge

+0

vous êtes les bienvenus :-) –