Log4net系列一:Log4net搭建之文本格式輸出

Log4net簡介

前言

項目開發中,記錄項目日誌是必須的,若是非要說日誌的重要性(日誌可看作,飛機的黑匣子,或者汽車的行車記錄儀),根據等級進行記錄,方便咱們排查相關問題,之後項目運維中,也方便不少。基本上咱們進入一家公司,開發你從事什麼崗位,公司產品或項目的框架都已經搭建好,咱們有時候進行改版,根據業務延伸框架,記錄日誌基本都是咱們本身去調用封裝的方法。今天咱們就對Log4net進行一下學習,Log4net能夠作到:一、郵箱發送日誌;二、記錄到數據庫;三、生成記事本文件。本章Log4net學習,覺得是後面,我會簡單一個微服務框架作準備。今天咱們主要對郵箱發送日誌,生產記事本文件兩種方式研究。後期有時間咱們在研究保存到數據庫。web

 

Log4net配置

 開發環境:VS2013  ,建立一個WebAPI 模擬項目場景去解析Log4Net數據庫

建立WebAPI步驟咱們就作簡述說明,下面框架目錄,今天咱們主要配置Log4net進行解析,因此只須要關注WebAPI 和WebAPICommon 就行,這裏別忘記了三層之間的引用,WebAPI須要引用WebAPICommon 類庫app

 

 第一步,WebAPI 和WebAPICommon 中用NuGet搜索Log4net添加:Log4net引用框架

 

第二部,咱們在WebAPI添加一個Log4net.config配置文件,它主要放咱們的日誌配置信息運維

第三部,在新建的Log4net.config配置文件中,添加日誌配置,這裏咱們作兩部分講解(文本格式,郵件發送),今天主要講解文本格式,郵箱配置咱們作單獨作模塊;異步

下面把ERROR 爲例,每行配置的具體解析:::微服務

 <log4net>
    <!--錯誤日誌:::記錄錯誤日誌-->
    <!--按日期分割日誌文件 一天一個-->
    <!-- appender 定義日誌輸出方式   將日誌以回滾文件的形式寫到文件中。-->
    <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
      <!--保存路徑:下面路徑項目啓動的時候自動在C盤中建立log、logError文件-->
      <file value="C:\\log\\LogError\\"/>
<!-- 若是想在本項目中添加路徑,那就直接去掉C:\\ 只設置log\\LogError 項目啓動中默認建立文件 --> <appendToFile value="true"/> <!--按照何種方式產生多個日誌文件(日期[Date],文件大小[Size],混合[Composite])--> <rollingStyle value="Date"/> <!--這是按日期產生文件夾--> <datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"/> <!--是否只寫到一個文件中--> <staticLogFileName value="false"/> <!--保留的log文件數量 超過此數量後 自動刪除以前的 好像只有在 按Size分割時有效 設定值value="-1"爲不限文件數--> <param name="MaxSizeRollBackups" value="100"/> <!--每一個文件的大小。只在混合方式與文件大小方式下使用。超出大小後在全部文件名後自動增長正整數從新命名,數字最大的最先寫入。可用的單位:KB|MB|GB。不要使用小數,不然會一直寫入當前日誌--> <maximumFileSize value="1GB" /> <!-- layout 控制Appender的輸出格式,也能夠是xml 一個Appender只能是一個layout--> <layout type="log4net.Layout.PatternLayout"> <!--每條日誌末尾的文字說明--> <!--輸出格式 模板--> <!-- <param name="ConversionPattern" value="記錄時間:%date 線程ID:[%thread] 日誌級別:%-5level 記錄類:%logger 操做者ID:%property{Operator} 操做類型:%property{Action}%n 當前機器名:%property%n當前機器名及登陸用戶:%username %n 記錄位置:%location%n 消息描述:%property{Message}%n 異常:%exception%n 消息:%message%newline%n%n" />--> <!--樣例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info--> <!--<conversionPattern value="%newline %n記錄時間:%date %n線程ID:[%thread] %n日誌級別: %-5level %n錯誤描述:%message%newline %n"/>--> <conversionPattern value="%n========== %n【日誌級別】%-5level %n【記錄時間】%date %n【線程編號】[%thread] %n【執行時間】[%r]毫秒 %n【出錯文件】%F %n【出錯行號】%L %n【出錯的類】%logger 屬性[%property{NDC}] %n【錯誤描述】%message %n【錯誤詳情】%newline"/> </layout> </appender> <!--Error日誌::: 錯誤日誌--> <logger name="logerror"> <level value="ERROR" /> <appender-ref ref="ErrorAppender" /> </logger> </log4net>

第四部: 在WebAPICommon類庫中添加LogHelper類,該類就是獲取配置類的配置,傳送錯誤信息,能夠直接複用;性能

[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "log4net", Watch = true)]
namespace WebAPICommon
{
//日誌的公共幫助類
public class LogHelper { #region /// <summary> /// /// </summary> /// <param name="msg"></param> public static void ErrorLog(object msg) { log4net.ILog log = log4net.LogManager.GetLogger("logerror"); Task.Run(() => log.Error(msg)); //異步 // Task.Factory.StartNew(() =>log.Error(msg));// 這種異步也能夠
//log.Error(msg); //這種也行跟你須要,性能越好,越強大,我仍是使用異步方式
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="ex"></param>
        public static void ErrorLog(Exception ex)
        {
            log4net.ILog log = log4net.LogManager.GetLogger("logerror");
            Task.Run(() => log.Error(ex.Message.ToString() + "/r/n" + ex.Source.ToString() + "/r/n" + ex.TargetSite.ToString() + "/r/n" + ex.StackTrace.ToString()));
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="msg"></param>
        /// <param name="ex"></param>
        public static void ErrorLog(object msg, Exception ex)
        {
            log4net.ILog log = log4net.LogManager.GetLogger("logerror");
            if (ex != null)
            {
                Task.Run(() => log.Error(msg, ex));   //異步
            }
            else
            {
                Task.Run(() => log.Error(msg));   //異步
            }
        }
        #endregion
    }
}

查看後臺代碼你會發現,以Error爲例有兩個方法,兩種方式傳參數,咱們上面的封裝也是根據咱們的業務需求,去擴展封裝學習

方法解析重點::  測試

 LogManager類,它用來管理全部的Logger.它的GetLogger靜態方法能夠獲取配置文件中的Logger        

  log4net.ILog log = log4net.LogManager.GetLogger("logerror");  
   //該方法也能夠寫公共的建立,而後直接使用

   //static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo");
   // static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror");

咱們介紹一下  文章中有一句話

[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "log4net", Watch = true)]咱們來解讀一下

首先咱們先說一下 log4net.Config.XmlConifguratorAttribute

XmlConfiguratorAttribute有3個屬性:
ConfigFile: 配置文件的名字,文件路徑相對於應用程序目錄(AppDomain.CurrentDomain.BaseDirectory)。ConfigFile屬性不能和ConfigFileExtension屬性一塊兒使用。
ConfigFileExtension: 配置文件的擴展名,文件路徑相對於應用程序的目錄。ConfigFileExtension屬性不能和ConfigFile屬性一塊兒使用。
Watch: 若是將Watch屬性設置爲true,就會監視配置文件。當配置文件發生變化的時候,就會從新加載。
若是ConfigFile和ConfigFileExtension都沒有設置,則使用應用程序的配置文件App.config(Web.config)。

能夠在項目的AssemblyInfo.cs文件裏添加如下的語句,根據配置業務項目中配置不一樣,能夠直接複製粘貼:

 //監視默認的配置文件,App.exe.config   

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

//監視配置文件,App.exe.log4net。

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

//使用配置文件log4net.config,不監視改變。注意log4net.config文件的目錄,BS程序在站點目錄//下,CS則在應用程序啓動目錄下,如調試時在/bin/Debug下,通常將文件屬性的文件輸出目錄調爲//始終複製便可

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

//使用配置文件log4net.config,不監視改變

[assembly: log4net. Config.XmlConfigurator()]

第五部:咱們才用的WebAPI測試,還須要啓動項目日誌

在WebAPI中找到:Global文件

Global.asax 文件是 ASP.NET 應用程序的中心點。它提供無數的事件來處理不一樣的應用程序級任務,好比用戶身份驗證、應用程序啓動以及處理用戶會話等。你應該熟悉這個可選文件,這樣就能夠構建出健壯的ASP.NET 應用程序。

  protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

//啓動項日誌記錄 //若不想把lognet配置文件寫在web.config中,也能夠另外手動指定。 log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(Server.MapPath("/log4net.config"))); } /// <summary> /// 程序出錯時經過lognet寫日誌 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Application_Error(Object sender, EventArgs e) { Exception objExp = HttpContext.Current.Server.GetLastError(); LogHelper.ErrorLog("\r\n客戶機IP:" + Request.UserHostAddress + "\r\n錯誤地址:" + Request.Url + "\r\n異常信息:" + Server.GetLastError().Message, objExp); }
方法解析: Application_Error,該方法我我的建議添加,若是你的項目其中過程就報錯,咱們能夠捕捉到異常信息。

最後一步:咱們進行測試,在你須要的地方,引用WebAPICommon類庫,
在你須要的地方加入
LogHelper.ErrorLog(object);
 
public bool Add(Department department)
        {
            try
            {
                return dep.Add(department);
            }
            catch (Exception ex)
            {
                LogHelper.ErrorLog(ex);  //在你須要的地方  加入 LogHelper.ErrorLog(ex)
throw;
 } }
 查看結果:C盤默認建立我配置的文件,

 

按照:::年----月-----建立

 

 文本記錄顯示:就是咱們在配置文件中自行定義,

 

 Log4net 記事本日誌記錄,到如今已經結束了,新手上路,若是有描述不正確的地方,還請多多指教!!!
下一篇:咱們主要介紹Log4net中郵箱發送日誌文件,正在熬夜開車中。。。。。
 
  • 博主是利用讀書、參考、引用、抄襲、複製和粘貼等多種方式打形成本身的純鍍 24k 文章,請原諒博主成爲一個無恥的文檔搬運工!
  • 小弟剛邁入博客編寫,文中若有不對,歡迎用板磚扶正,但願給你有所幫助。
相關文章
相關標籤/搜索