• Log4Net异常日志记录在asp.net mvc3.0的应用


    前言

    log4net是.Net下一个非常优秀的开源日志记录组件。log4net记录日志的功能非常强大。它可以将日志分不同的等级,以不同的格式,输出到不同的媒介。本文主要是简单的介绍如何在Visual Studio2010(Asp.Net Mvc3.0)中使用log4net快速创建系统日志,如何扩展以输出自定义字段。

    用户可以从http://logging.apache.org/log4net/下载log4net的源代码。解压软件包后,在解压的src目录下将log4net.sln载入Visual Studio .NET,编译后可以得到log4net.dll。用户要在自己的程序里加入日志功能,只需将log4net.dll引入工程即可。

    在项目中配置

     第一步:首先在项目中引用log4net.dll文件。

     第二步:在Web.config文件中进行添加configSections的节点

      <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
        <!--配置一个结点 名称为log4net-->
      </configSections>

    第三步:添加log4net配置节点

    <log4net debug="true">
    </log4net>

    然后在log4net节点下添加

    写入本地文本文件中的配置

             <appender name="LogFileAppender" type="log4net.Appender.FileAppender" >
                 <!--定义的是日志记录到文件的附着器 name表示该附着器的名称-->         
                 <!--在log4net中还有一个附着器RollingFileAppender 它表示会循环生成很多文件,举例来说,就是设置一共可以生成20个文件,每个文件的大小为2K,那么如果第一个、-->          
                 <!--文件的大小超过2K,就会自动创建一个按顺序命名的文件-->
                 <param name="File" value="c:\Log\DBLog.txt" /> <!--日志记录的存在路径-->
                 <param name="AppendToFile" value="true" /><!--为true就表示日志会附加到文件,为false,则会重新创建一个新文件-->
                 <layout type="log4net.Layout.PatternLayout">
                   <!--输出内容控制-->
                   <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
                 </layout>     
             </appender>


    注释很清楚,就不解释了。

    写入指定邮箱的配置

            <appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
            <!--设置发送电子邮件的附着器-->
                <authentication value="Basic" />
                <to value="455043818@qq.com" />
                <from value="aehyok@163.com" />
                <username value="帐号" />
                <password value="密码" />
                <subject value="程序异常日志记录邮件发送" />
                <smtpHost value="smtp.163.com" />
                <bufferSize value="512" />
                <lossy value="true" />
                <evaluator type="log4net.Core.LevelEvaluator">
                   <threshold value="debug"/>  
                </evaluator>
                <layout type="log4net.Layout.PatternLayout">
                     <conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline%newline" />    
                </layout>
            </appender>

    通过的是163邮箱服务器发送

    将日志写入数据库的相关配置,还要建立一张对应的数据库表

             <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
                 <!--存储到数据库的操作-->
                 <bufferSize value="10"/>
                 <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
                 <connectionString value="server=.;database=Log4Net;user id=sa;password=saa"/>
                 <commandText value="INSERT INTO _Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date,                                @log_thread, @log_level, @log_logger, @log_message, @log_exception)"/>
                 <parameter>
                     <parameterName value="@log_date"/>
                     <dbType value="DateTime"/>
                     <layout type="log4net.Layout.RawTimeStampLayout"/><!--可以认为是记录日志的时间-->
                 </parameter>
                 <parameter>
                     <parameterName value="@log_thread"/>
                     <dbType value="String"/>
                     <size value="255"/>
                     <layout type="log4net.Layout.PatternLayout">
                        <conversionPattern value="%thread"/><!--记录日志时的线程号--> 
                    </layout>  
                 </parameter>
                 <parameter>
                     <parameterName value="@log_level"/>
                     <dbType value="String"/>
                     <size value="50"/>
                     <layout type="log4net.Layout.PatternLayout">
                        <conversionPattern value="%level"/><!--日志级别-->
                     </layout>
                 </parameter>
                 <parameter>
                     <parameterName value="@log_logger"/>
                     <dbType value="String"/>
                     <size value="255"/>
                     <layout type="log4net.Layout.PatternLayout">
                         <conversionPattern value="%logger"/><!--哪个记录器存储的该日志-->
                     </layout>
                 </parameter>
                 <parameter>
                     <parameterName value="@log_message"/>
                     <dbType value="String"/>
                     <size value="4000"/>
                     <layout type="log4net.Layout.PatternLayout">
                         <conversionPattern value="%message"/><!--日志信息-->
                     </layout>
                 </parameter>
                 <parameter>
                     <parameterName value="@log_exception"/>
                     <dbType value="String"/>
                     <size value="255"/>
                     <layout type="log4net.Layout.ExceptionLayout"/><!--异常信息-->
                 </parameter>  
             </appender>

    另外一种写入文件的方式配置

             <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
                 <!--这个就是我在上面提到的RollingFileAppender-->
                 <file value="example.log" /><!--文件名称-->
                 <appendToFile value="false" /><!--会创建新文件,一般设置为true,这里设置为false,是为了看到创建的文件-->
                 <maximumFileSize value="1KB" /><!--文件大小-->
                 <maxSizeRollBackups value="20" /><!--创建最大文件数-->
                 <layout type="log4net.Layout.PatternLayout">
                    <conversionPattern value="%level %thread %logger - %message%newline" />
                 </layout>
             </appender>

    在log4net节点中还有两个节点

          <logger name="Loggering">
            <level value="Warn"/>
            <appender-ref ref="ADONetAppender"/>
          </logger>
          <root>
            <level value="info" />
              <!--<appender-ref ref="ADONetAppender" />-->
              <appender-ref ref="SmtpAppender"/>
              <!--<appender-ref ref="LogFileAppender"/>
              <appender-ref ref="ColoredConsoleAppender"/>
              <appender-ref ref="EventLogAppender"/>
              <append-ref ref="NetSendAppender"/>
              <appender-ref ref="RollingFile"/>-->
          </root>

    在框架的体系里,所有的日志对象都是根日志(root logger)的后代。 因此如果一个日志对象没有在配置文件里显式定义,则框架使用根日志中定义的属性。在<root>标签里,可以定义level级别值和Appender的列表。如果没有定义LEVEL的值,则缺省为DEBUG。可以通过<appender-ref>标签定义日志对象使用的Appender对象。<appender-ref>声明了在其他地方定义的Appender对象的一个引用。在一个logger对象中的设置会覆盖根日志的设置。而对Appender属性来说,子日志对象则会继承父日志对象的Appender列表。这种缺省的行为方式也可以通过显式地设定<logger>标签的additivity属性为false而改变。

    那么上面就会有数据库日志的写入和邮箱的写入

    在Global.asax文件初始化配置

            protected void Application_Start()
            {
                //读取日志  如果使用log4net,应用程序一开始的时候,都要进行初始化配置
                log4net.Config.XmlConfigurator.Configure();
                
                AreaRegistration.RegisterAllAreas();
    
                RegisterGlobalFilters(GlobalFilters.Filters);
                RegisterRoutes(RouteTable.Routes);
            }

    调用

            private static readonly log4net.ILog log = log4net.LogManager.GetLogger("Loggering");
            public ActionResult About()
            { 
                 log.Info("log日志信息");
                 log.Debug("debug信息");
                 log.Error("error信息");
                 log.Warn("warn信息");
                 Exception ex = new Exception("测试的异常信息");
                 log.Fatal("fatal信息", ex);
                return View();
            }

    运行一下

    总结

     
    Log4net中 DEBUG、INFO、WARN、ERROR 区分得很好。正常的 DEBUG、INFO 的日志, 就让它记录在 日志文件里面吧。

    对于 WARN、ERROR 级别的日志, 记录到日志文件的同时, 顺便发送电子邮件到我的信箱里面。 这样一来, 我也不必每天去看日志文件, 二来,出了什么问题, 能及时通过电子邮件得到通知。

     示例代码下载链接http://url.cn/Tz89RW

    数据库结构

    create database Log4Net
    go
    use Log4Net
    create table _log
    (
        id int identity(1,1) primary key not null,
        date datetime null,
        thread int null,
        level varchar(10) null,
        logger varchar(20) null,
        Message varchar(100) null,
        Exception varchar(100) null
    )

    还待优化,有空了再来琢磨琢磨。

  • 相关阅读:
    第二十九课 循环链表的实现
    第二十八课 再论智能指针(下)
    第二十七课 再论智能指针(上)
    第二十六课 典型问题分析(Bugfix)
    普通new和placement new的重载
    leetcode 581. Shortest Unsorted Continuous Subarray
    leetcode 605. Can Place Flowers
    leetcode 219. Contains Duplicate II
    leetcode 283. Move Zeroes
    leetcode 217. Contains Duplicate
  • 原文地址:https://www.cnblogs.com/aehyok/p/3066010.html
Copyright © 2020-2023  润新知