ToB企服应用市场:ToB评测及商务社交产业平台

标题: C# Log4net日志 设置 与AppenderSkeleton [打印本页]

作者: 丝    时间: 2024-8-15 23:48
标题: C# Log4net日志 设置 与AppenderSkeleton
https://www.cnblogs.com/yaopengfei/p/9428206.html

一、Log4Net简介


Log4net是从Java中的Log4j迁移过来的一个.Net版的开源日志框架,它的功能很强大,可以将日志分为差别的等级,以差别的格式输出到差别的存储介质中,好比:数据库、txt文件、内存缓冲区、邮件、控制台、ANSI终端、长途接收端等等,我们这里主要先容最常用的两种:txt文件和数据库。
日志级别

Log4net将日志分为六个级别,

二、安装Log4Net

安装


 设置


  1. <?xml version="1.0" encoding="utf-8"?>
  2. <configuration>
  3.         <!-- 1. 添加log4net的节点声明配置代码-->
  4.         <configSections>
  5.                 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
  6.         </configSections>
  7.         <!--2. log4net的核心配置代码-->
  8.         <log4net>
  9.                 <!--把日志信息输出到以日期命名的文件里-->
  10.                 <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
  11.                         <!--文件夹的位置-->
  12.                         <file value="D:\MyLog1" />
  13.                         <appendToFile value="true" />
  14.                         <!--动态生成文件名-->
  15.                         <param name="StaticLogFileName" value="false" />
  16.                         <!--以日期命名-->
  17.                         <param name="DatePattern" value="yyyyMMdd&quot;.log&quot;" />
  18.                         <rollingStyle value="Date" />
  19.                         <!--日志在日志文件中的布局方式-->
  20.                         <layout type="log4net.Layout.PatternLayout">
  21.                                 <conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别:  %-5level %n出错类:%logger property: [%property{NDC}] - %n错误描述:%message%newline %n" />
  22.                         </layout>
  23.                         <!--使用最小锁定模型(minimal locking model),以允许多个进程可以写入同一个文件 -->
  24.                         <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  25.                 </appender>
  26.                 <root>
  27.                         <level value="ALL"></level>
  28.                         <appender-ref ref="RollingFileAppender"></appender-ref>
  29.                 </root>
  30.         </log4net>
  31.         <startup>
  32.                 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
  33.         </startup>
  34.   <runtime>
  35.     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  36.       <dependentAssembly>
  37.         <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" culture="neutral" />
  38.         <bindingRedirect oldVersion="0.0.0.0-2.0.15.0" newVersion="2.0.15.0" />
  39.       </dependentAssembly>
  40.     </assemblyBinding>
  41.   </runtime>
  42. </configuration>
复制代码
添加设置

  1. // log4net初始化配置文件     作用域全局 //代码:
  2. //Log4net配置
  3. [assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "config", Watch = true)]
复制代码


测试:

  1.         static void Main()
  2.         {
  3.             log4net.ILog _log = log4net.LogManager.GetLogger("Main");
  4.             _log.Info("正常信息 ");
  5.             _log.Error("错误");
  6.             Application.EnableVisualStyles();
  7.             Application.SetCompatibleTextRenderingDefault(false);
  8.             Application.Run(new Form1());
  9.         }
复制代码


三、项目设置文件

步调:

1、添加log4net.config

注意点:

2、编写 log4net.config文件

3、编写AssemblyInfo.cs 文本
  1. [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]
复制代码

测试;

  1.         private void button1_Click(object sender, EventArgs e)
  2.         {
  3.             log4net.ILog log = log4net.LogManager.GetLogger("AppLogger1");
  4.             log.Info("button  test");
  5.         }
复制代码



设置2:

不需要再AssemblyInfo.cs 文件,需要直接调用方法
  1.      // strlog4Config  这里传入的是log4net.config 的配置文件
  2.     public  static  void InitLogNet(string  strlog4Config)
  3.         {
  4.             log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(strlog4Config));
  5.             _Logfile = strlog4Config;
  6.             _Log["info_logo"] = log4net.LogManager.GetLogger("info_logo");
  7.             _Log["error_logo"] = log4net.LogManager.GetLogger("error_logo");
  8.         }
复制代码
调用:
  1. Log4NetHelper.InitLog4Net(Application.StartupPath + "\\log4net.config");   
复制代码
code2 :
  1.   public  class Log4NetHelper
  2.   {
  3.       private static string _Logfile;
  4.       private static Dictionary<string, log4net.ILog> _Log = new Dictionary<string, log4net.ILog>();
  5.       public  static  void InitLogNet(string  strlog4Config)
  6.       {
  7.           log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(strlog4Config));
  8.           _Logfile = strlog4Config;
  9.           _Log["info_logo"] = log4net.LogManager.GetLogger("info_logo");
  10.           _Log["error_logo"] = log4net.LogManager.GetLogger("error_logo");
  11.       }
  12.       /// <summary>
  13.       /// 写入日志
  14.       /// </summary>
  15.       public  static  void  WriteInfoLog(string strInfoLog)
  16.       {
  17.           if (_Log["info_logo"].IsInfoEnabled)
  18.           {
  19.               _Log["info_logo"].Info(strInfoLog);
  20.           }
  21.       }
  22.       /// <summary>
  23.       /// 功能描述:写入错误日志
  24.       /// </summary>
  25.       /// <param name="strErrLog">strErrLog</param>
  26.       /// <param name="ex">ex</param>
  27.       public static void WriteErrorLog(string strErrLog, Exception ex = null)
  28.       {
  29.           if (_Log["error_logo"].IsErrorEnabled)
  30.           {
  31.               _Log["error_logo"].Error(strErrLog, ex);
  32.           }
  33.       }
  34.       /// <summary>
  35.       /// 功能描述:写入日志
  36.       /// </summary>
  37.       /// <param name="strType">日志类型(对应log4net配置文件中logger.nama)</param>
  38.       /// <param name="strLog">strLog</param>
  39.       public static void WriteByLogType(string strType, string strLog)
  40.       {
  41.           if (!_Log.ContainsKey(strType))
  42.           {
  43.               //判断是否存在节点
  44.               if (!HasLogNode(strType))
  45.               {
  46.                   WriteErrorLog("log4net配置文件不存在【" + strType + "】配置");
  47.                   return;
  48.               }
  49.               _Log[strType] = log4net.LogManager.GetLogger(strType);
  50.           }
  51.           _Log[strType].Error(strLog);
  52.       }
  53.       /// <summary>
  54.       /// 功能描述:是否存在指定的配置
  55.       /// </summary>
  56.       /// <param name="strNodeName">strNodeName</param>
  57.       /// <returns>返回值</returns>
  58.       private static bool HasLogNode(string strNodeName)
  59.       {
  60.           XmlDocument doc = new XmlDocument();
  61.           doc.Load(_Logfile);
  62.           var lstNodes = doc.SelectNodes("//configuration/log4net/logger");
  63.           foreach (XmlNode item in lstNodes)
  64.           {
  65.               if (item.Attributes["name"].Value.ToLower() == strNodeName)
  66.                   return true;
  67.           }
  68.           return false;
  69.       }
  70.   }
复制代码
c# log4net 设置利用-腾讯云开发者社区-腾讯云
C#在window服务设置Log4Net.dll-腾讯云开发者社区-腾讯云
C# log4net 日志输出超详细_c#用log4net输出多个参数-CSDN博客
 四、目前项目设置

log4net.config

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3.   <configSections>
  4.     <!--在配置选项中加入log4net的引用-->
  5.     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  6.   </configSections>
  7.        
  8.        
  9.   <log4net>
  10.     <logger name="modifyLogger">
  11.       <level value="ALL" />
  12.       <appender-ref ref="modifyLogFile" />
  13.     </logger>
  14.     <!--用于记录额外的一些重要记录,比如关键参数修改记录-->
  15.     <appender  name="modifyLogFile" type="log4net.Appender.RollingFileAppender,log4net" >
  16.       <!--日志路径-->
  17.       <param name= "File" value= "log/modify/"/>
  18.       <!--是否是向文件中追加日志-->
  19.       <param name= "AppendToFile" value= "true"/>
  20.       <!--log保留天数,只有当日志名称都一样的才一样,日志名称为日期的时候,此处配置失效,无法使用-->
  21.       <param name= "MaxSizeRollBackups" value= "10"/>
  22.       <!--日志文件名是否是固定不变的-->
  23.       <param name= "StaticLogFileName" value= "false"/>
  24.       <!--日志文件名格式为:2008-08-31.log-->
  25.       <param name= "DatePattern" value= "yyyy-MM-dd&quot;.log&quot;"/>
  26.       <!-- RollingStyle Composite 综合  Size 按大小  Date 按时间 -->
  27.       <param name= "RollingStyle" value= "Composite"/>
  28.       <!--不要使用小数,否则会一直写入当前日志-->
  29.       <maximumFileSize value="10MB"/>
  30.       <layout type="log4net.Layout.PatternLayout">
  31.         <param name="Header" value="&#xD;&#xA;----------------------application startup--------------------------&#xD;&#xA;" />
  32.         <param name="Footer" value="&#xD;&#xA; ----------------------application shutdown--------------------------&#xD;&#xA;" />
  33.         <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} --%-5p-- %m%n" />
  34.       </layout>
  35.     </appender>
  36.           
  37.           
  38.           
  39.     <logger name="logLogger">
  40.       <level value="ALL" />
  41.       <appender-ref ref="LogFile" />
  42.     </logger>
  43.     <appender  name="LogFile" type="log4net.Appender.RollingFileAppender,log4net" >
  44.       <!--日志路径-->
  45.       <param name= "File" value= "log/"/>
  46.       <!--是否是向文件中追加日志-->
  47.       <param name= "AppendToFile" value= "true"/>
  48.       <!--log保留天数,只有当日志名称都一样的才一样,日志名称为日期的时候,失效-->
  49.       <param name= "MaxSizeRollBackups" value= "10"/>
  50.       <!--日志文件名是否是固定不变的-->
  51.       <param name= "StaticLogFileName" value= "false"/>
  52.       <!--日志文件名格式为:2008-08-31.log-->
  53.       <param name= "DatePattern" value= "yyyy-MM-dd&quot;.log&quot;"/>
  54.       <!-- RollingStyle Composite 综合  Size 按大小  Date 按时间 -->
  55.       <param name= "RollingStyle" value= "Composite"/>
  56.       <!--不要使用小数,否则会一直写入当前日志-->
  57.       <maximumFileSize value="10MB"/>
  58.       <layout type="log4net.Layout.PatternLayout">
  59.         <param name="Header" value="&#xD;&#xA;----------------------application startup--------------------------&#xD;&#xA;" />
  60.         <param name="Footer" value="&#xD;&#xA; ----------------------application shutdown--------------------------&#xD;&#xA;" />
  61.         <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} --%-5p-- %m%n" />
  62.       </layout>
  63.     </appender>
  64.     <appender>
  65.       <!--一个配置文件可以有很多appender,一个appender节就相当于一个日志输出介质或方法。-->
  66.     </appender>
  67.     <logger name="logApp">
  68.       <!--定义logger对象的名字为logApp,以方便在代码中使用logger-->
  69.       <!--配置项可以不配置-->
  70.       <level value="ALL" />
  71.       <!--定义输出的信息等级为所有其中包括Fatal.Error.Warn.Info.Debug-->
  72.     </logger>
  73.     <root>
  74.     </root>
  75.   </log4net>
  76. </configuration>
复制代码
代码调用:

  1.    public static bool s_IsStarting = false;//程序正在加载中
  2.    public static List<string> s_ErrMsg = new List<string>();//加载过程中是错误信息
  3.    private static ILog log4Net = log4net.LogManager.GetLogger("logLogger");//全局日志 "logLogger"与log4net.config配置里的名称一致
  4.    private static readonly ILog LogModify = LogManager.GetLogger("modifyLogger");//模块参数修改记录
复制代码
注意:


五、AppenderSkeleton自定义

AppenderSkeleton 是 log4net 日志纪录库中的一个抽象基类,用于实现自定义的日志附加器(Appender)。AppenderSkeleton 类提供了一个基本的实现框架,简化了创建自定义附加器的过程。
AppenderSkeleton 概述

在 log4net 中,Appender 是用于将日志消息输出到某个目的的组件,例如文件、控制台、数据库等。AppenderSkeleton 作为一个基类,资助开发者创建自定义的附加器,而无需从头开始实现全部的功能
主要功能和特性


关键方法和属性


设置config 文件

  1. <appender name="CustomAppender" type="YourNamespace.CustomAppender, YourAssembly">
  2.   <!-- 这里可以添加自定义配置选项 -->
  3. </appender>
  4. <root>
  5.   <level value="DEBUG" />
  6.   <appender-ref ref="CustomAppender" />
  7. </root>
复制代码
示例代码

  1.     public class CustomAppender : AppenderSkeleton
  2.     {
  3.         protected  override void Append(LoggingEvent loggingEvent)
  4.         {
  5.             // 实现自定义的日志处理逻辑
  6.             //RenderLoggingEvent 方法将 LoggingEvent 对象中的信息(如日志级别、日志消息、时间戳等)转换为字符串。这使得日志消息可以被输出到配置的目标(如文件或控制台)中。
  7.             string _logMessage =RenderLoggingEvent(loggingEvent);
  8.             Console.WriteLine($"Custom Log Output: {_logMessage}");
  9.         }
  10.         public override void ActivateOptions()
  11.         {
  12.             base.ActivateOptions();
  13.             // 自定义初始化逻辑
  14.         }
  15.    }
复制代码




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4