使用log4net将日志文件输出为csv格式

  我们在编写程序时,会在程序运行过程中记录一些日志。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
" />
        <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
" />
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 下载,谢谢阅读,并祝你成功。

时间: 2024-10-18 05:50:44

使用log4net将日志文件输出为csv格式的相关文章

(一)使用log4net生成日志文件

1.引入log4net.dll 1.1 Nuget安装 或 http://logging.apache.org/log4net/下载log4net的源代码,编译后把log4net.dll引入项目. 2.配置log4net.config 2.1 在Web.config文件中进行添加configSections的节点 <configSections> <section name="log4net" type="log4net.Config.Log4NetConf

记一次log4j日志文件输出错误的解决

log4j错误信息:log4j:ERROR Failed to rename [D:/logs/wmts_] to [D:/logs/wmts_2015-12-21.log ]. 起因:部门网站使用B/S架构请求,请求过程中需要将日志文件记录下来,以便出现问题进行查找,刚开始服务器上的日志文件能够正常输出,后来日志文件不能输出,部门领导让我查找原因并修改. 介绍:本人JAVA小白一枚,之前是学.Net出身,来到公司之后由于公司需要才转的JAVA,日志输出做的比较少所以部门经理刚交给我的时候心里还

android 日志文件输出

用法: try { } catch (Exception e) { LogUtil.LogException(e); } package com.hexun.util; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.Rand

log4j日志文件输出保存

og4j.appender.A1=org.apache.log4j.DailyRollingFileAppender log4j.appender.A1.File=app.log log4j.appender.A1.DatePattern='.'yyyy-MM-dd log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%d %5p - %c -%-4r

eclipse集成tomcat日志文件输出配置

eclipse集成tomcat日志文件输入配置 2015-07-21 00:13 1072人阅读 评论(0) 收藏 举报  分类: tomcat(1)  eclipse Where can I view Tomcat log files in Eclipse? I'm not sure if you were after catalina.out or one of the other logs produced by Tomcat. But, if you're after the catal

Log4net 根据日志类型输出日志

第一步:引入Log4net.dll 文件的引用 第二步:添加LogHelper类,代码如下 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using log4net; namespace DemoLog4net { /// <summary> /// 日志等级 /// </summary> publ

Log4net入门(回滚日志文件篇)

在上一篇Log4net(日志文件篇)中,我们使用"log4net.Appender.FileAppender"将日志信息输出到一个单一的文件中,随着应用程序的持续使用,该日志文件会越来越庞大,进而影响系统的性能.因此,有必要对日志文件按某种条件进行切分,要切分日志文件,我们可以使用"log4net.Appender.RollingFileAppender"输出源,使用该输出源我们可以按照文件大小或者日期对日志文件进行切分,下面我们分别描述之. 一.按文件大小切分日志

Log4net日志文件自动按月份存放和日志独占问题的解决

让log4net日志文件自动按月份存放 log4net日志文件的作用还真不小,可以保存管理员.用户对数据库的任何操作,保存管理员和用户的登录记录,分析系统运行错误,所以不舍得随便将日志文件Delete.如果时间长了,日志文件夹一定会有很多很多日志文件,不便于管理员查看. 所以让log4net日志文件自动按月份存放是必须的,其实方法很Easy,额是突发奇想在DatePattern value中增加“yyyyMM\\”,运行后果然如额所愿. 也就是修改Web.Config文件如下: <file va

lnmp vps服务器删除mysql日志文件三种方法

我在上一篇文章介绍了著名的LNMP主机一键安装工具,对比了军哥lnmp和AMH主机的差别,由于AMH拥有用户后台界面,易于新手操作,值得推荐. 但是,上周末我网站宕机,收到DNSPOD发来了宕机提醒,不得不半夜爬起来处理VPS问题,最终查明原因是AMH运行产生了大量的mysql数据库二进制文件,25GB的VPS硬盘几乎占满,导致网站不稳定,出现502宕机错误. AMH作者给出了解决办法,我不喜欢,其实后台修改配置就好了.考虑到所有lnmp vps用户的方便,我把所有解决办法都列出来给各位参考: