web-dev-qa-db-fra.com

log4net ne fonctionne pas

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 compile bien et je n’obtiens aucune erreur de débogage. Les lignes où je dis à log.debug("somemessage") sont correctement exécutées, mais je ne trouve pas le fichier mylog.log.

112
Jakob

Un des pièges pour ce genre de chose est de s’assurer d’ajouter l’attribut XmlConfigurator à l’assembly en plaçant la ligne suivante dans votre AssemblyInfo.cs:

[Assembly: log4net.Config.XmlConfigurator]

Sinon, log4net ne s'active jamais.

278
Kirk Woll

Je suppose que soit log4net ne se connecte pas du tout, soit que le fichier ne se termine pas comme prévu.

Tout d'abord, avez-vous 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 se trouve dans son propre fichier, vous devez utiliser la surcharge .Configure(string) qui prend le chemin d'accès au fichier. Sans cet appel (ou apparemment l'attribut de niveau d'assemblage mentionné par Kirk Woll), log4net ne se connectera pas du tout.

Si vous pensez que tout est fait et que log4net doit consigner, vous devriez peut-être indiquer un chemin complet pour le fichier journal pendant le débogage. Cela vous permettra de savoir exactement où se trouve le fichier devrait être.

48
Rob Levine

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

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

30
Amir Abiri

Voici ma liste de contrôle pour les cas où 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)
    • lorsqu’il s’agit de code installé, assurez-vous que le fichier log4net.config a bien été utilisé (défini sur 'Contenu' dans le compilateur)
  • s'assurer que l'utilisateur sur lequel le processus s'exécute a les droits d'écriture sur le dossier dans lequel les journaux doivent être écrits
  • en cas de doute, donnez à c:\temp\la permission de se promener et obtenez tout ce qu'il faut pour vous y connecter ()
  • lancez Sysinternal/Dbgview.exe pour voir si cela vous dit quelque chose.
16
earthling42

Pour un projet ASPNET MVC, ajouter 

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();**
    }
}
7
Oladipo Olasemo

Voici les étapes qui ont finalement permis à mon enregistrement de fichiers de fonctionner:

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

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

  • Enfin, essayez d'activer la journalisation interne log4net pour activer la journalisation et la vérification de la console. Pour ce faire, ajoutez <add key="log4net.Internal.Debug" value="true"/> à votre appSettings.
6
Echilon

J'ai eu des expériences où les systèmes de journalisation échouent en silence sans générer d'exceptions. Je suppose que cela a du sens, car si le consignateur enregistre les erreurs, comment peut-il enregistrer une erreur s’il ne parvient pas à enregistrer?

Ainsi, si le fichier n'est pas créé sur le disque, commencez par en examinant 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 de disque.

À des fins de test, vous pouvez créer manuellement le fichier sur le disque sur lequel vous devez écrire et ouvrir des autorisations à tous les utilisateurs. Si l'enregistreur commence à écrire, vous savez qu'il est basé sur des autorisations plutôt que sur de la configuration. 

5
John K

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

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

Assurez-vous que Version et PublicKeyToken est correct

1
Reyan Chougle

Malheureusement, rien de ce qui précède n'a aidé. La configuration explicite dans la classe à consigner 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"));
0
Petro Slyvko

Dans mon cas, j'oublie de définir les propriétés du fichier log4Net.config sur "Contenu" pour que le fichier ne soit pas inclus dans la commande deploy . Faites donc attention à cela:

Compile action : Content
0
Marco
<param name="File" value="mylog.log" />

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

Si le fichier journal n'est pas là, alors le compte sous lequel l'application est en cours d'exécution n'a peut-être 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).

0
Tomas Voracek