Les logs sont enregistrés dans la base de données

  • Journaux fichier : il faut se connecter au serveur, télécharger ou ouvrir le fichier texte pour consulter les logs, la recherche est compliquée ;
  • Journaux base de données : vous pouvez créer une page de gestion des logs dans l’administration, avec recherche par condition SQL, filtres et pagination ;
  1. Facilite l’exploitation unifiée, l’audit des journaux et le suivi des exceptions.

Inconvénient : dans les scénarios à forte volumétrie de logs, la charge sur la base de données augmente. En production, optimisez avecl’écriture tamponnée, le partitionnement des tables et le nettoyage périodique des anciens logs.

1 Créer la table de logs (SQL Server)

-- Table de journalisation Log
create table Log (
    Id bigint identity,
    AddTime datetime not null,
    Thread nvarchar(100) not null,
    Level nvarchar(200) not null,
    Logger nvarchar(500) not null,
    Message nvarchar(3000) not null,
    Exception nvarchar(4000) null,
    constraint PK_LOG primary key (Id)
)
go

-- ========== Commentaires des colonnes (optionnel, pour la lecture en base) ==========
declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty 'MS_Description',
'Table de logs log4net',
'user', @CurrentUser, 'table', 'Log'
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty 'MS_Description',
'Clé primaire du log',
'user', @CurrentUser, 'table', 'Log', 'column', 'Id'
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty 'MS_Description',
'Date d’enregistrement',
'user', @CurrentUser, 'table', 'Log', 'column', 'AddTime'
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty 'MS_Description',
'Thread d’exécution',
'user', @CurrentUser, 'table', 'Log', 'column', 'Thread'
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty 'MS_Description',
'Niveau de log (Info/Debug/Error etc.)',
'user', @CurrentUser, 'table', 'Log', 'column', 'Level'
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty 'MS_Description',
'Nom de l’enregistreur de logs',
'user', @CurrentUser, 'table', 'Log', 'column', 'Logger'
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty 'MS_Description',
'Contenu du message de log',
'user', @CurrentUser, 'table', 'Log', 'column', 'Message'
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty 'MS_Description',
'Informations sur l’exception',
'user', @CurrentUser, 'table', 'Log', 'column', 'Exception'
goLangage du code : PHP (php)

Description des colonnes :

ColonneDescription
IdClé primaire auto‑incrémentée
AddTimeDate de survenue du log
ThreadNom du thread ayant généré le log
LevelNiveau de log : DEBUG/INFO/WARN/ERROR/FATAL
LoggerNom du Logger utilisé (nom complet de la classe)
MessageTexte classique du journal
ExceptionPile d’appel de l’exception, vide s’il n’y a pas d’erreur

2 Installer le paquet NuGet

Install-Package log4net

Fonctionne directement avec .NET Framework ; également compatible .NET Core/.NET5+/ASP.NET Core.

3 Configuration complète log4net (App.config / Web.config)

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

  <log4net>
    <!-- ADONetAppender : appender pour écriture en base de données -->
    <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
      <!-- bufferSize=1 : écriture immédiate sans tampon ; augmenter pour écrire par lots et réduire la charge DB -->
      <bufferSize value="1" />

      <!-- Type de pilote de connexion SqlServer -->
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

      <!-- Chaîne de connexion base de données, adaptez nom‑base, identifiant et mot de passe -->
      <connectionString value="DATABASE=log4netdemo;SERVER=.;UID=sa;PWD=pwdpwd;Connect Timeout=15;" />

      <!-- Requête INSERT, colonnes et paramètres doivent correspondre strictement -->
      <commandText value="INSERT INTO Log ([AddTime],[Thread],[Level],[Logger],[Message],[Exception])
VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />

      <!-- Paramètre1 : date du log -->
      <parameter>
        <parameterName value="@log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>

      <!-- Paramètre2 : nom du thread -->
      <parameter>
        <parameterName value="@thread" />
        <dbType value="String" />
        <size value="100" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%t" />
        </layout>
      </parameter>

      <!-- Paramètre3 : niveau de log -->
      <parameter>
        <parameterName value="@log_level" />
        <dbType value="String" />
        <size value="200" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%p" />
        </layout>
      </parameter>

      <!-- Paramètre4 : nom du Logger -->
      <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="500" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%c" />
        </layout>
      </parameter>

      <!-- Paramètre5 : message du log -->
      <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <size value="3000" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%m" />
        </layout>
      </parameter>

      <!-- Paramètre6 : informations d’exception -->
      <parameter>
        <parameterName value="@exception" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.ExceptionLayout" />
      </parameter>
    </appender>

    <!-- Enregistreur racine, active la sortie base de données -->
    <root>
      <level value="Info" />
      <appender-ref ref="ADONetAppender" />
      <!-- Pour ajouter aussi une sortie fichier : <appender-ref ref="nom_appender_fichier"/> -->
    </root>
  </log4net>
</configuration>Langage du code : HTML, XML (xml)

Complément important : la capture d’écran ne montre que les deux premiers paramètres. Tous les six paramètres doivent être renseignés sinon l’application échoue au démarrage !

4 Activer log4net dans le code

1. Projet web .NET Framework(Global.asax)
protected void Application_Start(object sender, EventArgs e)
{
    // Charger la configuration log4net
    log4net.Config.XmlConfigurator.Configure();
}Langage du code : JavaScript (javascript)
2. Console / WinForms

Au tout début de la méthode Main dans Program.cs :

log4net.Config.XmlConfigurator.Configure();Langage du code : CSS (css)
3. Exemple d’utilisation dans le code
// Récupérer l’instance de journalisation
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

// Écrire un log classique
log.Info("Démarrage système réussi");

// Écrire un log d’exception
try
{
    int a = 1 / 0;
}
catch (Exception ex)
{
    log.Error("Erreur de calcul survenue", ex);
}Langage du code : PHP (php)

Les logs sont enregistrés dans la base de données

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *