• 记录日志框架:log4net使用


    一、log4net简介

    Log4net是Apache下一个开放源码的项目,我们可以控制日志信息的输出目的地。
    Log4net中定义了多种日志信息输出模式。
    在做项目的时候最头疼的是在程序发布到正式环境之后出现了问题,我们不能调试而且问题很难找到,于是我们需要大量的日志数据来精确的跟踪程序的运行状态。
    Log4net可以帮我们来解决这一个难题,对于日志的输出我们不需要人为的去干涉,它可以根据需要将日志输出到控制台、文本文件、Windows日志事件查看器、数据库、邮件等位置,以便我们快速跟踪程序bug。

    二、log4net结构
    log4net主要分为5个核心组件:Logger、APPender、Filter、Layout、Object Render。

    1、Logger:
       主要用于记录日志的分类和控制日志的级别。它可以以多种格式输出日志信息,同时它也可以控制日志的输出级别。
    2、APPender:
       这里我们简单称之为“附着器”,意思就是说日志的输出必须依赖于它,更确切的说以文本形式输出,还是控制台格式输出都必须要依靠它来控制。log4net定义了多种附着器:
    (1)AdoNetAppender:将日志记录到数据库中,可以采用SQL和存储过程两种方式。
    (2)FileAppender:将日志写到文件中。
    (3)MemoryAppender:将日志存到内存缓冲区。
    (4)ConsoleAppender:将日志输出到控制台。
    (5)EventLogAppender:将日志写到Windows Event Log中。
    (6)ANSIColorTerminalAppender:在ANSI窗口终端写下高亮度的日志事件。
    (7)ASPNetTraceAppender:能用asp.net中Trace的方式查看记录的日志。
    (8)BufferingForwardingAppender:在输出到Appenders之前先缓存日志事件。
    (9)RollingFileAppender:将日志以回滚文件的形式写到文件中。
    (10)SmtpAppender:将日志写到邮件中。
    3、Filter:
      Appender是将日志以缺省值的方式输出,意思就是按照默认值的方式输出。而Filter意思是过滤器,使用Filter可以将日志以不同的格式来输出。
    4、Layout:
      这个用于控制日志输出显示格式。
    5、Object Render
      用于按照用户自定义标准来输出日志。

    三、Log4net参数:针对Layout设置日志输出的格式
    1.%m(message):输出的日志消息
    2.%n(new line):换行
    3.%d(datetime):输出当前语句运行的时刻
    4.%r(runtime):输出程序从运行到当前语句时消耗的毫秒数
    5.%t(thread id):当前语句所在线程的ID
    6.%p(priority):日志的当前优先级
    7.%c(Class):当前日志对象的名称
    8.%f(file):输出语句所在的文件名
    9.%l(line):输出语句所在的行号
    10.%数字:表示该项的最小宽度,如果不够,则用空格填充。

    例如:"[时间]:%d%n[级别]:%p%n[内容]:%m%n%n"
    [时间]:2016-10-28 10:21:38,634
    [级别]:INFO
    [内容]:>>>>>>>>>>>

    四、Log4net日志分类

    Log4net 分为如下几个级别:
    FATAL 毁灭级别
    ERROR 错误级别
    WARA  警告级别
    INFO  消息级别
    DEBUG 调试级别
    这几种日志级别高低:FATAL>ERROR>WARA>INFO>DEBUG。
    只有日志输出级别大于或等于配置的级别才能输出日志信息。
    比如我的日志配置级别为INFO,那么只有log.info(),log.warm(),log.Error(),log.Fatal()才能输出日志信息,Debug方式就不能输出。
    Log4net中还有两种特殊的配置级别:ALL -允许所有的日志级别输出,OFF - 拒绝所有的日志级别输出。

    五、在配置中启用和关闭日志
    在config文件中可以很方便地关闭和启用日志,就是在<root>进行配置,如下就是一个例子:

     1 <root>
     2       <!--设置日志输出级别-->
     3       <level value="INFO"></level>
     4       <!--以文件的形式记录日志-->
     5       <appender-ref ref="RollingLogFileAppender"></appender-ref>
     6       <!--以控制台的形式记录日志-->
     7       <appender-ref ref="ConsoleAppender"></appender-ref>
     8       <!--以数据库的形式记录日志-->
     9       <appender-ref ref="AdoNetAppender"></appender-ref>
    10 </root>

    在上面的例子中可以看出,如果想增加日志输出目的地,增加<appender-ref>节点就是了,注意后面的ref是在config中配置的appender name,如果想要取消,删除或者注释掉这行就可以了。

    六、log4net使用

    1、引用log4net.dll文件

    使用log4net必须引入log4net.dll文件,两种下载log4net.dll的方式:

    (1)、在Nuget中下载log4net

    点击"安装"进行安装

    (2)、在官网下载

    官网网址:http://logging.apache.org/log4net/

    下载DLL文件,解压之后根据.NET FRAMEWORK的版本,选择对应的DLL文件,文件路径:C:UsersLenovoDesktoplog4net-2.0.7-bin-newkeylog4net-2.0.7in et4.5 elease。

    引用->添加引用,将下载的log4net.dll文件添加进来。

    2、在config文件中的配置

    首先要添加config文件,在类库项目、命令行程序及WinForm中添加的是app.config,在WebForm中添加的是web.config。或者新添加一个"应用程序配置文件",将配置信息添加在新的配置文件中,在本示例中,将配置信息添加在新的应用程序配置文件中。新的配置文件命名为:log4net.config。

    注意:要将log4net.config的属性“复制到输出目录”设置为“始终复制”。在log4net上右键选择文件属性,修改属性

    要使用log4net,首先要在config文件的<configSections>节点中增加配置(如果没有这个节点请手动增加),如下:

    1 <configSections>
    2     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
    3 </configSections>

    除此之外,还要在顶级节点<configuration>下增加<log4net>子节点。在<log4net>节点下就可以增加<appender>子节点,每个<appender>子节点代表一种记录日志的方式。

    在使用日志的类的命名空间前加上XmlConfiguratorAttribute标记

    不加这个标记的话则log无法生效,如果类较多则比较麻烦,此时可以把这个配置放在AssemblyInfo.cs中,针对整个程序集生效。

    (3)、示例程序

    配置文件:

      1 <?xml version="1.0" encoding="utf-8" ?>
      2 <configuration>
      3 
      4   <configSections>
      5     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
      6   </configSections>
      7   <log4net>
      8     <!--把日志信息输出到文件里-->
      9     <!-- 日志文件部分log输出格式的设定 -->
     10     <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
     11       <!--日志文件名开头-->
     12       <file value="Logs/Log_"/>
     13       <!--多线程时采用最小锁定-->
     14       <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
     15       <!--是否追加到文件,默认为true,通常无需设置-->
     16       <appendToFile value="true"/>
     17       <!--设置动态文件名-->
     18       <StaticLogFileName value="false"/>
     19       <!--变换的形式为日期,这种情况下每天只有一个日志-->
     20       <!--此时MaxSizeRollBackups和maximumFileSize的节点设置没有意义-->
     21       <!--<rollingStyle value="Date"/>-->
     22       <!--变换的形式为日志大小-->
     23       <!--这种情况下MaxSizeRollBackups和maximumFileSize的节点设置才有意义-->
     24       <RollingStyle value="Composite"/>
     25       <!--日期的格式 (yyyyMMdd),每天换一个文件记录,如不设置则永远只记录一天的日志,需设置-->
     26       <datePattern value="yyyy_MM_dd&quot;.log&quot;"/>
     27       <!--每天记录的日志文件个数,与maximumFileSize配合使用-->
     28       <MaxSizeRollBackups value="100"/>
     29       <!--每个日志文件的最大大小;可用的单位:KB|MB|GB;不要使用小数,否则会一直写入当前日志-->
     30       <maximumFileSize value="8MB"/>
     31       <!--日志格式-->
     32       <layout type="log4net.Layout.PatternLayout">
     33         <header value="------------------------------------------------------------"/>
     34         <ConversionPattern value="★★★★★★%newline%date [%thread] %-5level %logger [%ndc] - %newline%message%newline" />
     35       </layout>
     36     </appender>
     37     <!--记录日志到数据库-->
     38     <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
     39       <!--缓存:当日志达到一定的数量,在往数据库里面保存,减少数据库压力-->
     40       <bufferSize value="1"/>
     41       <!--引用的动态链接库-->
     42       <connectionType value="System.Data.SqlClient.SqlConnection,System.Data,Version=1.0.3300.0,Culture=neutral,PublicKeyToKen=b77a5c561934e089"/>
     43       <!--数据库连接字符串-->
     44       <connectionString value="Data Source=JIANGXIAOLIANG;Initial Catalog=NightCat;Integrated Security=True"/>
     45       <!--插入数据库表的SQL语句-->
     46       <commandText value="INSERT INTO [dbo].[Sys_Log]([Date],[Thread] ,[Leval],[Logger],[Message],[Exception]) VALUES (@Date ,@Thread,@Leval ,@Logger ,@Message,@Exception)"/>
     47       <!--参数-->
     48       <parameter>
     49         <parameterName value="@Date"/>
     50         <dbType value="DateTime"/>
     51         <layout type="log4net.Layout.RawTimeStampLayout"/>
     52       </parameter>
     53       <parameter>
     54         <parameterName value="@Thread"/>
     55         <dbType value="String"/>
     56         <size value="255"></size>
     57         <layout type="log4net.Layout.PatternLayout">
     58           <conversionPattern value="%thread"/>
     59         </layout>
     60       </parameter>
     61       <parameter>
     62         <parameterName value="@Leval"/>
     63         <dbType value="String"/>
     64         <size value="255"></size>
     65         <layout type="log4net.Layout.PatternLayout">
     66           <conversionPattern value="%leval"/>
     67         </layout>
     68       </parameter>
     69       <parameter>
     70         <parameterName value="@Logger"/>
     71         <dbType value="String"/>
     72         <size value="255"></size>
     73         <layout type="log4net.Layout.PatternLayout">
     74           <conversionPattern value="%thread"/>
     75         </layout>
     76       </parameter>
     77       <parameter>
     78         <parameterName value="@Message"/>
     79         <dbType value="String"/>
     80         <size value="255"></size>
     81         <layout type="log4net.Layout.PatternLayout">
     82           <conversionPattern value="%thread"/>
     83         </layout>
     84       </parameter>
     85       <parameter>
     86         <parameterName value="@Exception"/>
     87         <dbType value="String"/>
     88         <size value="255"></size>
     89         <layout type="log4net.Layout.ExceptionLayout"/>
     90       </parameter>
     91     </appender>
     92     <!--把日志信息输出到控制台-->
     93     <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
     94       <!--日志在日志文件中的布局格式-->
     95       <layout type="log4net.Layout.PatternLayout">
     96         <header value="------------------------------------------------------------"/>
     97         <ConversionPattern value="[时间]:%d%n[级别]:%p%n[内容]:%m%n%n" />
     98       </layout>
     99     </appender>
    100     <root>
    101       <!--设置日志输出级别-->
    102       <level value="INFO"></level>
    103       <!--以文件的形式记录日志-->
    104       <appender-ref ref="RollingLogFileAppender"></appender-ref>
    105       <!--以控制台的形式记录日志-->
    106       <appender-ref ref="ConsoleAppender"></appender-ref>
    107       <!--以数据库的形式记录日志-->
    108       <appender-ref ref="AdoNetAppender"></appender-ref>
    109     </root>
    110   </log4net>
    111   <startup>
    112     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    113   </startup>
    114 </configuration>

    在程序中使用log4net记录日志:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 using log4net;
     7 
     8 namespace Log4netDemo
     9 {
    10     class Program
    11     {        
    12         static void Main(string[] args)
    13         {
    14             //创建文件对象
    15             ILog log = LogManager.GetLogger("log4netDemo");
    16             //开启配置
    17             log4net.Config.XmlConfigurator.Configure();
    18             log.Debug("我是Debug");
    19             log.Info("我是Info");
    20             log.Error("我是Error");
    21 
    22             Console.ReadKey();
    23         }
    24     }
    25 }

    输出结果(以控制台为例):

    在config文件中设置的日志输出级别是INFO,而Debug的级别小于INFO,所以只输出Info和Error。

    在WebForm中也可以使用Log4net,如果是web项目,需要在global.asax的Application_Start方法中配置web.config的引用,log4net.Config.XmlConfigurator.Configure();   

  • 相关阅读:
    ios tablevie 圆角
    IOS window(窗口)、视图(view)frame的学习
    iOS 测试用代码
    自定义导航条UINavigationbar
    前端正则表达式书写以及常用的方法
    JavaScript中的类、原型、原型链、继承(转载)
    简单详细讲解js闭包(转载)
    前端中的事件循环eventloop机制(转载)
    CSS优化技巧,可缩短页面加载时间(转载)
    程序员如何快速提高编程能力?快来看大牛的方法(转)
  • 原文地址:https://www.cnblogs.com/dotnet261010/p/6274956.html
Copyright © 2020-2023  润新知