• Log4Net日志记录两种方式


     简介

         log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的工具。
         log4net是Apache软件基金会Apache Logging Services工程的一部分。Apache日志服务工程致力于为程序调试和审计提供跨语言的日志服务。(f:百度百科)

    原理

         Log4net是基于.NET开发的一款记录日志开源组件。它通过一套XML配置的日志引擎,将日志分不同的等级,分别是:FATAL 、 ERROR、 WARN、 INFO 、 DEBUG、ALL(允许所有的日志请求)和OFF(拒绝所有的日志请求),缺省为DEBUG,前五个是不是很熟悉?可以看到和我们平常在调试应用程序的出错有点类似,在编译器中也会留下如错误、警告之类的提示信息,它们的错误级别在不断的降低。

    log4net开源项目结构如图所示:

         通过查看源码,log4net主要有5个核心部分组成,分别为Logger,Appenders, Filters, Layouts 和Object Renders,在配置文件中它们以节点的形式出现。

    1.  Logger:主要负责日志的记录,它记录的方式有多种,可以是以文件、数据库、控制台、邮件等多处方式;
    2. Appenders:主要负责记录日志介质的方式,它的输出方式主要包括:
      • AdoNetAppender:将日志记录到数据库中。可以采用SQL和存储过程两种方式
      • AspNetTraceAppender:能用ASP.NET中跟踪的方式查看记录的日志。

      • BufferingForwardingAppender:在输出到子Appenders之前先缓存日志事件。

      • ColoredConsoleAppender:在终端的窗口写下高亮度的日志事件。
      • ConsoleAppender:将日志输出到控制台。
      • EventLogAppender:将日志写到Windows操作系统的日志中去。
      • FileAppender:将日志写到文件中。
      • ForwardingAppender:用来为一个Appender指定一组约束。
      • MemoryAppender:将日志存到内存缓冲区。
      • NetSendAppender:将日志输出到Windows Messenger service,这些日志信息将在用户终端的对话框中显示。
      • OutputDebugStringAppender:配置该Appender以向OutputDebugString API写入日志。
      • RemotingAppender:通过.NET Remoting将日志写到远程接收端。
      • RollingFileAppender:将日志以回滚文件的形式写到文件中。
      • SmtpAppender:将日志写到邮件中。
      • SmtpPickupDirAppender:配置与SmtpAppender类似,但要把SmtpHost换为PickupDir。
      • TraceAppender:将日志写到.NET trace 系统。
      • UdpAppender:将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播。

         以上有些输出方式可能会经常用到(比如写入文件和数据库的方式),有些可能会不经常用到(邮件方式等),具体我们在下面举例来说明。

        3.Layouts:主要负责把记录日志格式化输出,显示得格式主要如下:

            %timestamp [%thread] %-5level %logger{2} %ndc - %message%newline

      timestamp: 表示程序已经开始执行的时间。 单位[毫秒]。

      Thread:执行当前代码的线程。

      Level:日志的级别。

      Logger:日志相关请求的名称。

      Message:日志消息。

      newline:换行。

    案例一:文件记录方式

         首先引用Log4net.dll,然后在添加一个配置文件log4net.config(这里不将配置信息写入web.config,个人觉得写在一起实在太乱)中添加下面的配置信息(注意应和web.config处于相同的位置,即根目录下):

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <configuration>
     3   <!--日志配置部分-->
     4   <configSections>
     5     <!--注册lognet-->
     6     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
     7   </configSections>
     8   <log4net debug="false">
     9     <root>
    10       <priority value="ALL"/>
    11       <appender-ref ref="TraceAppender"/>
    12       <appender-ref ref="ConsoleAppender"/>
    13       <appender-ref ref="RollingFileAppender"/>
    14     </root>
    15     <appender name="TraceAppender" type="log4net.Appender.TraceAppender">
    16       <layout type="log4net.Layout.PatternLayout">
    17         <conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline"/>
    18       </layout>
    19     </appender>
    20     <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
    21       <layout type="log4net.Layout.PatternLayout">
    22         <conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline"/>
    23       </layout>
    24     </appender>
    25     <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
    26       <file value="LogSysLog"/>
    27       <!--日志文件夹及文件名开头-->
    28       <appendToFile value="true"/>
    29       <!--是否追加到文件-->
    30       <RollingStyle value="Date"/>
    31       <!--日期的格式-->
    32       <DatePattern value="yyyy-MM-dd"/>
    33       <!--文件名后面加上.log后缀,必须使用转义字符-->
    34       <maximumFileSize value="1MB" />
    35       <!--最大文件大小-->
    36       <StaticLogFileName value="false"/>
    37       <!--日志文件名是否为静态-->
    38       <layout type="log4net.Layout.PatternLayout,log4net">
    39         <param name="ConversionPattern" value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline"/>
    40         <param name="Header" value=" ------------------网站运行过程中产生的错误-------------------------- "/>
    41         <param name="Footer" value=" -----------------测试:GZQ------------------------------------- "/>
    42       </layout>
    43     </appender>
    44   </log4net>
    45   <!--End站点日志配置部分-->
    46 </configuration>
    View Code

          %d, %date :表示当然的时间
      %level : 表示日志的级别
      %logger, %c:表示日志产生的主题,通常是所在的类名,便于定位问题
      %m, %message :表示日志的具体内容
      %n, %newline: 换行

         在AssemblyInfo.cs中添加如下代码:

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

         在全局处理程序中添加如下代码:

    1         protected void Application_Start(object sender, EventArgs e)
    2         {
    3             log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config"));
    4         }

    测试

         在页面添加button和一个label,在button的单击事件中添加如下代码:

     1         protected void btnShowTime_Click(object sender, EventArgs e)
     2         {
     3             log4net.ILog myLogger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
     4             myLogger.Warn("这是一个警告日志");
     5             myLogger.Info("单击了按钮");
     6             myLogger.Debug("用Log4Net写入数据库日志");
     7             myLogger.Error("这是一个错误日志");
     8             myLogger.Fatal("这是一个致命的错误日志");
     9             try
    10             {
    11                 ILog logger = LogManager.GetLogger("LogRecord");
    12                 logger.Debug("用Log4Net写入数据库日志");
    13                 int x = 5;
    14                 int y = 0;
    15                 Response.Write(x / y);
    16             }
    17             catch (Exception ex)
    18             {
    19                 myLogger.Error(ex);
    20             }
    21             finally
    22             {
    23                 lblShow.Text = DateTime.Now.ToLongTimeString()+":操作日志已记录完成";
    24             }
    25         }
    View Code

    结果
     

    案例二:日志记入数据库

          记入数据库的方式和记入文件的方式大同小异,主要区别在配置文件,其他步骤相同,记入数据库的配置文件log4net.config如下:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <configuration>
     3   <configSections>
     4     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
     5   </configSections>
     6   <!--Log4net Begin-->
     7   <log4net>
     8     <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
     9       <bufferSize value="1" />
    10       <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    11       <connectionString value="SERVER=127.0.0.1;DATABASE=TestDataBase;UID=sa;PWD=123456;Connect Timeout=15;" />
    12       <commandText value="INSERT INTO ErrorLog ([dtDate],[sThread],[sLevel],[sLogger],[sMessage],[sException]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
    13       <parameter>
    14         <parameterName value="@log_date" />
    15         <dbType value="DateTime" />
    16         <layout type="log4net.Layout.RawTimeStampLayout" />
    17       </parameter>
    18       <parameter>
    19         <parameterName value="@thread" />
    20         <dbType value="String" />
    21         <size value="100" />
    22         <layout type="log4net.Layout.PatternLayout">
    23           <conversionPattern value="%t" />
    24         </layout>
    25       </parameter>
    26       <parameter>
    27         <parameterName value="@log_level" />
    28         <dbType value="String" />
    29         <size value="200" />
    30         <layout type="log4net.Layout.PatternLayout">
    31           <conversionPattern value="%p" />
    32         </layout>
    33       </parameter>
    34       <parameter>
    35         <parameterName value="@logger" />
    36         <dbType value="String" />
    37         <size value="500" />
    38         <layout type="log4net.Layout.PatternLayout">
    39           <conversionPattern value="%logger" />
    40         </layout>
    41       </parameter>
    42       <parameter>
    43         <parameterName value="@message" />
    44         <dbType value="String" />
    45         <size value="3000" />
    46         <layout type="log4net.Layout.PatternLayout">
    47           <conversionPattern value="%m" />
    48         </layout>
    49       </parameter>
    50       <parameter>
    51         <parameterName value="@exception" />
    52         <dbType value="String" />
    53         <size value="4000" />
    54         <layout type="log4net.Layout.ExceptionLayout" />
    55       </parameter>
    56     </appender>
    57     <!-- setup the root category, add the appenders and set the default level -->
    58     <root>
    59       <level value="WARN"/>
    60       <level value="INFO"/>
    61       <level value="DEBUG"/>
    62       <level value="FINE"/>
    63       <appender-ref ref="ADONetAppender" />
    64     </root>
    65     <!-- specify the level for some specific categories -->
    66     <logger name="iNotes">
    67       <level value="WARN"/>
    68       <level value="INFO"/>
    69       <level value="DEBUG"/>
    70       <level value="FINE"/>
    71       <appender-ref ref="ADONetAppender"/>
    72     </logger>
    73     <logger name="StellaLogger">
    74       <level value="ALL"/>
    75       <appender-ref ref="AdoNetAppender" />
    76     </logger>
    77   </log4net>
    78   <!--Log4net End-->
    79 </configuration>

         创建记录日志的数据表:

     1     CREATE TABLE [dbo].[ErrorLog](   
     2 
     3     [nId] [bigint] IDENTITY(1,1) NOT NULL,   
     4 
     5     [dtDate] [datetime] NOT NULL,   
     6 
     7     [sThread] [varchar](100) NOT NULL,   
     8 
     9     [sLevel] [varchar](200) NOT NULL,   
    10 
    11     [sLogger] [varchar](500) NOT NULL,   
    12 
    13     [sMessage] [varchar](3000) NOT NULL,   
    14 
    15     [sException] [varchar](4000) NULL)

    测试
         采用上面的测试方法。

    结果

         

    结语

         项目中经常用到的两种方式在这里做一下总结。其他方式,用到了再补上。

  • 相关阅读:
    poj3537--Crosses and Crosses
    poj3480--John
    poj2975--Nim
    poj2960 S-Nim
    poj2505-A multplication game
    Team Queue(POJ 2259)
    将caffemodel文件转换为Matlab可用的数据形式
    Invalid MEX-file: caffe.mexa64 的解决方案
    mongoDB-3.x启用认证
    mongoDB跨平台图形管理工具
  • 原文地址:https://www.cnblogs.com/wolf-sun/p/3347373.html
Copyright © 2020-2023  润新知