使用log4net做应用程序全局日志记录保存在数据库中

  几乎所有的大型应用都会有自己的用于跟踪调试的API。因为一旦程序被部署以后,就不太可能再利用专门的调试工具了。然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题。经验表明,日志记录往往是软件开发周期中的重要组成部分。它具有以下几个优点:它可以提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug;一旦在程序中加入了Log 输出代码,程序运行过程中就能生成并输出日志信息而无需人工干预。另外,日志信息可以输出到不同的地方(控制台,文件等)以备以后研究之用。

Log4net就是为这样一个目的设计的,用于.NET开发环境的日志记录包。

官方网站:http://logging.apache.org/log4net/

 

1、引用程序包

 

2、新增配置文件log4net.db.config,包含访问的数据库连接字符串,表名等配置信息

<log4net>
  <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
    <bufferSize value="1" />


    <connectionType
      value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <!--此为连接字符串,该处以SqlServer为例-->
    <connectionString value="server=.;uid=sa;pwd=Admin123;database=Log" />
    <!--此为数据库指令,也就是SQL的Insert语句-->
    <commandText
      value="INSERT INTO DDNoteLog ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
    <!--定义参数,数据库表字段、类型、长度-->
    <parameter>
      <parameterName value="@log_date" />
      <dbType value="DateTime" />
      <layout type="log4net.Layout.RawTimeStampLayout" />
    </parameter>
    <parameter>
      <parameterName value="@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="@logger" />
      <dbType value="String" />
      <size value="255" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%logger" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@message" />
      <dbType value="String" />
      <size value="4000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%message" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@exception" />
      <dbType value="String" />
      <size value="2000" />
      <layout type="log4net.Layout.ExceptionLayout" />
    </parameter>


  </appender>

  <root>
    <!-- Set this to "ERROR" before release -->
    <!--Highest: OFF->FATAL->RROR->WARN->INFO->DEBUG->ALL :Lowest -->
    <level value="ALL" />
    <appender-ref ref="AdoNetAppender" />
    <!-- <appender-ref ref="SmtpAppender" /> -->
    <!--<appender-ref ref="FileAppender" /> -->
  </root>
</log4net>

 

3、在Global.asax中让log4net读取配置文件信息

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace DDNote
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            ConfigLog4Net();
        }

        private void ConfigLog4Net()
        {
            var log4NetConfig = Server.MapPath("Config/log4net.db.config");
            if (File.Exists(log4NetConfig))
            {
                var configFile = new FileInfo(log4NetConfig);
                log4net.Config.XmlConfigurator.Configure(configFile);
            }
        }
    }
}

 

4、封装全局公共类--LogManager

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;

namespace DDNote.Common
{
    public class LogManager
    {
        /// <summary>
        /// 日志记录
        /// </summary>
        /// <param name="key">要记录的键</param>
        /// <param name="value">要记录的值</param>
        public static void LogInfo(string key, string value)
        {
            MethodBase method = new System.Diagnostics.StackTrace().GetFrame(1).GetMethod();
            //调用日志的类名
            String className = method.ReflectedType.FullName;
            //调用日志的方法名
            String methodName = method.Name;
            //记录日志
            log4net.ILog log = log4net.LogManager.GetLogger(className);
            log.Info(methodName + "//" + key + "//" + value);
        }
    }
}

 

5、方法调用

                string userName = Request.Form["UserName"];
                string passWord = Request.Form["PassWord"];
                LogManager.LogInfo("username", userName);
                LogManager.LogInfo("password", passWord);

 

6、数据库保存的日志信息

log4net提供记录日志的时间、线程、级别等...功能强大,有兴趣的园友可以深入研究一下。

posted @ 2016-11-09 16:56  和顺信  阅读(1370)  评论(2编辑  收藏  举报