2010-04-13 9 views
2

Disons que j'ai 3 appenders smtp dans un même fichier log4net dont les noms sont:nom dynamique de l'appendeur log4net?

<appender name = "emailDevelopment".. /> 
<appender name = "emailBeta".. /> 
<appender name = "emailProduction".. /> 

Disons que j'ai 3 serveurs différents (Dev, Beta, production). Selon le serveur, je veux déclencher le journal. Dans le cas du serveur de développement, il déclencherait le journal de "emailDevelopment". J'ai une variable système dans chaque serveur nommé "ApplicationEnvironment" dont la valeur est Development, Beta, Production basée sur les noms de serveurs. Maintenant, de toute façon, je peux configurer root dans log4net afin qu'il déclenche l'email en fonction du nom du serveur.

<root> 
     <priority value="ALL" />   
     <appender-ref ref="email<environment name from whose appender should be used>" />  
</root> 

Répondre

1

Même après avoir écrit la seule XSD file for log4net configuration Je ne suis toujours pas au courant d'un moyen facile d'y parvenir.

Vous pourriez être en mesure de faire quelque chose comme:

log4net.GlobalContext.Properties["host"] = new ClassThatToStringsHost(); 

class ClassThatToStringsHost 
{ public override string ToString() { return "whatever"; } } 

vous pouvez référencer cette valeur du format journal avec: « % propriété {host} »

Pour effectuer le filtrage, vous aurez besoin d'utiliser une configuration de filtre dans l'adaptateur (s):

<appender name="file" type="log4net.Appender.RollingFileAppender"> 
    <filter type="log4net.Filter.PropertyFilter"> 
    <Key value="host" /> 
    <StringToMatch value="whatever" /> 
    </filter> 

    <!-- Anything not accepted by the above should be excluded --> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
</appender> 

Il peut même être un intégré bien vous pourriez tirer parti et cela devrait fonctionner. Voir aussi ce post: http://geekswithblogs.net/rgupta/archive/2009/03/03/dynamic-log-filenames-with-log4net.aspx

Pour moi, moi, et moi ... je voudrais aborder l'autre façon tous ensemble. Je dériverais mon propre appender SMTP de la valeur par défaut et dans la méthode ActivateOptions() je configurerais les valeurs en fonction de l'environnement. Cela vous permet d'utiliser un seul applicateur SMTP avec des règles cohérentes et de fournir trois propriétés publiques pour chacune des adresses e-mail que vous souhaitez envoyer. Ce n'est pas difficile, essayez-le!

4

Cela ne répond pas directement à votre question, mais une autre approche consiste simplement à avoir plusieurs fichiers de configuration log4net et à appeler le XmlConfigurator.Configure() à droite. Par exemple, vous pouvez avoir Logging.Development.Config, Logging.Beta.Config et ainsi de suite.

Quelque part dans le code, vous déterminez «l'environnement» et configurez en utilisant le fichier que vous voulez.

Je suis même allé jusqu'à avoir plusieurs fichiers de configuration et en tirer différentes parties dans un seul fichier XML représentant la configuration "vrai", puis en appelant la méthode Configure() sur cela. Par exemple, Logging.Appenders.Config qui a tous les appenders, et les prend tous et les combine avec l'un de vos fichiers de configuration spécifiques à l'environnement ci-dessus; ceux qui sont spécifiques à l'environnement font simplement référence à ce dont ils ont besoin, et les autres sont effectivement inactifs/non référencés pour cet environnement.