使用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提供記錄日志的時間、線程、級別等...功能強大,有興趣的園友可以深入研究一下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM