发表于 2024-8-15 23:48:35

C# Log4net日志 设置 与AppenderSkeleton

https://www.cnblogs.com/yaopengfei/p/9428206.html

一、Log4Net简介


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

Log4net将日志分为六个级别,


[*]Trace: 最详细的日志信息。
[*]Debug: 调试信息,通常用于开发和调试阶段。
[*]Info: 一般信息,表示应用步伐的正常操纵状态。
[*]Warn: 警告信息,指示大概的题目或异常情况。
[*]Error: 错误信息,表示出现了异常或错误情况。
[*]Fatal: 致命错误,表示步伐大概无法继续运行
二、安装Log4Net

安装

https://i-blog.csdnimg.cn/direct/8598f99000c746bf8d9811938ab74878.png
 设置

https://i-blog.csdnimg.cn/direct/12090603d2c646a18b3e4c7b8e6e43e0.png
<?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配置
https://i-blog.csdnimg.cn/direct/c32a7c1ca0834eaab74f8d37c245e531.png

测试:

      static void Main()
      {

            log4net.ILog _log = log4net.LogManager.GetLogger("Main");
            _log.Info("正常信息 ");
            _log.Error("错误");


            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
      } https://i-blog.csdnimg.cn/direct/a61de92d79f14f1283da8fd9f0be1f8d.png

三、项目设置文件

步调:

1、添加log4net.config
https://i-blog.csdnimg.cn/direct/44742fa0368140a1b86c74f72f9c849d.png
注意点:
https://i-blog.csdnimg.cn/direct/1074b20cebcb406f942a6d969a5959c9.png
2、编写 log4net.config文件
https://i-blog.csdnimg.cn/direct/5bff910545604e2f94ae287ed09fa455.png
3、编写AssemblyInfo.cs 文本
https://i-blog.csdnimg.cn/direct/a730b63e9af747ef994531e2c1f80536.png
测试;


      private void button1_Click(object sender, EventArgs e)
      {
            log4net.ILog log = log4net.LogManager.GetLogger("AppLogger1");

            log.Info("buttontest");

      } https://i-blog.csdnimg.cn/direct/a7bddc82bd0f4e54930a61085cebba0c.png
https://i-blog.csdnimg.cn/direct/dee0fb338675455283cbfa2219f5a3a1.png

设置2:

不需要再AssemblyInfo.cs 文件,需要直接调用方法
   // strlog4Config这里传入的是log4net.config 的配置文件
    publicstaticvoid InitLogNet(stringstrlog4Config)
      {
            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 :
publicclass Log4NetHelper
{
      private static string _Logfile;
      private static Dictionary<string, log4net.ILog> _Log = new Dictionary<string, log4net.ILog>();

      publicstaticvoid InitLogNet(stringstrlog4Config)
      {
          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>
      publicstaticvoidWriteInfoLog(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 = log4net.LogManager.GetLogger(strType);
          }
          _Log.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>

    <!--用于记录额外的一些重要记录,比如关键参数修改记录-->
    <appendername="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>

    <appendername="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");//模块参数修改记录 注意:

https://i-blog.csdnimg.cn/direct/d94335ec98d44c289e7ffa6c8bfde672.png
五、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
    {
      protectedoverride void Append(LoggingEvent loggingEvent)
      {

            // 实现自定义的日志处理逻辑
            //RenderLoggingEvent 方法将 LoggingEvent 对象中的信息(如日志级别、日志消息、时间戳等)转换为字符串。这使得日志消息可以被输出到配置的目标(如文件或控制台)中。
            string _logMessage =RenderLoggingEvent(loggingEvent);
            Console.WriteLine($"Custom Log Output: {_logMessage}");

      }

      public override void ActivateOptions()
      {
            base.ActivateOptions();
            // 自定义初始化逻辑
      }
   }



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: C# Log4net日志 设置 与AppenderSkeleton