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
.
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.
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.
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()
.
Voici ma liste de contrôle pour les cas où log4net s'avère récalcitrant:
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();**
}
}
Voici les étapes qui ont finalement permis à mon enregistrement de fichiers de fonctionner:
<appender name="MainLogger"...
<layout type="log4net.Layout.SimpleLayout"/>
<add key="log4net.Internal.Debug" value="true"/>
à votre appSettings
.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.
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
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"));
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
<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).