C#配置log4net实现将日志分类记录到不同的日志文件中

 更新时间:2024年02月25日 09:15:23   作者:搬砖的诗人Z  
log4net是.Net下一个非常优秀的开源日志记录组件,log4net记录日志的功能非常强大,它可以将日志分不同的等级,以不同的格式,输出到不同的媒介,下面我们就来看看C#如何配置log4net让日志分类记录到不同的日志文件吧

概述

Log4net库是.Net下一个非常优秀的开源日志记录组件,是一个帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的工具。

它具有:支持多数框架、可输出日志到多种目标、层级日志体系、可使用XML配置、可动态配置、模块化和可扩展化设计、灵活、高性能等特征。

日志记录器(Logger)的行为是分等级的,一般可分为5种日志等级(Level),优先级从高到低:

1、FATAL(致命错误):记录系统中出现的能使用系统完全失去功能,服务停止,系统崩溃等使系统无法继续运行下去的错误。例如,数据库无法连接,系统出现死循环。

2、ERROR(一般错误):记录系统中出现的导致系统不稳定,部分功能出现混乱或部分功能失效一类的错误。例如,数据字段为空,数据操作不可完成,操作出现异常等。

3、WARN(警告):记录系统中不影响系统继续运行,但不符合系统运行正常条件,有可能引起系统错误的信息。例如,记录内容为空,数据内容不正确等。

4、INFO(一般信息):记录系统运行中应该让用户知道的基本信息。例如,服务开始运行,功能已经开户等。

5、DEBUG (调试信息):记录系统用于调试的一切信息,内容或者是一些关键数据内容的输出。

我们可以控制到应用程序中相应级别的日志信息的开关。比如在定义了INFO级别, 则应用程序中所有DEBUG级别的日志信息将不被打印出来。

Log4net的优点

可以提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug

一旦在程序中加入了Log 输出代码,程序运行过程中就能生成并输出日志信息而无需人工干预

日志信息可以输出到不同的地方(控制台,文件等)以备以后研究之用

实践

如何配置log4net,让日志分类记录到不同的日志文件中

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
  </startup>
  <log4net>
    <root>
      <priority value="ALL" />
      <appender-ref ref="RollingLogFileAppender" />
      <appender-ref ref="RollingLogWarnFileAppender"/>
      <appender-ref ref="RollingLogFatalFileAppender"/>
      <appender-ref ref="RollingLogInfoFileAppender"/>
      <!--<appender-ref ref="ColoredConsoleAppender" />-->
    </root>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="Log\\Error\\" />
      <param name="AppendToFile" value="true" />
      <param name="MaxFileSize" value="10240" />
      <param name="MaxSizeRollBackups" value="100" />
      <param name="StaticLogFileName" value="false" />
      <param name="DatePattern" value="yyyy_MM_dd'.log'" />
      <param name="RollingStyle" value="Date" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%r %date [%thread] %-5level- %message%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="ERROR" />
        <levelMax value="ERROR" />
      </filter>
    </appender>
    <appender name="RollingLogWarnFileAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="Log\\Warn\\" />
      <param name="AppendToFile" value="true" />
      <param name="MaxFileSize" value="10240" />
      <param name="MaxSizeRollBackups" value="100" />
      <param name="StaticLogFileName" value="false" />
      <param name="DatePattern" value="yyyy_MM_dd'.log'" />
      <param name="RollingStyle" value="Date" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%r %date [%thread] %-5level- %message%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="WARN" />
        <levelMax value="WARN" />
      </filter>      
    </appender>
    <appender name="RollingLogFatalFileAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="Log\\Fatal\\" />
      <param name="AppendToFile" value="true" />
      <param name="MaxFileSize" value="10240" />
      <param name="MaxSizeRollBackups" value="100" />
      <param name="StaticLogFileName" value="false" />
      <param name="DatePattern" value="yyyy_MM_dd'.log'" />
      <param name="RollingStyle" value="Date" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%r %date [%thread] %-5level- %message%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="FATAL" />
        <levelMax value="FATAL" />
      </filter>
    </appender>
    <appender name="RollingLogInfoFileAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="Log\\Info\\" />
      <param name="AppendToFile" value="true" />
      <param name="MaxFileSize" value="10240" />
      <param name="MaxSizeRollBackups" value="100" />
      <param name="StaticLogFileName" value="false" />
      <param name="DatePattern" value="yyyy_MM_dd'.log'" />
      <param name="RollingStyle" value="Date" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%r %date [%thread] %-5level- %message%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="INFO" />
        <levelMax value="INFO" />
      </filter>
    </appender>    
    <!--<appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
      <mapping>
        <level value="FATAL" />
        <foreColor value="Red, HighIntensity" />
      </mapping>
      <mapping>
        <level value="ERROR" />
        <foreColor value="Red" />
      </mapping>
      <mapping>
        <level value="WARN" />
        <foreColor value="Yellow" />
      </mapping>
      <mapping>
        <level value="INFO" />
        <foreColor value="White" />
      </mapping>
      <mapping>
        <level value="DEBUG" />
        <foreColor value="Green" />
      </mapping>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%r %date [%thread] %-5level- %message%newline" />
      </layout>
    </appender>-->
  </log4net>

</configuration>

使用代码

private static readonly ILog logInfo = LogManager.GetLogger("loginfo");
        static LoggingHelper()
        {
            IntiLocalLog();
        }

        /// <summary>
        /// 记录严重错误日志
        /// </summary>
        /// <param name="message">消息内容</param>
        /// <param name="ex">异常信息</param>
        /// <param name="isWriteDebug">是否在output输出</param>
        public static void Fatal(string message, Exception ex = null, bool isWriteDebug = true)
        {
            Task.Factory.StartNew(() =>
            {
                logInfo.Fatal(message, ex);
            }).ContinueWith((t) =>
            {
                LoggingHelper.Error("日志严重错误信息记录错误" + t.Exception.InnerException.GetType().Name);
            },
                    TaskContinuationOptions.OnlyOnFaulted);
        }


        /// <summary>
        /// 记录错误日志
        /// </summary>
        /// <param name="message">消息内容</param>
        /// <param name="ex">异常信息</param>
        /// <param name="isWriteDebug">是否在output输出</param>
        public static void Error(string message, Exception ex = null, bool isWriteDebug = true)
        {
            Task.Factory.StartNew(() =>
            {
                logInfo.Error(message, ex);
            }).ContinueWith((t) =>
            {
                LoggingHelper.Error("日志异常信息记录错误" + t.Exception.InnerException.GetType().Name);
            },
                    TaskContinuationOptions.OnlyOnFaulted);
        }


        /// <summary>
        /// 记录警告日志
        /// </summary>
        /// <param name="message">消息内容</param>
        /// <param name="ex">异常信息</param>
        /// <param name="isWriteDebug">是否在output输出</param>
        public static void Warn(string message, Exception ex = null, bool isWriteDebug = true)
        {
            Task.Factory.StartNew(() =>
            {
                 logInfo.Warn(message, ex);
            }).ContinueWith((t) =>
            {
                LoggingHelper.Error("日志警告信息记录错误" + t.Exception.InnerException.GetType().Name);
            },
                    TaskContinuationOptions.OnlyOnFaulted);
        }

        /// <summary>
        /// 记录信息日志
        /// </summary>
        /// <param name="message">消息内容</param>
        /// <param name="ex">异常信息</param>
        /// <param name="isWriteDebug">是否在output输出</param>
        public static void Info(string message, Exception ex = null, bool isWriteDebug = true)
        {
            Task.Factory.StartNew(() =>
            {
                logInfo.Info(message, ex);
            }).ContinueWith((t) =>
            {
                LoggingHelper.Error("日志信息记录错误" + t.Exception.InnerException.GetType().Name);
            },
                    TaskContinuationOptions.OnlyOnFaulted);
        }

        /// <summary>
        /// 记录调试日志
        /// </summary>
        /// <param name="message">消息内容</param>
        public static void Debug(string message)
        {
            Task.Factory.StartNew(() =>
            {
                logInfo.Debug(message);
            }).ContinueWith((t) =>
            {
                LoggingHelper.Error("日志调试信息记录错误" + t.Exception.InnerException.GetType().Name);
            },
                    TaskContinuationOptions.OnlyOnFaulted);
        }

        #region 私有方法

        private static void IntiLocalLog()
        {
            log4net.Config.XmlConfigurator.Configure();
        }

        #endregion

到此这篇关于C#配置log4net实现将日志分类记录到不同的日志文件中的文章就介绍到这了,更多相关C# log4net日志分类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#程序集的主版本号和次版本号的实现

    C#程序集的主版本号和次版本号的实现

    C# 程序集的版本号和次版本号是程序集的一部分,用于标识程序集的不同版,本本文主要介绍了C#程序集的主版本号和次版本号的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • 通过C#实现在Excel单元格中写入文本、或数值

    通过C#实现在Excel单元格中写入文本、或数值

    在商业、学术和日常生活中,Excel 的使用极为普遍,本文将详细介绍如何使用免费.NET库将数据写入到 Excel 中,包括文本、数值、数组、和DataTable数据的输入,需要的朋友可以参考下
    2024-07-07
  • c#使用csredis操作redis的示例

    c#使用csredis操作redis的示例

    这篇文章主要介绍了c#使用csredis操作redis的示例,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-12-12
  • WinForm实现按名称递归查找控件的方法

    WinForm实现按名称递归查找控件的方法

    这篇文章主要介绍了WinForm实现按名称递归查找控件的方法,需要的朋友可以参考下
    2014-08-08
  • C#实现图表中鼠标移动并显示数据

    C#实现图表中鼠标移动并显示数据

    这篇文章主要为大家详细介绍了C#实现图表中鼠标移动并显示数据,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C#异常处理的一些经验和技巧

    C#异常处理的一些经验和技巧

    本文是异常处理经验性的文章,其实跟C#关系也不大。比较适合刚刚熟悉异常语法,而缺乏实战的读者。当然,经验老练的读者也可指出不足、给予意见、补充说明,一起完善文章,分享更多知识与经验
    2014-03-03
  • 深入理解C#指针之美

    深入理解C#指针之美

    在C#中,有时候希望通过指针来操作内存,这样可以提高效率。我们可以用unsafe关键字修饰含有指针操作的程序段,感兴趣的小伙伴可以参考一下,希望可以帮到你
    2021-07-07
  • C#实现String类型和json之间的相互转换功能示例

    C#实现String类型和json之间的相互转换功能示例

    这篇文章主要介绍了C#实现String类型和json之间的相互转换功能,涉及C# json格式数据的构造、转换相关操作技巧,需要的朋友可以参考下
    2017-09-09
  • 使用C#发送Http请求实现模拟登陆实例

    使用C#发送Http请求实现模拟登陆实例

    本文主要介绍了使用C#发送Http请求实现模拟登陆实例,模拟登陆的原理简单,想要了解的朋友可以了解一下。
    2016-10-10
  • C#隐式/显示实现接口方法详解

    C#隐式/显示实现接口方法详解

    这篇文章主要为大家详细介绍了C#隐式/显示实现接口方法,接口的使用场景介绍,感兴趣的小伙伴们可以参考一下
    2016-03-03

最新评论