1. 程式人生 > >Log4net系列一:Log4net搭建之文字格式輸出

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

Log4net簡介

前言

專案開發中,記錄專案日誌是必須的,如果非要說日誌的重要性(日誌可看做,飛機的黑匣子,或者汽車的行車記錄儀),根據等級進行記錄,方便我們排查相關問題,以後專案運維中,也方便很多。基本上我們進入一家公司,開發你從事什麼崗位,公司產品或專案的框架都已經搭建好,我們有時候進行改版,根據業務延伸框架,記錄日誌基本都是我們自己去呼叫封裝的方法。今天我們就對Log4net進行一下學習,Log4net可以做到:1、郵箱傳送日誌;2、記錄到資料庫;3、生成記事本檔案。本章Log4net學習,以為是後面,我會簡單一個微服務框架做準備。今天我們主要對郵箱傳送日誌,生產記事本檔案兩種方式研究。後期有時間我們在研究儲存到資料庫。

Log4net配置

 開發環境:VS2013  ,建立一個WebAPI 模擬專案場景去解析Log4Net

建立WebAPI步驟我們就做簡述說明,下面框架目錄,今天我們主要配置Log4net進行解析,所以只需要關注WebAPI 和WebAPICommon 就行,這裡別忘記了三層之間的引用,WebAPI需要引用WebAPICommon 類庫

 第一步,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 文章,請原諒博主成為一個無恥的文件搬運工!
  • 小弟剛邁入部落格編寫,文中如有不對,歡迎用板磚扶正,希望給你有所幫助。