Log4Net是一个常用的记录日志框架。本文示例C#使用Log4Net记录日志
Log4Net.config文件配置示例:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net-net-1.0"/>
</configSections>
<log4net>
<root>
<!--<level value="ALL"/>
<appender-ref ref="LogFileAppender"/>-->
</root>
<logger name="commonlog" additivity="true">
<!--通用写日志-->
<appender-ref ref="LogFileAppender"/>
<!--<level value="INFO" />
<level value="DEBUG"/>-->
</logger>
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
<param name="File" value="D:\commonlog\"/>
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value="yyyy-MM-dd/yyyyMMdd.'txt'" />
<!--必须加上'txt',保持其原意-->
<param name="AppendToFile" value="true"/>
<param name="RollingStyle" value="Date" />
<param name="MaximumFileSize" value="1000KB"/>
<param name="MaxSizeRollBackups" value="500" />
<param name="lockingModel" type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%n%d: %m"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="DEBUG"/>
<param name="LevelMax" value="ERROR"/>
</filter>
</appender>
<logger name="customLog" additivity="true">
<!--自定义写日志-->
<appender-ref ref="customLog"/>
<!--<level value="INFO" />
<level value="DEBUG"/>-->
</logger>
<appender name="customLog" type="log4net.Appender.RollingFileAppender" >
<param name="File" value="D:\log\customLog\"/>
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value="yyyy-MM-dd/yyyyMMdd.'txt'" />
<!--必须加上'txt',保持其原意-->
<param name="AppendToFile" value="true"/>
<param name="RollingStyle" value="Date" />
<param name="MaximumFileSize" value="1000KB"/>
<param name="MaxSizeRollBackups" value="500" />
<param name="lockingModel" type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%n%d: %m"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="DEBUG"/>
<param name="LevelMax" value="ERROR"/>
</filter>
</appender>
</log4net>
</configuration>
新建窗体应用程序Log4NetDemo。添加对log4net.dll类库的引用。
窗体设计如下:
新建类LogHelper,源程序如下:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using log4net.Appender;
using log4net.Config;
using log4net.Layout;
namespace Log4NetDemo
{
/// <summary>
/// 日志基本类
/// </summary>
public class LogHelper
{
/// <summary>
/// 加载配置日志文件
/// </summary>
public static void LoadLogConfig()
{
//启动Log4Net日志
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"));
}
public log4net.ILog loginfo = null;
public LogHelper(string fileAppenderName)
{
loginfo = log4net.LogManager.GetLogger(fileAppenderName);
m_fileAppenderName = fileAppenderName;
}
string m_fileAppenderName;
/// <summary>
/// 写日志【一般信息:Info】
/// </summary>
/// <param name="info"></param>
/// <param name="fileFullName"></param>
public void WriteLogInfo(string info, string fileFullName = "")
{
loginfo.Info(info);
}
/// <summary>
/// 写日志【调试信息:Debug】
/// </summary>
/// <param name="info"></param>
public void WriteLogDebug(string info)
{
loginfo.Debug(info);
}
/*private void ConfigLog(string fileFullName)
{
if (File.Exists(fileFullName))
{
//return;
;
}//当天已经生成过
FileAppender fileAppender = new FileAppender();
fileAppender.File = fileFullName;
fileAppender.Name = m_fileAppenderName;
fileAppender.AppendToFile = true;
PatternLayout patternLayout = new PatternLayout();
patternLayout.ConversionPattern = "%d %message%newline";
patternLayout.ActivateOptions();
fileAppender.Layout = patternLayout;
fileAppender.Encoding = Encoding.UTF8;
fileAppender.ActivateOptions();
BasicConfigurator.Configure(fileAppender);
}*/
}
}
新建类LogUtil,源代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using log4net;
using System.Reflection;
namespace Log4NetDemo
{
public class LogUtil
{
/// <summary>
/// 写通用日志
/// </summary>
static LogHelper logHelper = new LogHelper("commonlog");
/// <summary>
/// 写日志【调试信息:Debug】
/// </summary>
/// <param name="_message"></param>
/// <returns></returns>
public static bool WriteDebug(string _message)
{
try
{
logHelper.WriteLogDebug(_message);
return true;
}
catch (Exception ex)
{
Console.WriteLine($"Debug:{ex.Message}");
return false;
}
}
/// <summary>
/// 写日志【一般信息:Info】
/// </summary>
/// <param name="_message"></param>
/// <returns></returns>
public static bool WriteInfo(string _message)
{
try
{
Type type = MethodBase.GetCurrentMethod().DeclaringType;
ILog m_log = LogManager.GetLogger(type);
m_log.Info(_message);
return true;
}
catch (Exception ex)
{
Console.WriteLine($"Info:{ex.Message}");
return false;
}
}
/// <summary>
/// 写日志【警告:Warn】
/// </summary>
/// <param name="_message"></param>
/// <returns></returns>
public static bool WriteWarn(string _message)
{
try
{
Type type = MethodBase.GetCurrentMethod().DeclaringType;
ILog m_log = LogManager.GetLogger(type);
m_log.Warn(_message);
return true;
}
catch (Exception ex)
{
Console.WriteLine($"Warn:{ex.Message}");
return false;
}
}
/// <summary>
/// 写日志【一般错误:Error】
/// </summary>
/// <param name="_message"></param>
/// <returns></returns>
public static bool WriteError(string _message)
{
try
{
Type type = MethodBase.GetCurrentMethod().DeclaringType;
ILog m_log = LogManager.GetLogger(type);
m_log.Error(_message);
return true;
}
catch (Exception ex)
{
Console.WriteLine($"Error:{ex.Message}");
return false;
}
}
/// <summary>
/// 写日志【致命错误:Fatal】
/// </summary>
/// <param name="_message"></param>
/// <returns></returns>
public static bool WriteFatal(string _message)
{
try
{
Type type = MethodBase.GetCurrentMethod().DeclaringType;
ILog m_log = LogManager.GetLogger(type);
m_log.Fatal(_message);
return true;
}
catch (Exception ex)
{
Console.WriteLine($"Fatal:{ex.Message}");
return false;
}
}
}
}
新建事件日志调用类RecordLogUtil,源程序如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Log4NetDemo
{
/// <summary>
/// 通用日志 与 自定义日志
/// </summary>
public class RecordLogUtil
{
/// <summary>
/// 【通用日志】显示日志到界面上事件
/// </summary>
public static event Action<string> CommonEvent;
/// <summary>
/// 【通用日志】信息显示及写日志
/// </summary>
/// <param name="message">信息</param>
/// <param name="toDisplay">是否显示</param>
/// <param name="toWriteLog">是否写入</param>
public static void LogToShow(string message, bool toDisplay, bool toWriteLog = true)
{
if (CommonEvent != null && toDisplay)
{
CommonEvent(message + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}
if (toWriteLog)
{
//AppenderName为commonLog
LogUtil.WriteDebug(message);
}
}
#region 自定义日志信息--可根据log4Net配置文件配置节点
public LogHelper logHelper = null;
/// <summary>
/// 自定义写日志:构造函数传入 log4net.Config 配置文件所使用的appender name
/// </summary>
/// <param name="fileAppenderName"></param>
public RecordLogUtil(string fileAppenderName)
{
logHelper = new LogHelper(fileAppenderName);
}
/// <summary>
/// 自定义写日志
/// </summary>
public event Action<string> CustomEvent;
/// <summary>
/// 异常信息显示及写日志
/// </summary>
/// <param name="message"></param>
/// <param name="toDisplay"></param>
public void ShowAndRecordLog(string message, bool toDisplay, bool toWriteLog = true)
{
if (CustomEvent != null && toDisplay)
{
CustomEvent(message + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}
if (toWriteLog)
{
logHelper.WriteLogInfo(message);
}
}
#endregion
}
}
窗体FormLog4Net相关事件测试程序如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Log4NetDemo
{
public partial class FormLog4Net : Form
{
/// <summary>
/// 自定义日志
/// </summary>
RecordLogUtil customMsg = new RecordLogUtil("customLog");
public FormLog4Net()
{
InitializeComponent();
//加载日志xml配置文件:Log4Net.config
LogHelper.LoadLogConfig();
}
private void FormLog4Net_Load(object sender, EventArgs e)
{
RecordLogUtil.CommonEvent += MySystemMsg_LogEvent;
customMsg.CustomEvent += CustomMsg_CustomEvent;
//for (int i = 0; i < 24; i++)
//{
// richTextBox1.AppendText((i * 102) + "\n");
//}
}
private void CustomMsg_CustomEvent(string message)
{
MySystemMsg_LogEvent(message);
}
private void MySystemMsg_LogEvent(string message)
{
if (rtxtDisplay.TextLength >= 10240)
{
rtxtDisplay.Clear();
}
rtxtDisplay.AppendText(message + "\n");
rtxtDisplay.ScrollToCaret();
}
private void btnCommonLogTest_Click(object sender, EventArgs e)
{
RecordLogUtil.LogToShow("【测试通用日志】Hello:" + new Random().Next(100, 1000), true);
}
private void btnCustomLogTest_Click(object sender, EventArgs e)
{
customMsg.ShowAndRecordLog("【测试自定义日志】World:" + new Random().Next(1000, 10000), true);
}
}
}
程序运行如图:
将在D:\commonlog和D:\log\customLog生成日志文件