2009-10-22 5 views
13

J'ai un service Windows où le fichier app.config et les fichiers log4net.config sont séparés. La journalisation ne fonctionne pas.Comment configurer log4net pour un service Windows C#

Dans mon fichier app.config, je suit dans la section:

<add key="log4net.Config" value="log4net.config"/> 

Cela fonctionne si la valeur que je spécifie un chemin absolu au fichier log4net.config.

Ai-je besoin de fournir un chemin absolu à log4net.cong? Les fichiers log4net.config et app.config se trouvent dans le même dossier que l'exécutable.

des idées?

Parag

Répondre

21

cela est peut-être utile (Moving your Log4Net configuration out of web.config with ASP.NET 2.0 web sites.).

Voici les pièces que vous pourriez être intéressé:

indiquer à l'application pour configurer log4net en utilisant ce fichier de configuration. Il ya vraiment deux endroits pour cela. Tout d'abord, global.asax et ensuite le fichier assemblyInfo.cs . Notez que le plus du moment vous commencerez avec un fichier global.asax avec tout le code inline. Pour quelque raison que ce soit, le seul moyen que je pouvais obtenir pour que cela fonctionne était casser le global.asax jusqu'à utiliser un code-behind et ensuite le fichier assemblyInfo.cs . Donc, il finit ressemblant à ceci.

global.asax: <% @ application Language = "C#" Inherits = "GlobalAsax" %> Global.asax.cs (dans votre dossier App_Code):

using System; 
using System.Web; 

public class GlobalAsax : HttpApplication 
{ 
    // you may have lots of other code here 
    void Application_Start(object sender, EventArgs e) 
    { 
     log4net.Config.XmlConfigurator.Configure(); 
    } 
} 

maintenant que vous avez votre application appelant la configuration de log4net, vous pouvez définir un attribut dans votre assembly info pour que log4net sache où chercher le fichier de configuration. AssemblyInfo.cs (dans votre App_Code dossier):

[assembly:log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

Le drapeau montre indique Log4net de garder un oeil sur le fichier de configuration pour changements potentiels. Ceci est utile si vous voulez modifier la configuration à partir de la journalisation uniquement aux erreurs au milieu de vos tests.

Pour vous assurer que le log4net.config est toujours là, ajoutez le log4net.config au csproject, et le mettre à CopyAlways. Il devrait être présenté dans le dossier de débogage.

Vous pouvez utiliser un script pour copier tout dans un dossier de mise à jour ou, si vous utilisez MS setup project, ajouter manuellement ce fichier au projet. Une référence sera ensuite ajoutée.

+1

je viens réussi à le faire avec des informations provenant http://mitch-wheat.blogspot.com/2007/04/ log4net-net-logging-tool.html mais maintenant j'ai le problème que le porject d'installation ne copiera pas à travers le fichier log4net.config quand le service est installé. Comment puis-je obtenir le fichier log4net.config dans mon projet d'installation? –

+3

Mon ami, je vous donnerais 1000 points si je le pouvais. C'est vendredi soir, je veux rentrer à la maison, et mon stupide service enregistrait s'il était exécuté en tant qu'application de console, mais pas quand il était démarré depuis le panneau Services. Et c'était l'attribut [assembly] qui manquait. Merci. –

+2

J'avais l'habitude d'employer seulement l'attribut d'assembly pour des applications de console, mais il semble que les services de fenêtres aient besoin à la fois de l'attribut de ligne et d'assembly de 'log4net.Config.XmlConfigurator.Configure(); – keremispirli

13

Pour le service Windows, le répertoire en cours est Windows \ system32 - et XmlConfigurator.Configure() utilise FileInfo qui traite les chemins relatifs par rapport au répertoire en cours. Log4net recherche donc son fichier de configuration dans Windows \ system32. D'autre part, XmlConfiguratorAttribute utilise BaseDirectory de l'application, c'est pourquoi cela fonctionne toujours.

Alternativement, vous pouvez le faire ci-dessous avant d'appeler XmlConfigurator.Configure():

System.IO.Directory.SetCurrentDirectory (AppDomain.CurrentDomain.BaseDirectory); 
+0

C'était un commentaire très utile pour moi! Merci. –

+0

Même problème ici et cette pépite d'informations sur les chemins de base était la clé. Merci. – xan

Questions connexes