使用log4net將日誌文件輸出為csv格式

来源:http://www.cnblogs.com/Soar1991/archive/2016/08/26/5808788.html
-Advertisement-
Play Games

我們在編寫程式時,會在程式運行過程中記錄一些日誌。log4net作為一款經久耐用的日誌組件,值得我們信賴。在中小型公司中,往往沒有專業的日誌伺服器來處理應用程式產生的日誌,而格式化不好的日誌文件又為上線後日誌的統計、分析、查找造成了困難。 Excel作為一款常用的辦公軟體,用來處理一些中小數量級的數 ...


  我們在編寫程式時,會在程式運行過程中記錄一些日誌。log4net作為一款經久耐用的日誌組件,值得我們信賴。在中小型公司中,往往沒有專業的日誌伺服器來處理應用程式產生的日誌,而格式化不好的日誌文件又為上線後日誌的統計、分析、查找造成了困難。

  Excel作為一款常用的辦公軟體,用來處理一些中小數量級的數據還是游刃有餘的。如果log4net輸出的日誌能夠直接導入Excel,那麼查詢和分析起來豈不是要快很多?

  我們有很多方法可以實現這個功能,csv的優勢是其文件格式比較簡單,可以用任意的文本編輯器打開,而且解析起來比較方便。效果如下:

 

  新建控制台程式,引用log4net類庫這些步驟不必說,直接進入正題,我們需要增加4個類文件 CsvTextWriter 、 NewFieldConverter 、 EndRowConverter 和 CsvPatternLayout。

CsvTextWriter.cs

 1 using System.IO;
 2 using System.Text;
 3 
 4 namespace CoderBusy.Log4Net.Layout
 5 {
 6     public class CsvTextWriter : TextWriter
 7     {
 8         private readonly TextWriter _textWriter;
 9 
10         public CsvTextWriter(TextWriter textWriter)
11         {
12             _textWriter = textWriter;
13         }
14 
15         public override Encoding Encoding => _textWriter.Encoding;
16 
17         public override void Write(char value)
18         {
19             _textWriter.Write(value);
20             if (value == '"')
21                 _textWriter.Write(value);
22         }
23 
24         public void WriteQuote()
25         {
26             _textWriter.Write('"');
27         }
28     }
29 }

NewFieldConverter.cs

 1 using System.IO;
 2 using log4net.Util;
 3 
 4 namespace CoderBusy.Log4Net.Layout
 5 {
 6     public class NewFieldConverter : PatternConverter
 7     {
 8         protected override void Convert(TextWriter writer, object state)
 9         {
10             var ctw = writer as CsvTextWriter;
11             ctw?.WriteQuote();
12 
13             writer.Write(',');
14 
15             ctw?.WriteQuote();
16         }
17     }
18 }

EndRowConverter.cs

 1 using System.IO;
 2 using log4net.Util;
 3 
 4 namespace CoderBusy.Log4Net.Layout
 5 {
 6     public class EndRowConverter : PatternConverter
 7     {
 8         protected override void Convert(TextWriter writer, object state)
 9         {
10             var ctw = writer as CsvTextWriter;
11 
12             ctw?.WriteQuote();
13 
14             writer.WriteLine();
15         }
16     }
17 }

CsvPatternLayout.cs

 1 using System.IO;
 2 using log4net.Core;
 3 using log4net.Layout;
 4 
 5 namespace CoderBusy.Log4Net.Layout
 6 {
 7     public class CsvPatternLayout : PatternLayout
 8     {
 9         public override void ActivateOptions()
10         {
11             AddConverter("newfield", typeof(NewFieldConverter));
12             AddConverter("endrow", typeof(EndRowConverter));
13             base.ActivateOptions();
14         }
15 
16         public override void Format(TextWriter writer, LoggingEvent loggingEvent)
17         {
18             var ctw = new CsvTextWriter(writer);
19             ctw.WriteQuote();
20             base.Format(ctw, loggingEvent);
21         }
22     }
23 }

  在書寫 log4net 的配置文件時,只要將 appender 的 layout 設置為 CoderBusy.Log4Net.Layout.CsvPatternLayout ,且設置好日誌頭,日誌格式即可。註意,header後需要編寫換行字元,%newfield代表欄位分隔符,%endrow代表一行結束。

      <layout type="CoderBusy.Log4Net.Layout.CsvPatternLayout,CoderBusy.Log4Net">
        <header value="Time,Thread,Level,Logger,Message,Exception&#13;&#10;" />
        <conversionPattern
          value="%date{yyyy-MM-dd HH:mm:ss}%newfield%thread%newfield%level%newfield%logger%newfield%message%newfield%exception%endrow" />
      </layout>

  我為初學者準備了一個log4net的配置文件。這個配置文件會將日誌在控制台和csv文件中同時輸出,每天一個CSV文件(本地時間),且控制臺中,不同的日誌級別會有不同的顏色。 

 1 <?xml version="1.0" encoding="utf-8"?>
 2 
 3 <configuration>
 4   <configSections>
 5     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
 6   </configSections>
 7   <log4net xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 8     <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
 9       <param name="File" value="Logs/" />
10       <param name="AppendToFile" value="True" />
11       <param name="MaxSizeRollBackups" value="10" />
12       <param name="StaticLogFileName" value="false" />
13       <param name="DatePattern" value="yyyy-MM-dd&quot;.csv&quot;" />
14       <param name="RollingStyle" value="Date" />
15       <layout type="CoderBusy.Log4Net.Layout.CsvPatternLayout,CoderBusy.Log4Net">
16         <header value="Time,Thread,Level,Logger,Message,Exception&#13;&#10;" />
17         <conversionPattern
18           value="%date{yyyy-MM-dd HH:mm:ss}%newfield%thread%newfield%level%newfield%logger%newfield%message%newfield%exception%endrow" />
19       </layout>
20     </appender>
21 
22     <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
23       <mapping>
24         <level value="ERROR" />
25         <foreColor value="Red" />
26       </mapping>
27       <mapping>
28         <level value="INFO" />
29         <foreColor value="Green" />
30       </mapping>
31 
32       <layout type="log4net.Layout.PatternLayout">
33         <conversionPattern value="# %date{HH:mm:ss} [%thread] %-5level %logger #%newline%message%newline" />
34       </layout>
35       <filter type="log4net.Filter.LevelRangeFilter">
36         <param name="LevelMin" value="DEBUG" />
37         <param name="LevelMax" value="FATAL" />
38       </filter>
39     </appender>
40 
41     <root>
42       <!-- OFF < FATAL < ERROR < WARN < INFO < DEBUG < ALL -->
43       <level value="ALL" />
44       <appender-ref ref="RollingLogFileAppender" />
45       <appender-ref ref="ColoredConsoleAppender" />
46     </root>
47   </log4net>
48 </configuration>

  配合以上配置,測試一下功能。

 1 using System;
 2 using log4net;
 3 using log4net.Config;
 4 
 5 [assembly: XmlConfigurator(ConfigFile = "log4net.config")]
 6 
 7 namespace CoderBusy.Log4Net.Tests
 8 {
 9     internal class Program
10     {
11         public static void Main(string[] args)
12         {
13             var log = LogManager.GetLogger("Default");
14             log.Debug("Message", new Exception("Test Exception"));
15             log.Info("Hello World.");
16             log.WarnFormat("A={0} B={1}", "\"123123", Environment.NewLine);
17             Console.ReadLine();
18         }
19     }
20 }

Logs文件夾中,生成的csv文件內容如下:

Time,Thread,Level,Logger,Message,Exception
"2016-08-25 23:13:19","9","DEBUG","Default","Message","System.Exception: Test Exception
"
"2016-08-25 23:13:19","9","INFO","Default","Hello World.",""
"2016-08-25 23:13:19","9","WARN","Default","A=""123123 B=
",""

  輸出欄位被使用雙引號包裹,且消息體中的雙引號被重覆輸出。這樣的結果表明我們的程式是正常的。本文的代碼可以在 http://pan.baidu.com/s/1hr4EOPu 下載,謝謝閱讀,並祝你成功。

 


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

-Advertisement-
Play Games
更多相關文章
  • 摘自:http://www.apelearn.com/bbs/forum.php?mod=viewthread&tid=7677&extra=page%3D1%26filter%3Dtypeid%26typeid%3D36 1. rpm工具rpm Redhat Package Manager, 設計 ...
  • 摘自:http://www.apelearn.com/bbs/forum.php?mod=viewthread&tid=7660&extra=page%3D1%26filter%3Dtypeid%26typeid%3D36 1. gzip工具語法: gzip [-d#] filename 其中#為1 ...
  • Linux系統的基本原則: 1.由目的單一的小程式組成;組合小程式完成複雜任務; 2.一切皆文件; 3.儘量避免捕獲用戶介面;(儘量不與用戶交互) 4.配置文件保存為純文本格式。 shell:人機交互介面 GUI介面:圖形用戶界面介面 X-Window Gnome:C KDE:C++ XFace C ...
  • 摘自:http://www.apelearn.com/bbs/thread-7146-1-1.html ":x" 和 ":wq" 的區別如下:(1) :wq 強制性寫入文件並退出(存檔並退出 write and quite)。即使文件沒有被修改也強制寫入,並更新文件的修改時間。(2) :x 寫入文件 ...
  • static在C中主要有兩個作用: 1、修飾變數 (局部變數、全局變數 都存在記憶體的靜態區) 靜態全局變數: 作用域僅限於變數被定義的文件中,其中文件即使用extern聲明也無法使用它。 靜態局部變數: 2、修飾函數 函數前加static使得函數成為靜態函數。 函數的作用域僅限於本文件(所以又稱內部 ...
  • 摘自:http://www.apelearn.com/bbs/forum.php?mod=viewthread&tid=7621&extra=page%3D1%26filter%3Dtypeid%26typeid%3D36 1. 查看磁碟或者目錄的容量 df 查看磁碟各分區使用情況 不加參數以k為單 ...
  • 我準備安裝到/usr/local目錄下 1. cd /usr/local 2. 安裝GCC 和GCC-C++ yum install gcc yum install -y gcc gcc-c++ 3. 安裝pcre庫 cd /usr/local/wget ftp://ftp.csx.cam.ac.u ...
  • Tomcat需要JDK的支持,所以安裝Tomcat前先安裝JDK。 一、首先到JDK官網下載與自己機器相應的JDK。註意機器位數,Linux系統的話可以用uname -a命令查看系統信息,如果是Ubuntu的系統,下載尾碼為.tar.gz的就行。 我64位的機器下的是這個JDK:wget http: ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...