web-dev-qa-db-fra.com

Pourquoi tous mes niveaux log4net sont-ils faux?

J'utilise log4net dans mon projet ASP.NET MVC3, mais toutes les propriétés de journalisation telles que IsDebugEnabled == false

Dans mon AssemblyInfo j'ai:

[Assembly: XmlConfigurator(Watch = true)]

Dans ma classe de bûche j'ai

public Log4NetLogger()
{
    log4net.Config.XmlConfigurator.Configure();
    Logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
}

Mon matériel de configuration associé dans Web.Config est:

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.Microsoft.com/fwlink/?LinkId=152368
  -->
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false"/>
       </sectionGroup>
  </configSections>

    <log4net debug="false">
      <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
        <bufferSize value="100" />
        <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <connectionString value="{removed}" />
        <commandText value="INSERT INTO Logging ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
        <parameter>
          <parameterName value="@log_date" />
          <dbType value="DateTime" />
          <layout type="log4net.Layout.RawTimeStampLayout" />
        </parameter>
        <parameter>
          <parameterName value="@thread" />
          <dbType value="String" />
          <size value="255" />
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%thread" />
          </layout>
        </parameter>
        <parameter>
          <parameterName value="@log_level" />
          <dbType value="String" />
          <size value="50" />
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%level" />
          </layout>
        </parameter>
        <parameter>
          <parameterName value="@logger" />
          <dbType value="String" />
          <size value="255" />
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%logger" />
          </layout>
        </parameter>
        <parameter>
          <parameterName value="@message" />
          <dbType value="String" />
          <size value="4000" />
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%message" />
          </layout>
        </parameter>
        <parameter>
          <parameterName value="@exception" />
          <dbType value="String" />
          <size value="2000" />
          <layout type="log4net.Layout.ExceptionLayout" />
        </parameter>
      </appender>
      <!--Possible levels:-->
      <!--DEBUG-->
      <!--INFO-->
      <!--WARN-->
      <!--ERROR-->
      <!--FATAL-->
      <root>
        <level value="All" />
        <appender-ref ref="AdoNetAppender" />
      </root>
    </log4net>

  </applicationSettings>

</configuration>

Je suis déjà frustré au point de vouloir simplement faire

public Log4NetLogger()
{
    Logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);


    Logger.IsDebugEnabled = true;
}

Cependant, bien sûr, Logger.IsDebugEnabled ne dispose pas de paramètres: /

Que dois-je faire pour que cette fichue chose fonctionne?

29
John Smith

J'ai eu le même problème. Je le contourne en utilisant la ligne de code ci-dessous dans la méthode Application_Start dans Global.asax.cs (en supposant que ce soit une application Web .Net)

log4net.Config.XmlConfigurator.Configure();
29
Ben Cameron

Changez votre ligne pour suivre dans AssemblyInfo.cs:

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

et mettez la configuration de log4net dans ce fichier.

18
Azimuth

Log4net s'attend à ce que sa section de configuration ne soit pas groupée. Parce que dans votre configuration, vous avez placé votre section log4net dans un ApplicationSettingsGroup (applicationSettings), log4net ne trouvera pas sa configuration. Vous pouvez déplacer la section log4net en dehors du groupe ou vous pouvez spécifier le groupe lorsque vous appelez XmlConfigurator.Configure:

XmlConfigurator.Configure(
    ConfigurationManager.GetSection(
        "applicationSettings/log4net") as XmlElement);
6
nemesv

Il semble que vous ayez oublié le réglage des propriétés du fichier de configuration Copier dans le répertoire de sortie = "Copier toujours" Veuillez vérifier cette image de réglage pour plus de détails . Configuration du fichier de configuration Propriétés

4
Manoj P

Je n'ai jamais vu <level value="All" /> auparavant, généralement je règle simplement value sur l'un des niveaux (car ils incluent les niveaux au-dessus d'eux ou au-dessous, comme vous les avez répertoriés dans votre configuration, dans la pile de niveaux). Quelque chose comme ça:

<level value="DEBUG" />

Vous pouvez également essayer de le tester avec un enregistreur explicite, juste pour voir si le problème peut être autre chose. Quelque chose de simple, adjacent aux noeuds appender, ressemble à ceci:

<logger name="Log4NetTEST" >
  <level value="DEBUG" />
  <appender-ref ref="AdoNetAppender" />
</logger>

Ensuite, lors de l’essai dans votre code, vous créeriez l’enregistreur comme ceci:

LogManager.GetLogger("Log4NetTEST");
2
David

Changez votre ligne en suivant dans AssemblyInfo.cs:

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

Assurez-vous que la DLL log4net est ajoutée et mettez également la configuration de log4net dans le fichier web.config en tant que 

<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler" />
  </configSections>
  <log4net>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="RollingFileAppender" />
    </root>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="C:\LOGS\IDMUserRoleManagement\IDMUserRoleManagement.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="5" />
      <maximumFileSize value="1000KB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%d{yyyy-MM-ddTHH:mm:ss} %-5p [%t] - %m%n" />
      </layout>
    </appender>
  </log4net>
</configuration>
1
vineel

si le fichier journal de la classe (Log4NetLogger) se trouve dans une bibliothèque de classes seule, le code: [Assembly: log4net.Config.XmlConfigurator (C .... devrait figurer dans la même bibliothèque de classes.

par exemple: lib 1: my.web (un projet mvc) lib 2: my.common (un projet de bibliothèque de classes)

si vous enveloppez le code logmanager dans my.common, puis "[Assembly: log4net.Config.XmlConfigurator (C ...") DEVRAIT ÊTRE DANS MON COMMUN, si vous le mettez dans my.web, cela ne fonctionnera pas!

Modifier:

L'utilisation de tous les fichiers de configuration (app.config, web.config, log4net.config, etc.) est basée sur le contexte. Donc, si vous avez une application appelant une bibliothèque de classes, le fichier de configuration qui sera utilisé est le fichier .Config dans le projet App et non la bibliothèque de classes. 

Un autre exemple, si vous testez une application, le contexte est le projet de test d'unité et c'est le fichier de configuration qui sera utilisé, pas la configuration de l'application. 

0
ibamboo

Vous ne devriez pas avoir initialisé log4net dans votre application. Ceci peut être initialisé explicitement en plaçant ci-dessous à 'Application_Start',

log4net.Config.XmlConfigurator.Configure ();

0
Ramesh B

Vous manquez la balise d'ouverture pour applicationSettings. Cela pourrait être la cause

0
hounvs

Il n'y a pas de passeur pour IsDebugEnabled, car il est en lecture seule.

Utilisez log4net.Config.XmlConfigurator.Configure (); dans n'importe quelle méthode avant d'utiliser le journal

et dans app.Config, le réglage devrait être:

    <root>
      <level value="ALL" />
      <appender-ref ref="AppenderName" />
    </root>
0
tHiNk_OuT_oF_bOx

Dans mon cas, cela était dû au fait que <configSections> n'était pas la première balise de la section <configuration>. Cela évite que le nom de la section log4net soit reconnu. Ainsi, l'instance de journal affiche IsDebugEnabled et tous les autres comme booléens par défaut, faux. 

Cela devrait être comme ça. 

<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net" />    
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
<configuration>
0
Mahendra

J'ai eu le même problème. J'utilisais un fichier séparé et l'appelais log.config. Tout ce que j'avais à faire était de marquer la propriété de fichier "Copier dans le répertoire de sortie" sur "Copier toujours" dans l'explorateur de solutions dans Visual Studio. Cela a fait le tour pour moi.

0
Eduardo Bottcher