Log4net n'écrit pas le journal dans le fichier journal


159

J'ai créé un scénario simple à l'aide de Log4net, mais il semble que mes ajouts de journal ne fonctionnent pas car les messages ne sont pas ajoutés au fichier journal.

J'ai ajouté ce qui suit au fichier web.config:

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false"/>        
</configSections>

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
            <file value="D:\MyData\Desktop\LogFile.txt" />
            <appendToFile value="true" />
            <encoding value="utf-8" />
            <layout type="log4net.Layout.SimpleLayout" />
    </appender>


    <root>
        <level value="INFO" />
        <appender-ref ref="LogFileAppender" />
    </root>
</log4net>

Dans le fichier ASAX global, j'ai ajouté:

ILog logger = LogManager.GetLogger(typeof(MvcApplication));

Et dans la méthode Application_Start:

logger.Info("Starting the application...");

Pourquoi le journal de test "Démarrage de l'application ..." n'est pas ajouté au fichier journal?

Réponses:


316

Appelez-vous

log4net.Config.XmlConfigurator.Configure();

quelque part pour que log4net lise votre configuration? Par exemple dans Global.asax:

void Application_Start(object sender, EventArgs e) 
{
    // Code that runs on application startup

    // Initialize log4net.
    log4net.Config.XmlConfigurator.Configure();
}

4
Merci beaucoup, j'ai eu la ligne suivante: log4net.Config.BasicConfigurator.Configure (); Dois-je appeler cela si j'utilise la configuration c # au lieu de web.config pour configurer log4net? Est-ce que cet appel "Configure" -Method est requis de quelque manière que ce soit parce que dans de nombreux tutoriels, je n'ai pas trouvé cette ligne de code.
john84 le

9
Il existe de nombreuses façons d'indiquer à log4net où rechercher la configuration, voir logging.apache.org/log4net/release/manual/configuration.html . L'appel de XmlConfigurator.Configure () obligera log4net à rechercher la configuration dans <app.exe> ​​.config ou web.config. BasicConfigurator.Configure (selon la documentation du SDK): "Initialise le système de journalisation log4net à l'aide d'un ConsoleAppender qui écrira dans Console.Out."
Andreas Paulsson

FYI - vous pouvez également utiliser log4net.Config.BasicConfigurator si vous ne voulez PAS qu'il soit basé sur un fichier. La sortie est envoyée à la console.
silverArc

1
Je fais la configuration dans le AssemblyInfofichier. Publié comme réponse ci-dessous.
LCJ

Argh, a trouvé tant de ces questions et partout ils ne mentionnent pas où trouver les fichiers journaux réels ... Est-ce si évident que tout le monde le sait déjà?
MrFox

50

Utilisez cette page FAQ: Apache log4net Foire Aux Questions

Environ 3/4 de la descente, il vous indique comment activer le débogage de log4net à l'aide du suivi d'application. Cela vous indiquera où se situe votre problème.

Les bases sont:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="log4net.Internal.Debug" value="true"/>
    </appSettings>
</configuration>

Et vous voyez la trace dans la sortie standard


1
Merci d'avoir consulté la FAQ, mais cela n'a pas pu résoudre mon problème.
john84

1
Grâce à cette réponse, j'ai pu identifier que ma rootsection faisait référence au mauvais enregistreur !!
seebiscuit

bon conseil. J'ai trouvé que l'accès a été refusé pour l'utilisateur asp.net
Blue Clouds

si cela ne fonctionne pas pour quelqu'un, alors essayez ma façon d'utiliser ceci: <log4net> <internal> <Debug value = "true"> </Debug> </internal> </log4net>
himanshupareek66

35

Comme @AndreasPaulsson l'a suggéré, nous devons le configurer. Je fais la configuration dans le AssemblyInfofichier. Je précise le configuration file nameici.

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

9
que se passe-t-il si j'ai à la fois ceci et log4net.Config.XmlConfigurator.Configure (); en charge?
n00b

1
@ n00b, alors nous pouvons commenter cette ligne, en fait seulement de cette façon cela a fonctionné pour moi "log4net.Config.XmlConfigurator.Configure ();", Et encore une chose: j'ai ajouté ceci dans mes paramètres web.config aussi <ajouter clé = "log4net.Internal.Debug" value = "true" />
himanshupareek66

33

Assurez-vous également que l' option «Copier toujours» est sélectionnée pour [log4net] .config

entrez la description de l'image ici


1
C'était la solution pour moi. J'oublie toujours ce paramètre.
Ju66ernaut

25

Assurez-vous que le processus (compte) sous lequel le site s'exécute dispose des privilèges pour écrire dans le répertoire de sortie.

Dans IIS 7 et au-dessus, cela est configuré sur le pool d'applications et correspond normalement à l' identité AppPool , qui ne sera normalement pas autorisée à écrire dans tous les répertoires.

Vérifiez vos journaux d'événements (application et sécurité) pour voir si des exceptions ont été levées.


Merci pour votre aide, j'ai également pensé aux problèmes d'autorisation, mais aussi si je définis sur le dossier les autorisations de lecture, d'écriture, de modification et d'exécution pour tout le monde, cela ne fonctionne pas.
john84

@ john84 - obtenez-vous des exceptions? Avez-vous regardé les journaux d'événements?
Oded le

Également important, comme je viens de le découvrir, avec un service Windows fonctionnant sous un compte spécifique.
Bob Mc

Merci beaucoup qui m'a beaucoup aidé.
Abbas

20

Insérer:

 [assembly: log4net.Config.XmlConfigurator(Watch = true)]

à la fin du fichier AssemblyInfo.cs


C'était mon sauvetage. Faire un projet de bureau Forms et mettre log4net.Config.XmlConfigurator.Configure (); en général n'aidait pas. Merci
Tomas Hesse

cela m'a aidé. J'avais la configuration dans web.config mais log4net ne semblait pas prendre en compte les modifications effectuées. J'ai ajouté « Montre = true » à cet attribut et anithing a commencé à travailler
Albe

3

Pour moi, j'ai déplacé l'emplacement des fichiers journaux et ce n'est que lorsque j'ai changé le nom du fichier en quelque chose d'autre qu'il a recommencé.

Il semble que s'il existe déjà un fichier journal du même nom, rien ne se passe.

Ensuite, je renomme l'ancien fichier et ai changé le nom du fichier journal dans la configuration à nouveau à ce qu'il était.


2

Dans mon cas, log4net ne se connectait pas correctement en raison d'un espace dans le nom de mon projet. Cela m'a rendu fou de savoir pourquoi le même code fonctionnait très bien dans un projet différent, mais pas dans le nouveau. Les espaces. Un espace simple.

Alors, méfiez-vous des espaces dans les noms de projet. J'ai appris ma leçon.


1
Où avez-vous eu ce problème? Log4Net fonctionne très bien dans un projet, mais pas sur un autre ... je ne sais pas pourquoi. Tks
Pascal

2

Dans mon cas, j'ai dû donner l' IIS_IUSRSautorisation de lecture / écriture au fichier journal.


1

Assurez-vous que le code de ligne suivant doit être présent dans le fichier AssemblyInfo.cs.

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

et vérifiez également cette ligne dans la méthode Application_start ().

log4net.Config.XmlConfigurator.Configure();

0

Votre fichier de configuration semble correct. Ensuite, vous devez enregistrer votre fichier de configuration Log4net dans l'application. Vous pouvez donc utiliser le code ci-dessous:

var logRepo = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepo, new FileInfo("log4net.config"));

Après le processus d'enregistrement, vous pouvez appeler la définition ci-dessous pour appeler l'enregistreur:

private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

log.Error("Sample log");

0

Pour moi, j'ai dû déplacer Logger vers un package Nuget. Le code ci-dessous doit être ajouté dans le projet de package NuGet.

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

Voir https://gurunadhduvvuru.wordpress.com/2020/04/30/log4net-issues-when-moved-it-to-a-nuget-package/ pour plus de détails.


Essayez d'éviter les liens comme réponses. Ils peuvent ne pas toujours fonctionner. Modifiez peut-être votre réponse pour inclure un résumé des informations dans le lien.
Derek C.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.