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.