https://www.cnblogs.com/yaopengfei/p/9428206.html
一、Log4Net简介
Log4net是从Java中的Log4j迁移过来的一个.Net版的开源日志框架,它的功能很强大,可以将日志分为不同的等级,以不同的格式输出到不同的存储介质中,比如:数据库、txt文件、内存缓冲区、邮件、控制台、ANSI终端、远程接收端等等,我们这里主要介绍最常用的两种:txt文件和数据库。
日志级别
Log4net将日志分为六个级别,
- Trace: 最详细的日志信息。
- Debug: 调试信息,通常用于开发和调试阶段。
- Info: 一般信息,表示应用程序的正常操作状态。
- Warn: 警告信息,指示可能的问题或异常情况。
- Error: 错误信息,表示出现了异常或错误情况。
- Fatal: 致命错误,表示程序可能无法继续运行
二、安装Log4Net
安装
配置
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<!-- 1. 添加log4net的节点声明配置代码-->
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<!--2. log4net的核心配置代码-->
<log4net>
<!--把日志信息输出到以日期命名的文件里-->
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<!--文件夹的位置-->
<file value="D:\MyLog1\" />
<appendToFile value="true" />
<!--动态生成文件名-->
<param name="StaticLogFileName" value="false" />
<!--以日期命名-->
<param name="DatePattern" value="yyyyMMdd".log"" />
<rollingStyle value="Date" />
<!--日志在日志文件中的布局方式-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n出错类:%logger property: [%property{NDC}] - %n错误描述:%message%newline %n" />
</layout>
<!--使用最小锁定模型(minimal locking model),以允许多个进程可以写入同一个文件 -->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
</appender>
<root>
<level value="ALL"></level>
<appender-ref ref="RollingFileAppender"></appender-ref>
</root>
</log4net>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.0.15.0" newVersion="2.0.15.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
添加配置
// log4net初始化配置文件 作用域全局 //代码:
//Log4net配置
[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "config", Watch = true)]
测试:
static void Main()
{
log4net.ILog _log = log4net.LogManager.GetLogger("Main");
_log.Info("正常信息 ");
_log.Error("错误");
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
三、项目配置文件
步骤:
1、添加log4net.config
注意点:
2、编写 log4net.config文件
3、编写AssemblyInfo.cs 文本
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]
测试;
private void button1_Click(object sender, EventArgs e)
{
log4net.ILog log = log4net.LogManager.GetLogger("AppLogger1");
log.Info("button test");
}
配置2:
不需要再AssemblyInfo.cs 文件,需要直接调用方法
// strlog4Config 这里传入的是log4net.config 的配置文件
public static void InitLogNet(string strlog4Config)
{
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(strlog4Config));
_Logfile = strlog4Config;
_Log["info_logo"] = log4net.LogManager.GetLogger("info_logo");
_Log["error_logo"] = log4net.LogManager.GetLogger("error_logo");
}
调用:
Log4NetHelper.InitLog4Net(Application.StartupPath + "\\log4net.config");
code2 :
public class Log4NetHelper
{
private static string _Logfile;
private static Dictionary<string, log4net.ILog> _Log = new Dictionary<string, log4net.ILog>();
public static void InitLogNet(string strlog4Config)
{
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(strlog4Config));
_Logfile = strlog4Config;
_Log["info_logo"] = log4net.LogManager.GetLogger("info_logo");
_Log["error_logo"] = log4net.LogManager.GetLogger("error_logo");
}
/// <summary>
/// 写入日志
/// </summary>
public static void WriteInfoLog(string strInfoLog)
{
if (_Log["info_logo"].IsInfoEnabled)
{
_Log["info_logo"].Info(strInfoLog);
}
}
/// <summary>
/// 功能描述:写入错误日志
/// </summary>
/// <param name="strErrLog">strErrLog</param>
/// <param name="ex">ex</param>
public static void WriteErrorLog(string strErrLog, Exception ex = null)
{
if (_Log["error_logo"].IsErrorEnabled)
{
_Log["error_logo"].Error(strErrLog, ex);
}
}
/// <summary>
/// 功能描述:写入日志
/// </summary>
/// <param name="strType">日志类型(对应log4net配置文件中logger.nama)</param>
/// <param name="strLog">strLog</param>
public static void WriteByLogType(string strType, string strLog)
{
if (!_Log.ContainsKey(strType))
{
//判断是否存在节点
if (!HasLogNode(strType))
{
WriteErrorLog("log4net配置文件不存在【" + strType + "】配置");
return;
}
_Log[strType] = log4net.LogManager.GetLogger(strType);
}
_Log[strType].Error(strLog);
}
/// <summary>
/// 功能描述:是否存在指定的配置
/// </summary>
/// <param name="strNodeName">strNodeName</param>
/// <returns>返回值</returns>
private static bool HasLogNode(string strNodeName)
{
XmlDocument doc = new XmlDocument();
doc.Load(_Logfile);
var lstNodes = doc.SelectNodes("//configuration/log4net/logger");
foreach (XmlNode item in lstNodes)
{
if (item.Attributes["name"].Value.ToLower() == strNodeName)
return true;
}
return false;
}
}
C#在window服务配置Log4Net.dll-腾讯云开发者社区-腾讯云
C# log4net 日志输出超详细_c#用log4net输出多个参数-CSDN博客
四、目前项目配置
log4net.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<!--在配置选项中加入log4net的引用-->
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<logger name="modifyLogger">
<level value="ALL" />
<appender-ref ref="modifyLogFile" />
</logger>
<!--用于记录额外的一些重要记录,比如关键参数修改记录-->
<appender name="modifyLogFile" type="log4net.Appender.RollingFileAppender,log4net" >
<!--日志路径-->
<param name= "File" value= "log/modify/"/>
<!--是否是向文件中追加日志-->
<param name= "AppendToFile" value= "true"/>
<!--log保留天数,只有当日志名称都一样的才一样,日志名称为日期的时候,此处配置失效,无法使用-->
<param name= "MaxSizeRollBackups" value= "10"/>
<!--日志文件名是否是固定不变的-->
<param name= "StaticLogFileName" value= "false"/>
<!--日志文件名格式为:2008-08-31.log-->
<param name= "DatePattern" value= "yyyy-MM-dd".log""/>
<!-- RollingStyle Composite 综合 Size 按大小 Date 按时间 -->
<param name= "RollingStyle" value= "Composite"/>
<!--不要使用小数,否则会一直写入当前日志-->
<maximumFileSize value="10MB"/>
<layout type="log4net.Layout.PatternLayout">
<param name="Header" value="
----------------------application startup--------------------------
" />
<param name="Footer" value="
 ----------------------application shutdown--------------------------
" />
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} --%-5p-- %m%n" />
</layout>
</appender>
<logger name="logLogger">
<level value="ALL" />
<appender-ref ref="LogFile" />
</logger>
<appender name="LogFile" type="log4net.Appender.RollingFileAppender,log4net" >
<!--日志路径-->
<param name= "File" value= "log/"/>
<!--是否是向文件中追加日志-->
<param name= "AppendToFile" value= "true"/>
<!--log保留天数,只有当日志名称都一样的才一样,日志名称为日期的时候,失效-->
<param name= "MaxSizeRollBackups" value= "10"/>
<!--日志文件名是否是固定不变的-->
<param name= "StaticLogFileName" value= "false"/>
<!--日志文件名格式为:2008-08-31.log-->
<param name= "DatePattern" value= "yyyy-MM-dd".log""/>
<!-- RollingStyle Composite 综合 Size 按大小 Date 按时间 -->
<param name= "RollingStyle" value= "Composite"/>
<!--不要使用小数,否则会一直写入当前日志-->
<maximumFileSize value="10MB"/>
<layout type="log4net.Layout.PatternLayout">
<param name="Header" value="
----------------------application startup--------------------------
" />
<param name="Footer" value="
 ----------------------application shutdown--------------------------
" />
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} --%-5p-- %m%n" />
</layout>
</appender>
<appender>
<!--一个配置文件可以有很多appender,一个appender节就相当于一个日志输出介质或方法。-->
</appender>
<logger name="logApp">
<!--定义logger对象的名字为logApp,以方便在代码中使用logger-->
<!--配置项可以不配置-->
<level value="ALL" />
<!--定义输出的信息等级为所有其中包括Fatal.Error.Warn.Info.Debug-->
</logger>
<root>
</root>
</log4net>
</configuration>
代码调用:
public static bool s_IsStarting = false;//程序正在加载中
public static List<string> s_ErrMsg = new List<string>();//加载过程中是错误信息
private static ILog log4Net = log4net.LogManager.GetLogger("logLogger");//全局日志 "logLogger"与log4net.config配置里的名称一致
private static readonly ILog LogModify = LogManager.GetLogger("modifyLogger");//模块参数修改记录
注意:
五、AppenderSkeleton自定义
AppenderSkeleton
是 log4net
日志记录库中的一个抽象基类,用于实现自定义的日志附加器(Appender)。AppenderSkeleton
类提供了一个基本的实现框架,简化了创建自定义附加器的过程。
AppenderSkeleton
概述
在 log4net
中,Appender 是用于将日志消息输出到某个目标的组件,例如文件、控制台、数据库等。AppenderSkeleton
作为一个基类,帮助开发者创建自定义的附加器,而无需从头开始实现所有的功能
主要功能和特性
- 基础功能:
AppenderSkeleton
提供了一些基本的功能,如处理日志事件和配置附加器。 - 日志事件处理: 它实现了处理日志事件的逻辑,这样你可以集中精力在如何将日志输出到特定目标上。
- 配置支持: 支持通过
log4net
的配置文件进行配置。
关键方法和属性
-
Append(LoggingEvent loggingEvent)
:- 这是一个抽象方法,必须在自定义附加器中实现。它接收一个
LoggingEvent
对象,表示一个日志事件,并定义如何处理这个日志事件。你可以在这里实现将日志消息输出到目标的逻辑。
- 这是一个抽象方法,必须在自定义附加器中实现。它接收一个
-
ActivateOptions()
:- 这个方法用于初始化附加器的配置选项。
log4net
会在附加器的配置被激活时调用这个方法。
- 这个方法用于初始化附加器的配置选项。
-
RenderLoggingEvent(LoggingEvent loggingEvent)
:- 这个方法将
LoggingEvent
转换为字符串,通常用于格式化日志消息。可以根据需要重写这个方法以提供自定义的日志消息格式。
- 这个方法将
配置config 文件
<appender name="CustomAppender" type="YourNamespace.CustomAppender, YourAssembly">
<!-- 这里可以添加自定义配置选项 -->
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="CustomAppender" />
</root>
示例代码
public class CustomAppender : AppenderSkeleton
{
protected override void Append(LoggingEvent loggingEvent)
{
// 实现自定义的日志处理逻辑
//RenderLoggingEvent 方法将 LoggingEvent 对象中的信息(如日志级别、日志消息、时间戳等)转换为字符串。这使得日志消息可以被输出到配置的目标(如文件或控制台)中。
string _logMessage =RenderLoggingEvent(loggingEvent);
Console.WriteLine($"Custom Log Output: {_logMessage}");
}
public override void ActivateOptions()
{
base.ActivateOptions();
// 自定义初始化逻辑
}
}
文章评论