Winform學習之隨筆一:Log4net

来源:https://www.cnblogs.com/fengxiaojiu/archive/2018/07/12/9300837.html
-Advertisement-
Play Games

前提題要:因為我最近負責的Winform項目,好多都用到了這個log4net的日誌功能,開發程式對數據一般都要求做到雁過留痕,所以日誌對於我們程式員是不可或缺。因此我把對log4net的使用做一個記錄總結,以便於以後的使用記憶。l 一、概述 log4net是.Net下一個非常優秀的開源日誌記錄組件。 ...


前提題要:因為我最近負責的Winform項目,好多都用到了這個log4net的日誌功能,開發程式對數據一般都要求做到雁過留痕,所以日誌對於我們程式員是不可或缺。因此我把對log4net的使用做一個記錄總結,以便於以後的使用記憶。l

一、概述

       log4net是.Net下一個非常優秀的開源日誌記錄組件。 他是apache組織下麵的一個工程,詳見Apache介紹:https://baike.baidu.com/item/Apache軟體基金會/2912769?fr=aladdin,   log4net記錄日誌的功能非常強大。它可以將日誌分不同的等級,以不同的格式,輸出到不同的媒介。

二、一個小的案例實現過程

    第一步、在項目中添加對log4net的引用,如果沒有的話,可以手動在NuGet包裡面尋找下載添加

    第二步、設置配置文件

這個是我的winfrom裡面的配置,供參考

 1  <configSections>
 2     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
 3   </configSections>
 4   <startup useLegacyV2RuntimeActivationPolicy="true">
 5     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
 6   </startup>
 7 
 8   <log4net>
 9     <root>
10       <level value="WARN" />
11       <appender-ref ref="LogFileAppender" />
12       <appender-ref ref="ConsoleAppender" />
13     </root>
14     <logger name="Logging">
15       <level value="DEBUG" />
16     </logger>
17     <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
18       <file value="Logs/" />
19       <appendToFile value="true" />
20       <rollingStyle value="Date" />
21       <datePattern value="yyyy-MM-dd&quot;.log&quot;" />
22       <maxSizeToRollBackups value="-1" />
23       <maximumFileSize value="100MB" />
24       <staticLogFileName value="false" />
25       <layout type="log4net.Layout.PatternLayout,log4net">
26         <conversionPattern value="%d - %-5level - %c - %m%n" />
27       </layout>
28  
29       <filter type="log4net.Filter.LevelRangeFilter">
30         <param name="LevelMin" value="DEBUG" />
31         <param name="LevelMax" value="WARN" />
32       </filter>
33     </appender>
34     <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
35       <layout type="log4net.Layout.PatternLayout">
36         <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
37       </layout>
38     </appender>
39   </log4net>
View Code

   第三步

如果是CS程式,在根目錄的Program.cs中的Main方法中添加:

log4net.Config.XmlConfigurator.Configure();

如果是BS程式,在根目錄的Global.asax.cs(沒有新建一個)中的Application_Start方法中添加:

log4net.Config.XmlConfigurator.Configure();

無論BS還是CS程式都可直接在項目的AssemblyInfo.cs文件里添加以下的語句:

[assembly: log4net.Config .XmlConfigurator()]

    第四步、聲明一個日誌容器

     

       我在配置文件中是這樣設置的:

   第五步、在程式中使用

  

三、主要的組成部分

             1.Appenders

               Appenders用來定義日誌的輸出方式,即日誌要寫到那種介質上去。較常用的Log4net已經實現好了,直接在配置文件中調用即可,可參見上面配置文件例子;當然也可以自己寫一個,需要從       log4net.Appender.AppenderSkeleton類繼承。它還可以通過配置Filters和Layout來實現日誌的過濾和輸出格式。

              已經實現的輸出方式有:

AdoNetAppender 將日誌記錄到資料庫中。可以採用SQL和存儲過程兩種方式。

AnsiColorTerminalAppender 將日誌高亮輸出到ANSI終端。

AspNetTraceAppender  能用asp.net中Trace的方式查看記錄的日誌。

BufferingForwardingAppender 在輸出到子Appenders之前先緩存日誌事件。

ConsoleAppender 將日誌輸出到應用程式控制台。

EventLogAppender 將日誌寫到Windows Event Log。

FileAppender 將日誌輸出到文件。

ForwardingAppender 發送日誌事件到子Appenders。

LocalSyslogAppender 將日誌寫到local syslog service (僅用於UNIX環境下)。

MemoryAppender 將日誌存到記憶體緩衝區。

NetSendAppender 將日誌輸出到Windows Messenger service.這些日誌信息將在用戶終端的對話框中顯示。

OutputDebugStringAppender 將日誌輸出到Debuger,如果程式沒有Debuger,就輸出到系統Debuger。如果系統Debuger也不可用,將忽略消息。

RemoteSyslogAppender 通過UDP網路協議將日誌寫到Remote syslog service。

RemotingAppender 通過.NET Remoting將日誌寫到遠程接收端。

 RollingFileAppender 將日誌以回滾文件的形式寫到文件中。

SmtpAppender 將日誌寫到郵件中。

SmtpPickupDirAppender 將消息以文件的方式放入一個目錄中,像IIS SMTP agent這樣的SMTP代理就可以閱讀或發送它們。

TelnetAppender 客戶端通過Telnet來接受日誌事件。

TraceAppender 將日誌寫到.NET trace 系統。

UdpAppender 將日誌以無連接UDP數據報的形式送到遠程宿主或用UdpClient的形式廣播。

     2.Filters

使用過濾器可以過濾掉Appender輸出的內容。過濾器通常有以下幾種:

DenyAllFilter 阻止所有的日誌事件被記錄

LevelMatchFilter 只有指定等級的日誌事件才被記錄

LevelRangeFilter 日誌等級在指定範圍內的事件才被記錄

LoggerMatchFilter 與Logger名稱匹配,才記錄

PropertyFilter 消息匹配指定的屬性值時才被記錄

StringMathFilter 消息匹配指定的字元串才被記錄

3.Layouts

Layout用於控制Appender的輸出格式,可以是線性的也可以是XML。

一個Appender只能有一個Layout。

最常用的Layout應該是經典格式的PatternLayout,其次是SimpleLayout,RawTimeStampLayout和ExceptionLayout。然後還有IRawLayout,XMLLayout等幾個,使用較少。Layout可以自己實現,需要從log4net.Layout.LayoutSkeleton類繼承,來輸出一些特殊需要的格式,在後面擴展時就重新實現了一個Layout。

SimpleLayout簡單輸出格式,只輸出日誌級別與消息內容。

RawTimeStampLayout 用來格式化時間,在向資料庫輸出時會用到。

樣式如“yyyy-MM-dd HH:mm:ss“

ExceptionLayout需要給Logger的方法傳入Exception對象作為參數才起作用,否則就什麼也不輸出。輸出的時候會包含Message和Trace。

PatterLayout使用最多的一個Layout,能輸出的信息很多。

4.Loggers

Logger是直接和應用程式交互的組件。Logger只是產生日誌,然後由它引用的Appender記錄到指定的媒介,並由Layout控制輸出格式。

Logger提供了多種方式來記錄一個日誌消息,也可以有多個Logger同時存在。每個實例化的Logger對象對被log4net作為命名實體(Named Entity)來維護。log4net使用繼承體系,也就是說假如存在兩個Logger,名字分別為a.b.c和a.b。那麼a.b就是a.b.c的祖先。每個Logger都繼承了它祖先的屬性。所有的Logger都從Root繼承,Root本身也是一個Logger。

日誌的等級,它們由高到底分別為:

OFF > FATAL > ERROR > WARN > INFO > DEBUG  > ALL 

高於等級設定值方法(如何設置參見“配置文件詳解”)都能寫入日誌, Off所有的寫入方法都不寫到日誌里,ALL則相反。例如當我們設成Info時,logger.Debug就會被忽略而不寫入文件,但是FATAL,ERROR,WARN,INFO會被寫入,因為他們等級高於INFO。

在具體寫日誌時,一般可以這樣理解日誌等級:

FATAL(致命錯誤):記錄系統中出現的能使用系統完全失去功能,服務停止,系統崩潰等使系統無法繼續運行下去的錯誤。例如,資料庫無法連接,系統出現死迴圈。

ERROR(一般錯誤):記錄系統中出現的導致系統不穩定,部分功能出現混亂或部分功能失效一類的錯誤。例如,數據欄位為空,數據操作不可完成,操作出現異常等。

WARN(警告):記錄系統中不影響系統繼續運行,但不符合系統運行正常條件,有可能引起系統錯誤的信息。例如,記錄內容為空,數據內容不正確等。

INFO(一般信息):記錄系統運行中應該讓用戶知道的基本信息。例如,服務開始運行,功能已經開戶等。

DEBUG (調試信息):記錄系統用於調試的一切信息,內容或者是一些關鍵數據內容的輸出。

Logger實現的ILog介面,ILog定義了5個方法(Debug,Inof,Warn,Error,Fatal)分別對不同的日誌等級記錄日誌。這5個方法還有5個重載。以Debug為例說明一下,其它的和它差不多。

ILog中對Debug方法的定義如下:

void Debug(object message);

void Debug(object message, Exception ex);

還有一個布爾屬性:

bool IsDebugEnabled { get; }

如果使用Debug(object message, Exception ex),則無論Layout中是否定義了%exception,預設配置下日誌都會輸出Exception。包括Exception的Message和Trace。如果使用Debug(object message),則日誌是不會輸出Exception。

最後還要說一個LogManager類,它用來管理所有的Logger。它的GetLogger靜態方法,可以獲得配置文件中相應的Logger:

log4net.ILog log = log4net.LogManager.GetLogger("logger-name");

5.Object Renders

它將告訴logger如何把一個對象轉化為一個字元串記錄到日誌里。(ILog中定義的介面接收的參數是Object,而不是String。)

例如你想把Orange對象記錄到日誌中,但此時logger只會調用Orange預設的ToString方法而已。所以要定義一個OrangeRender類實現log4net.ObjectRender.IObjectRender介面,然後註冊它(我們在本文中的擴展不使用這種方法,而是直接實現一個自定義的Layout)。這時logger就會知道如何把Orange記錄到日誌中了。

       6.Repository

         Repository主要用於日誌對象組織結構的維護。  

 PS來源:https://blog.csdn.net/binnygoal/article/details/79557746

 

   

 

      

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • DataTable根據欄位去重 最近需要對datatable根據欄位去重,在網上搜了很多,找到了一個方法,代碼如下 經過測試,代碼可以實現功能,但是其中有一點弄不明白,DataView v1 = dt2.DefaultView;這裡對dt2做加入行操作,同時也能影響v1,但是經過我測試如果直接把新的 ...
  • 同源策略和資源跨域共用 1、同源策略 同源策略,它是由Netscape提出的一個著名的安全策略。現在所有支持JavaScript 的瀏覽器都會使用這個策略。所謂同源是指,功能變數名稱,協議,埠相同。 1.1、目的 主要是為了保證用戶信息的安全,防止網站竊取用戶數據。假如沒有同源策略,可能就會有下麵這種情況 ...
  • C#DataTable一些使用方法 1,使用DataTable必須要引用System.Data. 2,定義一個DataTable 3,為DataTable創建列 4,為DataTable創建行 5,DataTable的取值和賦值 6,DataTable的篩選行和刪除行 //Compute用法 Obj ...
  • 1.安裝.net core sdk 在微軟.net core 安裝頁面找到linux 安裝,按照步驟安裝好 2.安裝mysql 參考 Ubuntu安裝mysql 3.配置mysql 1.需要將mysql編碼改為utf-8 2.因為需要通過.net運行mysql,如果在使用過程中如果發現遠程登錄mys ...
  • 記錄最近一次的項目開發中遇到的問題和解決方式。在給移動端開放數據介面的時候,移動端開放人員反映部署到測試環境的介面調用訪問出現了問題,但是在單獨進行訪問是可以正常的。那麼,問題就來了。 根據查詢園子里大佬們的文章,瞭解到問題的根源。 問題的由來:該問題的出現是因為瀏覽器出於安全考慮,瀏覽器會限制腳本 ...
  • 近來,需要用到 Redis 這類緩存技術 —— MongoDB 和 Redis 沒有進行過比較。 我也懶得在這些細節上 糾結那麼多 —— 按照網友給出的文章,聽從網友建議,選擇 Redis。 本文重點比較一下 ServiceStack.Redis 和 StackExchange.Redis 這兩種客... ...
  • 自己的前言說明: 本文原作者:Radoslaw Sadowski,原文鏈接為:C# BAD PRACTICES: Learn how to make a good code by bad example。 本系列還有其他文章,後續將慢慢翻譯。 引言: 我的名字叫Radoslaw Sadowski,我 ...
  • 一、C#中用Guid.NewGuid().ToString() Sql中用NEWID() 以上方法生成的是36位的GUID,如果需要轉換成32位,則需要替換掉其中的'-'字元。 Sql中的方法:replace(newid(), '-', '') GUID(全局統一標識符)是指在一臺機器上生成的數字, ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...