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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...