Protokolle werden in die Datenbank geschrieben

  • Datei‑Protokolle: Man muss sich am Server anmelden, die Textdatei herunterladen oder öffnen, um Protokolle einzusehen; Suchen sind umständlich;
  • Datenbank‑Protokolle: Im Backend kann eine eigene Protokoll‑Verwaltungsseite erstellt werden, unterstützt SQL‑Filter, Suche und seitenweise Abfrage;
  1. Vereinfacht einheitlichen Betrieb, Protokoll‑Audit und Ausnahme‑Verfolgung.

Nachteil: Bei hohem Protokoll‑Aufkommen steigt die Last der Datenbank. Im Produktivbetrieb optimieren mitgepuffertem Schreiben, Tabellenaufteilung und regelmäßiger Bereinigung alter Protokolle.

1 Protokoll‑Tabelle erstellen (SQL Server)

-- Protokolltabelle 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

-- ========== Spaltenkommentare (optional, zur besseren Lesbarkeit in DB) ==========
declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty 'MS_Description',
'Log4net‑Protokolltabelle',
'user', @CurrentUser, 'table', 'Log'
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty 'MS_Description',
'Primärschlüssel des Protokolleintrags',
'user', @CurrentUser, 'table', 'Log', 'column', 'Id'
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty 'MS_Description',
'Zeitpunkt der Erstellung',
'user', @CurrentUser, 'table', 'Log', 'column', 'AddTime'
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty 'MS_Description',
'Ausführender Thread',
'user', @CurrentUser, 'table', 'Log', 'column', 'Thread'
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty 'MS_Description',
'Protokoll‑Ebene (Info/Debug/Error u.a.)',
'user', @CurrentUser, 'table', 'Log', 'column', 'Level'
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty 'MS_Description',
'Name des Loggers',
'user', @CurrentUser, 'table', 'Log', 'column', 'Logger'
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty 'MS_Description',
'Inhalt der Protokollnachricht',
'user', @CurrentUser, 'table', 'Log', 'column', 'Message'
go

declare @CurrentUser sysname
select @CurrentUser = user_name()
execute sp_addextendedproperty 'MS_Description',
'Ausnahme‑Informationen',
'user', @CurrentUser, 'table', 'Log', 'column', 'Exception'
goCode-Sprache: PHP (php)

Spaltenbeschreibung:

SpalteBeschreibung
IdAuto‑inkrement‑Primärschlüssel
AddTimeZeitpunkt des Protokolleintrags
ThreadName des Threads, der das Protokoll erzeugt hat
LevelProtokoll‑Stufe:DEBUG/INFO/WARN/ERROR/FATAL
LoggerVerwendeter Logger‑Name (vollständiger Klassenname)
MessageNormaler Protokolltext
ExceptionException‑Stacktrace, leer bei fehlendem Fehler

2 NuGet‑Paket installieren

Install-Package log4net

Kann direkt mit .NET Framework verwendet werden;kompatibel auch mit .NET Core/.NET5+/ASP.NET Core.

3 Vollständige log4net‑Konfiguration (App.config / Web.config)

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

  <log4net>
    <!-- ADONetAppender: Appender zum Schreiben in die Datenbank -->
    <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
      <!-- bufferSize=1: Sofortiges Schreiben ohne Puffer; höherer Wert schreibt stapelweise und senkt DB‑Last -->
      <bufferSize value="1" />

      <!-- SqlServer‑Verbindungstreiber Typ -->
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

      <!-- Datenbank‑Verbindungszeichenfolge, passen Sie DB‑Name, Benutzer und Passwort an -->
      <connectionString value="DATABASE=log4netdemo;SERVER=.;UID=sa;PWD=pwdpwd;Connect Timeout=15;" />

      <!-- INSERT‑SQL, Spalten und Parameter müssen exakt übereinstimmen -->
      <commandText value="INSERT INTO Log ([AddTime],[Thread],[Level],[Logger],[Message],[Exception])
VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />

      <!-- Parameter1: Protokoll‑Zeit -->
      <parameter>
        <parameterName value="@log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>

      <!-- Parameter2: Thread‑Name -->
      <parameter>
        <parameterName value="@thread" />
        <dbType value="String" />
        <size value="100" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%t" />
        </layout>
      </parameter>

      <!-- Parameter3: Protokoll‑Ebene -->
      <parameter>
        <parameterName value="@log_level" />
        <dbType value="String" />
        <size value="200" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%p" />
        </layout>
      </parameter>

      <!-- Parameter4: Logger‑Name -->
      <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="500" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%c" />
        </layout>
      </parameter>

      <!-- Parameter5: Protokoll‑Nachricht -->
      <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <size value="3000" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%m" />
        </layout>
      </parameter>

      <!-- Parameter6: Ausnahme‑Daten -->
      <parameter>
        <parameterName value="@exception" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.ExceptionLayout" />
      </parameter>
    </appender>

    <!-- Root‑Logger, aktiviert Datenbank‑Ausgabe -->
    <root>
      <level value="Info" />
      <appender-ref ref="ADONetAppender" />
      <!-- Zusätzlich Dateiprotokoll möglich: <appender-ref ref="DateiAppenderName"/> -->
    </root>
  </log4net>
</configuration>Code-Sprache: HTML, XML (xml)

Wichtiger Hinweis: Screenshot zeigt nur die ersten zwei Parameter. Alle sechs Parameter müssen vollständig angegeben werden, sonst startet die Anwendung mit Fehler!

4 log4net im Code aktivieren

1. .NET Framework Web‑Projekt(Global.asax)
protected void Application_Start(object sender, EventArgs e)
{
    // log4net‑Konfiguration laden
    log4net.Config.XmlConfigurator.Configure();
}Code-Sprache: JavaScript (javascript)
2. Konsolen‑ / WinForms‑Anwendung

In Program.cs in der ersten Zeile der Main‑Methode:

log4net.Config.XmlConfigurator.Configure();Code-Sprache: CSS (css)
3. Code‑Beispiel für den täglichen Gebrauch
// Logger‑Instanz beziehen
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

// Normales Protokoll ausgeben
log.Info("System erfolgreich gestartet");

// Ausnahme‑Protokoll schreiben
try
{
    int a = 1 / 0;
}
catch (Exception ex)
{
    log.Error("Rechenfehler aufgetreten", ex);
}Code-Sprache: PHP (php)

Protokolle werden in die Datenbank geschrieben

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert