Configuring Log4Net for File and Database Logging in C#

1. Create a Windows Forms Project and Install Log4Net via NuGet

Start a new WinForms project in Visual Studio. Use the NuGet Package Manager to install log4net.

2. Create LogHelper Class and log4net Configuraton File

Add a class named LogManagerWrapper (replaces LogHelper) and an XML configuration file log4net.config. Set the config file's Copy to Output Directory property to Copy always.

3. Ipmlement the LogManagerWrapper Class

using log4net;
using System;

public class LogManagerWrapper
{
    private static readonly ILog infoLog = LogManager.GetLogger("Info");
    private static readonly ILog errorLog = LogManager.GetLogger("Error");

    public static void LogInfo(string message)
    {
        if (infoLog.IsInfoEnabled)
            infoLog.Info(message);
    }

    public static void LogError(string message, Exception ex = null)
    {
        if (errorLog.IsErrorEnabled)
        {
            if (ex != null)
                errorLog.Error(message, ex);
            else
                errorLog.Error(message);
        }
    }
}

4. Configure log4net (log4net.config)

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

    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="Logs/Error/" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <datePattern value="yyyyMMdd\".log\"" />
      <staticLogFileName value="false" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="[%date{ISO8601}] %message%newline" />
      </layout>
    </appender>

    <appender name="AdoNetAppender_SQLite" type="log4net.Appender.AdoNetAppender">
      <bufferSize value="0" />
      <connectionType value="System.Data.SQLite.SQLiteConnection, System.Data.SQLite" />
      <connectionString value="Data Source=Database\\Log4Net.db;Version=3;" />
      <commandText value="INSERT INTO Log (Date, Level, Logger, Message) VALUES (@Date, @Level, @Logger, @Message)" />
      <parameter>
        <parameterName value="@Date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>
      <parameter>
        <parameterName value="@Level" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@Logger" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@Message" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message" />
        </layout>
      </parameter>
    </appender>

    <logger name="Info">
      <level value="INFO" />
      <appender-ref ref="AdoNetAppender_SQLite" />
    </logger>

    <logger name="Error">
      <level value="ERROR" />
      <appender-ref ref="RollingFileAppender" />
    </logger>
  </log4net>
</configuration>

5. Initialize Log4Net in AssemblyInfo.cs

Add the following line to AssemblyInfo.cs (typically located under the Properties folder):

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

6. Use the Logger in a Form

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
    }

    private void btnLogError_Click(object sender, EventArgs e)
    {
        lblStatus.Text = "";
        string message = txtMessage.Text.Trim();

        // Log without exception
        LogManagerWrapper.LogError(message);

        // Log with exception
        LogManagerWrapper.LogError(message, new Exception("This is a sample exception."));

        lblStatus.Text = "Logged successfully.";
    }

    private void btnLogInfo_Click(object sender, EventArgs e)
    {
        lblStatus.Text = "";
        string message = txtMessage.Text.Trim();
        LogManagerWrapper.LogInfo(message);
        lblStatus.Text = "Logged successfully.";
    }
}

Run the application. Error message are written to rolling log files under Logs/Error/, while info messages are inserted into a SQLite database according to the AdoNetAppender_SQLite configuration.

Tags: C# Log4Net logging configuration

Posted on Sun, 09 Aug 2026 16:20:24 +0000 by hamboy