web-dev-qa-db-fra.com

Log4Net avec AdoNetAppender - rien ne se passe

La description

J'ai un fichier de configuration en tant que ressource dans mon assembly et je souhaite modifier la ConnectionString par programme dans mon application.

Je charge la configuration à l'aide de log4net.Config.XmlConfigurator.Configure.

J'ai quelques points d'arrêt et je constate que la configuration est chargée avec succès et que la chaîne de connexion est Data Source=localhost\SQLExpress;Initial Catalog=Log;Integrated Security=SSPI; (SQLExpress local).

Problème

Rien ne se passe, aucune exception et aucune entrée de journal. Des idées.

using (Stream stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("MyNamespace.Properties.log4net.config"))
{ 
    // stream is NOT null
    log4net.Config.XmlConfigurator.Configure(stream);
}

Hierarchy hier = LogManager.GetRepository() as Hierarchy;

if (hier != null)
{
    //get ADONetAppender
    var adoAppender = (AdoNetAppender)hier.GetAppenders().Where(appender => appender.Name.Equals("AdoNetAppender", StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault();

    if (adoAppender != null)
    {
        // update connectionstring
        adoAppender.ConnectionString = configuration.GetConnectionString(ConnectionStringNames.Log).ConnectionString;
        //refresh settings of appender
        adoAppender.ActivateOptions(); 
    }
}

ILog logger = LogManager.GetLogger("MyProject"); 
logger.Warn("Test");

contenu du fichier log4net.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>

  <log4net>
    <appender name="AdoNetAppender" type="log4net.Appender.ADONetAppender">
      <bufferSize value="1" />
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data,
  Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionString value="[we will set this automatically at runtime]" />
      <commandText value="INSERT INTO Log ([Date],[Level],[Logger],[Message],[Exception])
  VALUES (@log_date, @log_level, @logger, @message, @exception)" />
      <parameter>
        <parameterName value="@log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>
      <parameter>
        <parameterName value="@log_level" />
        <dbType value="String" />
        <size value="50" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%p" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%c" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%m" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@exception" />
        <dbType value="String" />
        <size value="2000" />
        <layout type="log4net.Layout.ExceptionLayout" />
      </parameter>
    </appender>

    <root>
      <level value="ALL" />
      <appender-ref ref="AdoNetAppender" />
    </root>
  </log4net>
</configuration>
27
dknaack

Vous pouvez déboguer log4net en vous connectant au log4net DebugAppender:

Ajoutez un paramètre d'application log4net dans votre fichier app.config:

<appSettings>
  <!-- log4net configuration when running in debug mode. -->    
  <add key="log4net.Internal.Debug" value="true" />   
</appSettings>

Ajoutez un appender de débogage dans la configuration log4net:

<appender name="DebugAppender" type="log4net.Appender.DebugAppender">
  <immediateFlush value="true" />
  <layout type="log4net.Layout.SimpleLayout" />
</appender>

Ajoutez l'appender à la racine de configuration log4net:

<root>
  <level value="ALL" />
  <appender-ref ref="AdoNetAppender" />
  <appender-ref ref="DebugAppender" />
</root>

Lorsque vous exécutez votre application, regardez dans la fenêtre de sortie de Visual Studio et vous devriez voir toute la journalisation interne pour log4net. Sinon, le fichier de configuration log4net ne se charge jamais.

Modifier

Si vous pouvez utiliser une chaîne de connexion de votre fichier app.config, supprimez la chaîne de connexion du log4net AdoNetAppender et appelez simplement la chaîne de connexion par son nom:

<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
  <bufferSize value="1" />
  <!-- note: you can use the 4.0 Assembly -->
  <connectionType value="System.Data.SqlClient.SqlConnection,
              System.Data, 
              Version=4.0.0.0, 
              Culture=neutral, 
              PublicKeyToken=b77a5c561934e089" />
  <!-- This will retrieve a connection string by name from the app.config -->
  <connectionStringName value="ConnectionStringNameFromAppConfig" />
  <!-- snip -->
</appender>
72
Metro Smurf

Voici certaines choses que j'ai essayées et qui ont fonctionné pour moi ...

  • Je ne voyais rien car mon <appender-ref ref="AdoNetAppender" /> Ne faisait pas correctement référence à mon <appender name="AdoNetAppender" ... /> Dans le Web.config . Les noms "AdoNetAppender" doivent correspondre.

  • Ajout de <bufferSize value="1" /> À la section <appender name="AdoNetAppender" /> Du Web.config

  • J'ai créé un compte d'utilisateur avec un mot de passe sur le serveur SQL au lieu d'utiliser l'authentification Windows. Accès utilisateur autorisé pour effectuer des sélections et des insertions sur la table

  • Dans Global.asax.cs j'initialise log4net en utilisant log4net.Config.XmlConfigurator.Configure();

  • Dans mon code C #, j'instancie un nouvel objet adoAppender et j'appelle logger.Info("save to db");

La documentation sur le site Web d'Apache est également utile ... http://logging.Apache.org/log4net/release/config-examples.html#MS%20SQL%20Server

J'espère que cela fera gagner du temps et de la frustration à quelqu'un. Merci!

21
Robert Bolton