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

安装

 配置

<?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();
            // 自定义初始化逻辑
        }
   }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值