程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 使用log4net將日志文件輸出為csv格式,log4netcsv

使用log4net將日志文件輸出為csv格式,log4netcsv

編輯:C#入門知識

使用log4net將日志文件輸出為csv格式,log4netcsv


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

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

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

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 下載,謝謝閱讀,並祝你成功。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved