• C# 使用 log4net 记录日志


    Ø  前言

    在一般的开发应用中,都会涉及到日志记录,用于排查错误 或 记录程序运行时的日志信息。log4net 库是 Apache log4j 框架在 Microsoft .NET 平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的组件。

    下面介绍下如何在 C# 中如何使用 log4net 记录日志,主要分为以下几点:

    1.   引用 log4net.dll 程序集。

    2.   编写 log4net 的配置信息。

    3.   调用(记录日志)。

    4.   其他。

     

    1.   引用 log4net.dll 程序集(不多说很简单)

    1)   使用 NuGet 包管理器下载 log4net。下载成功后会包含 log4net.dll log4net.xml 文件。

    2)   或者在项目中手动引用 log4net.dll 程序集。

    3)   引入 log4net 命名空间。

     

    2.   编写 log4net 的配置信息

    1)   App.config Web.config 配置文件的根节点“<configuration>”中加入如下配置:

    1.   section 节点(注意:configSections 节点必须为 configuration 的第一个子节点

    <configSections>

      <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>

    </configSections>

     

    2.   log4net 节点

    <log4net>

      <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">

        <!--输出日志的编码方式(可以解决中文乱码)-->

        <param name="Encoding" value="utf-8" />

        <!--创建日志文件的方式-->

        <param name="RollingStyle" value="date"/>

        <!--日志文件存储在程序运行时目录的 Logs 文件夹中-->

        <param name="File" value="Logs"/>

        <!--日志文件名格式,例如:2017-08-14.log-->

        <param name="DatePattern" value="yyyy-MM-dd&quot;.log&quot;"/>

        <!--日志文件名是否为静态-->

        <param name="StaticLogFileName" value="false"/>

        <!--备份日志数量-->

        <param name="MaxSizeRollBackups" value="10"/>

        <!--是否是向文件中追加日志-->

        <param name="AppendToFile" value="true"/>

        <!--日志信息排版模式-->

        <layout type="log4net.Layout.PatternLayout">

          <param name="ConversionPattern" value="%n%-6p%d{yyyy-MM-dd HH:mm:ss:fff}%n消息:%m%n位置:%l%n"/>

        </layout>

      </appender>

      <!--注意:该节点不能少-->

      <root name="logerror">  <!--日志类的名字-->

        <level value="all" /> <!--定义记录的日志级别-->

        <appender-ref ref="RollingLogFileAppender"/>  <!--记录到什么介质中-->

      </root>

    </log4net>

     

    3.   参数节点解释

    1)   RollingStyle:创建日志文件的方式,可选值:

    1.   date:按日期。

    2.   composite:按日期及文件大小,默认值。

    3.   size:按文件大小。

    4.   once:每启动一次创建一个新文件。

    2)   File:日志文件夹目录或名称。当 RollingStyle date composite 时,设置日志存储目录;否则,设置目录+文件名,已经扩展支持虚拟目录。

    3)   DatePattern:日志文件名的日期格式,只有当 RollingStyle date/composite 时有效。

    4)   StaticLogFileName:日志文件名是否为静态。true/fasle,默认为 true。为 true 时,RollingStylerdate值将无效,这时需要设置 File 的文件名。

    5)   MaximumFileSize:当RollingStyleComposite Size 时,设置最大文件大小,可选值:BKBMBGB,默认为字节。例如:10MB

    6)   MaxSizeRollBackups备份日志数量,默认为0。在CountDirection为负数时有效。

    7)   CountDirection默认值为-1。当文件超过MaximumFileSize的大小时,如果要创建新的文件来存储日志,会根据CountDirection的值来重命名文件。大于-1的值时,File设置的文件名会依次加上012递增。当等于或小于-1时,创建依赖于MaxSizeRollBackups参数值。

    8)   AppendToFile:当日志文件存在时,是否向日志文件中追加内容。true/fasle,默认为 true

    9)   Threshold起始日志级别,低于此级别的日志不会被记录。

     

    4.   conversionPattern 节点解释

    Ø  下面是 conversionPattern 节点的解释,注意区分大小写。

    1)   %newline, %n          换行。

    2)   %数字,%-数字:         表示该项的固定长度。长度不足时:“%数字”在前面填充空格,“%-数字”则在后面填充空格。

    3)   %username             登录用户名,例如:LCLGOGOO

    4)   %property, %P, %X     机器名及登录用户名:{log4net:Identity=, log4net:UserName=LCLGOGOO, log4net:HostName=LCLGO}

    5)   %thread, %t           线程Id

    6)   %date, %d             日期,格式化:%d{yyyy-MM-dd HH:mm:ss:fff}

    7)   %level, %p            消息等级(INFODEBUGWARNERRORFATAL)。

    8)   %message, %m          消息内容。

    9)   %type, %class, %C     记录日志的 Class 名称。

    10)  %method, %M           记录日志的方法名,例如:Method1

    11)  %location, %l         日志记录位置,例如:Log4netTest.MyLog4net.Method1(f:Log4netTestMyLog4net.cs:42)

    12)  %line, %L             语句所在行号,例如:42

    13)  %file, %F             日志所在 class 文件绝对路径,例如:f:Log4netTestMyLog4net.cs

    14)  %logger, %c           Logger 名称。

    15)  %timestamp, %r        程序从运行到执行到当前语句时消耗的毫秒数。

    16)  %x                    输出:(null)

    17)  %exception            异常信息。

    18)  %property{Operator}   操作者ID

    19)  %property{Action}     操作类型。

    20)  %property{Message}    消息描述。

    21)  %property{NDC}        输出:(null)

    2)   也可以单独为 log4net 创建一个配置文件,命名为“log4net.config”,同样加入同上的配置信息。

    3)   注意:在 App.config Web.config 中设置了配置,如果又在 log4net.config 中也设置了配置,则加载 App.config Web.config 中的配置。

     

    3.   其他配置方式(可参考)

    <log4net>

      <root>

        <!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->

        <!--比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录-->

        <!--如果没有定义LEVEL的值,则缺省为DEBUG-->

        <level value="ERROR"/>

        <appender-ref ref="RollingFileAppender"/>

      </root>

      <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">

        <!--日志文件名开头-->

        <file value="c:LogTestLog4net.TXT"/>

        <!--多线程时采用最小锁定-->

        <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>

        <!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置-->

        <datePattern value="(yyyyMMdd)"/>

        <!--是否追加到文件,默认为true,通常无需设置-->

        <appendToFile value="true"/>

        <!--变换的形式为日期,这种情况下每天只有一个日志-->

        <!--此时MaxSizeRollBackupsmaximumFileSize的节点设置没有意义-->

        <!--<rollingStyle value="Date"/>-->

        <!--变换的形式为日志大小-->

        <!--这种情况下MaxSizeRollBackupsmaximumFileSize的节点设置才有意义-->

        <RollingStyle value="Size"/>

        <!--每天记录的日志文件个数,与maximumFileSize配合使用-->

        <MaxSizeRollBackups value="10"/>

        <!--每个日志文件的最大大小-->

        <!--可用的单位:KB|MB|GB-->

        <!--不要使用小数,否则会一直写入当前日志-->

        <maximumFileSize value="2MB"/>

        <!--日志格式-->

        <layout type="log4net.Layout.PatternLayout">

          <conversionPattern value="%date [%t]%-5p %c - %m%n"/>

        </layout>

      </appender>

    </log4net>

     

    4.   调用(记录日志)

    1)   首先,需要加载配置文件,有两种方式:

    1.   在程序入口的命名空间头部添加程序集特性,例如:

    [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

    namespace Log4netTest

    { }

    注:

    1)   省略 ConfigFile 属性时,则加载 App.config Web.config 的配置。

    2)   该定义之后,其他程序集同样可以输出日志。

     

    2.   代码加载

    1)   加载 App.config Web.config 中的配置:

    log4net.Config.XmlConfigurator.Configure();

    2)   加载 log4net.config 文件中的配置:

    var configFile = new FileInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net.config"));

    log4net.Config.XmlConfigurator.ConfigureAndWatch(configFile);

    3)   加载配置位置:

    1.   控制台应用程序、WinForm,可在 Main() 方法中调用。

    2.   WebFormMVCWeb API,可在 Global.asax Application_Start() 方法中调用。

     

    3.   注意:如果使log4net.config 文件中的配置,记得将该文件的复制到输出目录的属性设置为始终复制 或 如果较新则赋值。

     

    2)   记录日志

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading;

    using log4net;

     

    [assembly: log4net.Config.XmlConfigurator(Watch = true)]

    namespace Log4netTest

    {

        class Program

        {

            static void Main(string[] args)

            {

                Log4netTest2.MyLog4net myLog4net1 = new Log4netTest2.MyLog4net();

                myLog4net1.Method1();

                Console.ReadLine();

            }

        }

    }

     

    namespace Log4netTest2

    {

        /// <summary>

        /// Log4net 测试类。

        /// </summary>

        public class MyLog4net

        {

            /*

             * 步骤:

             * 1. 使用 NuGet 安装 log4net

             * 2. 将配置信息加入 Web.config/App.config 中,

             *    或另外添加 log4net.config 配置文件(注意:设置该文件属性的“复制到输出目录”为“始终复制”)。

             * 3. 调用。

             */

     

            /// <summary>

            /// 根据类名获取日志记录器对象。

            /// </summary>

            private static ILog Logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

     

            public static void InitLog4Net()

            {

                //log4net.Config.XmlConfigurator.Configure();

     

                //var configFile = new FileInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net.config"));

                //log4net.Config.XmlConfigurator.ConfigureAndWatch(configFile);

            }

     

            /// <summary>

            /// 测试方法1

            /// </summary>

            public void Method1()

            {

                InitLog4Net();

     

                Logger.Info("这是 Info() 方法,用于记录【消息】。");

                Logger.Debug("这是 Debug() 方法,用于记录【调试】消息。");

                Logger.Warn("这是 Warn() 方法,用于记录【警告】消息。");

                Logger.Error("这是 Error() 方法,用于记录【异常】消息。");

                Logger.Fatal("这是 Fatal() 方法,用于记录【严重错误】消息。");

     

                //Logger.Info(new Exception("这是 Info() 方法。【消息】"));

                //Logger.Debug(new Exception("这是 Debug() 方法。【调试】"));

                //Logger.Warn(new Exception("这是 Warn() 方法。【警告】"));

                //Logger.Error(new Exception("这是 Error() 方法。【异常】"));

                //Logger.Fatal(new Exception("这是 Fatal() 方法。【严重错误】"));

     

                try

                {

                    string str = null;

                    str = str.ToString();

                }

                catch (Exception ex)

                {

                    Logger.Info(ex);

                }

     

                try

                {

                    Method2();

                }

                catch (Exception ex)

                {

                    Logger.Error(ex);

                }

            }

     

            /// <summary>

            /// 方法2

            /// </summary>

            public static void Method2()

            {

                throw new Exception("方法2 抛出自定义异常");

            }

        }

    }

     

    3)   执行以上代码,将输出如下日志:

    clip_image001[1]

    clip_image003[1]

     

    5.   其他

    1)   除了以上给出的“日志信息排版模式”,例如:%d。其实,还可扩展自定义的排版模式,有兴趣的童鞋可以研究下,参考:http://www.cnblogs.com/cxd4321/archive/2012/07/21/2602378.html

    2)   如果希望将日志写入到数据库中,也是可以的。本文也没去尝试,有兴趣的话可参考:http://blog.csdn.net/kongwei521/article/details/52242319

    3)   其他参考链接:

    http://www.cnblogs.com/kissazi2/p/3392605.html

    http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html

     

    Ø  总结

    对于 log4net,本人也只是初次接触(在实际的项目中使用到),以前也只是有点了解(只知道有这个组件)。因为要掌握它,就必须熟悉不少配置属性,所以特意整理下,方便日后忘记了查看。有好的建议或意见的朋友,欢迎提出,共同学习嘛^_^。好了,休息了。。。

  • 相关阅读:
    Nginx 禁止IP访问
    Nginx服务优化详解
    adb不响应
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
    【翻译】Android避免内存泄露(Activity的context 与Context.getApplicationContext)
    内存泄露情况
    AndroidManifest笔记
    RecyclerView设置verticalSapcing等
    Fragment回调顺序及getActivity()为NullPointerException解决方法
    git tag
  • 原文地址:https://www.cnblogs.com/abeam/p/7360985.html
Copyright © 2020-2023  润新知