C# Log4net日志 配置 与AppenderSkeleton

devtools/2025/1/16 6:42:18/

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&quot;.log&quot;" /><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# log4net 配置使用-腾讯云开发者社区-腾讯云

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&quot;.log&quot;"/><!-- RollingStyle Composite 综合  Size 按大小  Date 按时间 --><param name= "RollingStyle" value= "Composite"/><!--不要使用小数,否则会一直写入当前日志--><maximumFileSize value="10MB"/><layout type="log4net.Layout.PatternLayout"><param name="Header" value="&#xD;&#xA;----------------------application startup--------------------------&#xD;&#xA;" /><param name="Footer" value="&#xD;&#xA; ----------------------application shutdown--------------------------&#xD;&#xA;" /><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&quot;.log&quot;"/><!-- RollingStyle Composite 综合  Size 按大小  Date 按时间 --><param name= "RollingStyle" value= "Composite"/><!--不要使用小数,否则会一直写入当前日志--><maximumFileSize value="10MB"/><layout type="log4net.Layout.PatternLayout"><param name="Header" value="&#xD;&#xA;----------------------application startup--------------------------&#xD;&#xA;" /><param name="Footer" value="&#xD;&#xA; ----------------------application shutdown--------------------------&#xD;&#xA;" /><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自定义

AppenderSkeletonlog4net 日志记录库中的一个抽象基类,用于实现自定义的日志附加器(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();// 自定义初始化逻辑}}


http://www.ppmy.cn/devtools/96596.html

相关文章

软件安防平台 VSD-C2

产品简介 VSD用于军用C2(command & control)&#xff0c;反无人机和安全基础设施保护的多功能软件。它支持广泛的雷达、多种摄像头类型、视频跟踪和第三方AI模块。VSD在标准Windows PC工作站、笔记本电脑或服务器上运行&#xff0c;可用于分层C2或边缘网络&#xff0c;适用…

常用的idea、vscode、notpad快捷键

idea 快捷键&#xff1a; 全文快捷搜索&#xff1a;crtl shift r 进入实现类的方法&#xff1a; ctrlaltb 格式化&#xff1a;ctrlaltl 转换为大写字母的快捷键是Ctrl Shift U idea复制一行到下一行&#xff1a;ctrl D 按照行数查找快捷键&#xff1a;ctrlG 删除一行…

Java基础入门-多态

Test() package polymorphism;public class Test {public static void main(String[] args) {People s1 new Student();//多态s1.run();//Student run fastlys1.tuy();//只有people有的函数也不报错 just people have// s1.test();报错//多态存在问题&#xff1a;不能直接调用…

Java中的委托(Delegation)

在面向对象编程中&#xff0c;委托是一种设计模式&#xff0c;用于实现代码的复用和模块化&#xff0c;特别是在Java语言中&#xff0c;尽管没有直接的语言级支持&#xff0c;但委托模式通过接口和类的组合实现&#xff0c;提供了一种介于继承和组合之间的解决方案。本教程将详…

NTC热敏电阻读取温度

工作原理 我不太懂&#xff0c;大概就是电阻受热然后阻值变化&#xff0c;然后通过跟它串联一个电阻&#xff0c;计算分压&#xff0c;算出热敏电阻的阻值&#xff0c;再更具阻值和温度的变化规律计算出温度。 CN1 接的就一个NTC热敏电阻&#xff0c;这里给的是一个3.3V的参考电…

stm32智能颜色送餐小车(ESP8266WIFI模块、APP制作、物联网模型建立、MQTTFX)

大家好啊&#xff0c;我是情谊&#xff0c;今天我们来介绍一下我最近设计的stm32产品&#xff0c;我们在今年七月份的时候参加了光电设计大赛&#xff0c;我们小队使用的就是stm32的智能送餐小车&#xff0c;虽然止步于省赛&#xff0c;但是还是一次成长的经验吧&#xff0c;那…

sqlalchemy查询结果序列化成字典

1、标题sqlalchemy查询结果序列化成字典 类似于Django的model_to_dict 实现步骤 获取对应表的字段获取查询结果字段属性的值1.1、示例 1.1.1、分步写法 from sqlalchemy.ext.declarative import declarative_baseBaseModel = declarative_base()class BaseModelMixin(BaseM…

Element-02.组件-Table表格

一.常见组件-表格 二.具体操作 <template><el-table:data"tableData"borderstyle"width: 100%"><el-table-columnprop"date"label"日期"width"180"></el-table-column><el-table-columnprop&q…