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

來源:互聯網
上載者:User

標籤:pat   ase   erro   靜態   程式出錯   pen   注意   targe   編寫   

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

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.