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);
}
Vous devriez faire de votre solution une réponse à la question. –