log4net ne fonctionne pas

123

Hey, j'ai cette configuration dans mon web.config

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
        <param name="File" value="mylog.log" />
        <param name="AppendToFile" value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="" />
            <param name="Footer" value="" />
            <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
        </layout>
    </appender>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
        <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="[Header]\r\n" />
            <param name="Footer" value="[Footer]\r\n" />
            <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
        </layout>
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="LogFileAppender" />
        <appender-ref ref="ConsoleAppender" />
    </root>
</log4net>

mais log4net ne fonctionne pas. Mon projet se compile bien, et je n'obtiens aucune erreur de débogage non plus. Les lignes où je dis de log.debug("somemessage")s'exécuter correctement, mais je ne trouve pas le mylog.logfichier, alors où est-il?

Jakob
la source
Assurez-vous de vérifier également ceci: stackoverflow.com/a/24617269/114029
Leniel Maccaferri

Réponses:

298

Un truc pour ce type de chose est de s'assurer d'ajouter l' XmlConfiguratorattribut à l'assembly en plaçant la ligne suivante dans votre AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator]

Sinon, log4net ne s'active jamais.

Kirk Woll
la source
5
Cette méthode permet de travailler dans mon projet, mais il a cessé de fonctionner en quelque sorte. J'ai dû utiliser cette méthode stackoverflow.com/a/1479343/193634 pour le faire fonctionner à nouveau.
Rosdi Kasim
Je viens de réessayer et cela fonctionne bien. Vous n'êtes probablement pas en train de référencer / charger l'assembly qui contient le AssemblyInfodès que vous y avez pensé.
Kirk Woll
Pour ceux qui utilisent l'appender ELMAH, c'est la voie à suivre. J'avais 'log4net.Config.XmlConfigurator.Configure ();' dans global.asax.cs et cela fonctionnait bien pour l'appender de fichier mais pas pour les appenders ELMAH.
user3885927
J'ai coché cette réponse et j'ai trouvé que je devais la modifier avec `[assembly: log4net.Config.XmlConfigurator (Watch = true)]`
David Savage
49

Je suppose que soit log4net ne se connecte pas du tout, soit le fichier ne se termine pas là où vous l'attendez.

Premièrement, avez-vous réellement appelé

XmlConfigurator.Configure()

n'importe où dans votre code? Si l'extrait de code XML ci-dessus se trouve dans le fichier de configuration de l'application, cet appel fera l'affaire. Si l'extrait de code XML est dans son propre fichier, vous devrez utiliser la .Configure(string)surcharge qui prend le chemin du fichier. Sans cet appel (ou apparemment l'attribut de niveau d'assemblage mentionné par Kirk Woll), alors log4net ne sera pas du tout journalisé.

Si vous pensez que tout est fait et que log4net devrait se connecter, vous devriez peut-être mettre un chemin complet pour le fichier journal pendant que vous déboguez plus loin. Cela vous permettra d' être sûr où le fichier doit être.

Rob Levine
la source
33

Il y a un autre petit truc, voir ici: http://logging.apache.org/log4net/release/manual/configuration.html#dot-config

la [assembly: log4net.Config.XmlConfigurator]méthode ne fonctionne pas avec app.config. Si vous configurez log4net depuis app.config, vous devez utiliser la log4net.Config.XmlConfigurator.Configure()méthode.

Amir Abiri
la source
Pour mémoire, les deux méthodes ont fonctionné pour moi dans une application console.
rageit
Je confirme la solution ci-dessus - j'ai dû appeler log4net.Config.XmlConfigurator.Configure (); dans mon code (qui utilise app.config pour que log4net fonctionne efficacement. Les lignes qui sont effectivement imprimées sont celles qui suivent l'exécution de la méthode Configure ().
luisa rosi
19

Voici ma liste de contrôle pour savoir quand log4net s'avère récalcitrant:

  • assurez-vous que le fichier log4net.config est copié dans le dossier bin \ lors de la construction (défini sur «Copier si plus récent» dans le compilateur)
    • lors du traitement du code installé, assurez-vous que le log4net.config est venu pour le trajet (défini sur `` Contenu '' dans le compilateur)
  • s'assurer que l'utilisateur qui exécute le processus en tant que dispose des droits d'écriture sur le dossier dans lequel les journaux doivent être écrits
  • en cas de doute, donnez des autorisations promiscuous à c: \ temp \ et récupérez tout pour vous y connecter ()
  • lancez Sysinternal / Dbgview.exe pour voir si cela vous dit quelque chose
terrien42
la source
3
"Assurez-vous que le fichier log4net.config est copié dans le dossier bin \ lors de la construction (défini sur 'Copier si plus récent' dans le compilateur)" -> sauvez ma journée! Merci beaucoup!
Hoang Nguyen Huu
8

Pour un projet ASP.NET MVC ajoutant

log4net.Config.XmlConfigurator.Configure();

à Global.asax.cs aide également:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();

        log4net.Config.XmlConfigurator.Configure();
    }
}
Oladipo Olasemo
la source
1
J'ai eu un problème très étrange avec cela, en production et sur l'ordinateur de mon patron, les enregistreurs fonctionnaient bien comme ça, mais ce n'est que lorsque la réponse de Kirk a fonctionné sur mon ordinateur. Je pensais juste que je ferais savoir aux gens au cas où ils auraient des problèmes similaires (projet MVC btw).
Shelby115
@ Shelby115, merci beaucoup! J'essayais de mettre mes entrées log4Net dans ELMAH. J'avais tout correct dans web.config. J'avais déjà 'log4net.Config.XmlConfigurator.Configure ();' dans mon global.asax.cs mais cela ne fonctionnera pas. Je suis venu à ce poste SO et j'ai ajouté la ligne à assemblyInfo.cs basée sur Kirk. Cela n'a toujours pas fonctionné !. Après avoir lu votre commentaire, j'ai supprimé l'entrée précédente de global.asax.cs et cela a commencé à fonctionner. J'ai passé plusieurs heures là-dessus et votre commentaire a été d'une grande aide. Merci encore!
user3885927
L'entrée dans global.asax.cs fonctionnait bien pour l'appender de fichier mais pas pour les appenders ELMAH. La méthode de Kirk a fonctionné pour l'appender ELMAH (j'ai spécifiquement dû le supprimer du formulaire global.asax.cs)
user3885927
Vous pouvez également vous assurer que log4net dispose des autorisations d'écriture sur le répertoire configuré pour les fichiers journaux.
Oladipo Olasemo
@ Shelby115 Dang, je dois adorer quand vous oubliez la solution et que votre propre commentaire résout votre problème. Venir sur une page avec une réponse déjà votée par vous est également un bon indicateur.
Shelby115
7

Voici les étapes qui ont finalement fait fonctionner la journalisation de mes fichiers:

  • -Check AssemblyInfo.cs contient l'attribut suivant. [assembly: log4net.Config.XmlConfigurator] . Cela charge log4net.
  • Vérifiez que le répertoire du journal dispose des autorisations d'écriture.
  • Vérifiez que l'enregistreur a un format spécifié. Cela se fait en vérifiant que chaque élément de votre configuration a un élément de mise en page spécifié. Par exemple:

<appender name="MainLogger"... <layout type="log4net.Layout.SimpleLayout"/>

  • Enfin, essayez d'activer la journalisation interne de log4net pour activer la journalisation de la console et vérifier la console. Pour ce faire, ajoutez <add key="log4net.Internal.Debug" value="true"/>à votre appSettings.
Echilon
la source
<add key = "log4net.Internal.Debug" value = "true" /> Cela m'a aidé à résoudre le problème. Merci
Ravi Khambhati
Les autorisations du répertoire sont ce qui m'a obtenu
Omar Himada
6

J'ai eu des expériences où les systèmes de journalisation échouent silencieusement sans lever d'exceptions. Je suppose que cela a du sens car si l'enregistreur enregistre des erreurs, comment peut-il enregistrer une erreur qu'il est incapable d'effectuer la journalisation?

Donc, si le fichier n'est pas créé sur le disque, commencez par examiner les autorisations du système de fichiers pour vous assurer que l'utilisateur sous lequel votre application s'exécute peut écrire un nouveau fichier sur cet emplacement du disque.

À des fins de test, vous voudrez peut-être créer manuellement le fichier sur le disque sur lequel écrire et ouvrir des autorisations pour que tout le monde puisse y écrire. Si l'enregistreur commence à y écrire, vous savez qu'il est basé sur l'autorisation plutôt que sur la configuration.

John K
la source
2

De mon côté, j'ai oublié de marquer le fichier de configuration à copier pendant la compilation de l'application.

Copiez le fichier de configuration dans le répertoire de sortie

Faites un clic droit sur le fichier log4net.config, sélectionnez la propriété, puis choisissez Copier dans le répertoire de sortie pour être Copier XXXX

Võ Quang Hòa
la source
1

J'ai essayé tout ce qui précède mais rien n'a fonctionné. L'ajout de cette ligne dans la configSections section app.config a fonctionné pour moi.

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a" />

Assurez-vous que Versionet PublicKeyTokenest correct

Reyan Chougle
la source
0
<param name="File" value="mylog.log" />

dit "écrire mylog.log dans le dossier réel". Cela signifie que si votre application Web est sous IIS, le journal sera écrit dans C: \ inetpub \ wwwroot \ appname \ mylog.log.

Si le fichier journal n'est pas là, alors peut-être que le compte sous lequel l'application s'exécute n'a pas l'autorisation d'écriture sur le dossier. Vous pouvez exécuter Process Monitor à partir de SysInternals pour voir si et où un fichier est écrit.

Exécutez également VS en mode débogage, pour voir si des exceptions sont levées (Debug-> Exceptions-> CLR Exceptions, cochez Thrown).

Tomas Voracek
la source
0

Dans mon cas, j'ai oublié de définir les propriétés du fichier log4Net.config comme "Contenu" afin que le fichier ne soit pas inclus dans le déploiement. Alors faites attention à cela:

Compile action : Content
Marco
la source
0

Malheureusement, rien de ce qui précède n'a aidé. La configuration explicite dans la classe à enregistrer en plus des suggestions de paramètres précédentes a fait l'affaire pour moi.

string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
log4net.Config.XmlConfigurator.Configure(new FileInfo(assemblyFolder + "/log4net.config"));
Petro Slyvko
la source
-7

Aussi après quelques heures, j'ai compris pourquoi cela ne fonctionnait pas pour moi ...

j'ai eu:

public static class Program
{

    private static CommunicationManager _bcScanner = new CommunicationManager();
    private static ILog _log = LogManager.GetLogger(typeof(Program));
    private static SocketServer socketListener;

mais ça devrait être:

public static class Program
    {
        private static ILog _log = LogManager.GetLogger(typeof(Program));
        private static CommunicationManager _bcScanner = new CommunicationManager();
        private static SocketServer socketListener;

Assurez-vous donc que l'ILog est sur la première ligne ...

Jeroen Bakker
la source
1
Ce n'est certainement pas la cause. Cela n'a pas d'importance lorsque vous initialisez l'objet ILog tant que vous le faites avant d'appeler les méthodes de journalisation, c'est-à-dire _log.Info; _log.error etc.
Oladipo Olasemo