一 配置log4net.config文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
</configSections>
<log4net>
<!--配置日志的目标存储形式-->
<root>
<!--输出等级-->
<level value="ALL" />
<!--控制台形式-->
<appender-ref ref="ConsoleAppender" />
<!--文件形式-->
<appender-ref ref = "FileAppender" />
</root>
<!--控制台形式-->
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout" value="%date [%thread] %-5level %logger - %message%newline" />
</appender>
<!--文件形式-->
<appender name="FileAppender" type="log4net.Appender.FileAppender" >
<!--文件路径-->
<file value = "Log/log-file.txt" />
<!--是否追加-->
<appendToFile value = "true" />
<!--显示格式-->
<layout type="log4net.Layout.PatternLayout">
<param name="Header" value="
-------------------------软件启动-----------------------
" />
<param name="Footer" value="
-------------------------软件关闭-----------------------
" />
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} --%-5p-- %m%n" />
</layout>
</appender>
</log4net>
</configuration>
二 绑定log4net.config文件
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]
三 同步更新到TextBox控件进行显示日志内容
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using log4net.Appender;
using log4net.Core;
using log4net.Layout;
using System.Windows.Forms;
namespace WinForm之AOI外观检测
{
public class TextBoxBaseAppender : AppenderSkeleton
{
public TextBox TextBox { get; set; }
static TextBoxBaseAppender()
{
}
protected override void Append(LoggingEvent loggingEvent)
{
PatternLayout patternLayout = (PatternLayout)this.Layout;
string str = string.Empty;
if (patternLayout != null)
{
str = patternLayout.Format(loggingEvent);
if (loggingEvent.ExceptionObject != null)
str += loggingEvent.ExceptionObject.ToString() + Environment.NewLine;
}
else
str = loggingEvent.LoggerName + "-" + loggingEvent.RenderedMessage + Environment.NewLine;
printf(str);
}
private bool m_Flag = false;
private List<string> m_LogStrList = new List<string>();
private Object m_LockObj = new Object();
private void printf(string str)
{
lock (m_LockObj)
{
Debug.WriteLine(str);
m_LogStrList.Add(str);
}
if (m_Flag == false)
{
m_Flag = true;
Task.Run(
() =>
{
while (true)
{
Thread.Sleep(300);
if (m_LogStrList.Count == 0) continue;
List<string> tempList = new List<string>();
lock (m_LockObj)
{
for (int i = 0; i < m_LogStrList.Count; i++)
{
tempList.Add(m_LogStrList[i]);
}
m_LogStrList.Clear();
}
if (tempList.Count > 0)
{
try
{
if(TextBox.IsHandleCreated)
{
TextBox.Invoke(
new Action(() =>
{
try
{
if (TextBox.Lines.Length > 100)
{
TextBox.Clear();
}
foreach (var strTemp in tempList)
{
ListViewItem item = new ListViewItem();
item.Text = strTemp.ToString();
TextBox.AppendText(strTemp);
}
}
catch (Exception e)
{
throw e;
}
}));
}
}
catch (TaskCanceledException)
{
}
catch (Exception)
{
throw;
}
}
}
});
}
}
}
}

四 日志类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using log4net;
using log4net.Layout;
using log4net.Repository.Hierarchy;
namespace WinForm之AOI外观检测.LogModule
{
public class Log
{
private static ILog log = LogManager.GetLogger("myLog");
#region 记录日志
public static void Info(string msg)
{
log.Info(msg);
}
public static void Debug(string msg)
{
log.Debug(msg);
}
public static void Error(string msg)
{
log.Error(msg);
}
public static void Warn(string msg)
{
log.Warn(msg);
}
public static void Fatal(string msg)
{
log.Fatal(msg);
}
#endregion
#region 初始化textBox控件
public static void InitializeTextBox(TextBox textBox)
{
if (textBox == null) return;
var logPattern = "%d{yyyy-MM-dd HH:mm:ss} --%-5p-- %m%n";
var list_logAppender = new TextBoxBaseAppender();
list_logAppender.TextBox = textBox;
list_logAppender.Layout = new PatternLayout(logPattern);
Logger log4NetLogger = log.Logger as Logger;
log4NetLogger.AddAppender(list_logAppender);
}
#endregion
}
public enum LogLevel
{
Debug,
Info,
Warn,
Error,
Fatal,
}
}
五 使用日志
private void MainForm_Load(object sender, EventArgs e)
{
Log.Info("欢迎进入-AOI视觉外观缺陷检测系统");
}