log4net使用方法及利用正则表达式提取日志信息
log4net是.Net下一个非常优秀的开源日志记录组件。log4net记录日志的功能非常强大。它可以将日志分不同的等级,以不同的格式,输出到不同的媒介,如利用log4net可以方便地将日志信息记录到文件、控制台、Windows事件日志和数据库(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite)中。可以记载的日志类别包括:FATAL(致命错误)、ERROR(一般错误)、WARN(警告)、INFO(一般信息)、DEBUG(调试信息)。
简单的控制台应用
控制台应用程序实例展示如何用log4net记录日志,首先要在项目中添加对log4net.dll的引用,之后要配置相关的配置文件添加配置文件两种方法,一是在默认的App.config文件(没有新建一个)中添加内容,二是在输出目录添加相应配置文件(WinForm对应的是*.exe.config)。
配置文件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <!--添加log4net自定义节点--> <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/> </configSections> <appSettings> </appSettings> <log4net> <!--定义输出到文件中--> <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender"> <!--定义文件存放位置--> <appendToFile value="true" /> <rollingStyle value="Date" /> <!--【1】指定存储到某个具体文件中--> <!--<file value="D:/log4netfile.txt" /> <datePattern value="yyyy\\yyyyMM\\yyyyMMdd\\yyyyMMdd-HH'.txt'"/> <datePattern value="yyyyMMdd-HH:mm:ss" />--> <!--【2】指定存储到某个文件夹中,根据时间生成日志文件--> <file value="log\\"/> <datePattern value="yyyyMMdd-HH'.txt'"/> <staticLogFileName value="false"/> <param name="MaxSizeRollBackups" value="100"/> <layout type="log4net.Layout.PatternLayout"> <!--每条日志末尾的文字说明--> <footer value="by author" /> <!--输出格式--> <!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info--> <!--%n是换行--> <conversionPattern value="%n记录时间:%date %n线程ID:[%thread] %n日志级别:%-5level %n出错类:%logger property:[%property{NDC}] - %n错误描述:%message%newline" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="WARN" /> <levelMax value="FATAL" /> </filter> </appender> <!--定义输出到控制台命令行中--> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <!--定义日志的输出媒介--> <root> <!--控制要记载的日志级别--> <level value="ERROR"/> <level value="DEBUG"/> <!--文件形式记录日志--> <appender-ref ref="LogFileAppender" /> <!--控制台控制显示日志--> <appender-ref ref="ConsoleAppender" /> <!-- 如果不启用相应的日志记录,可以通过这种方式注释掉 <appender-ref ref="AdoNetAppender_Access" /> --> </root> </log4net> </configuration>
辅助程序
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System; using System.Collections.Generic; using System.Linq; using System.Text; //注意下面的语句一定要加上,指定log4net使用.config文件来读取配置信息 //如果是WinForm(假定程序为LogDemo.exe,则需要一个LogDemo.exe.config文件) //如果是WebForm,则从web.config中读取相关信息 [assembly: log4net.Config.XmlConfigurator(Watch = true)] namespace Log4netConsole { class Log4netHelper { public static void WriteLogger(Type type, LogLevel logLevel, string msg) { log4net.ILog log = log4net.LogManager.GetLogger(type); switch (logLevel) { case LogLevel.Debug: log.Debug(msg); break; case LogLevel.Error: log.Error(msg); break; case LogLevel.Fatal: log.Fatal(msg); break; case LogLevel.Info: log.Info(msg); break; case LogLevel.Warn: log.Warn(msg); break; default: break; } } } /// <summary> /// 日志记录级别 /// </summary> public enum LogLevel { Debug, Info, Warn, Error, Fatal } }
主程序
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.Reflection; 5 6 namespace Log4netConsole 7 { 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 //返回:命名空间+类名,此处为Log4netConsole.Program, 13 //表示在哪个类中记录的日志,如果记录的错误日志表示在那个类中出错 14 Type type = MethodBase.GetCurrentMethod().DeclaringType; 15 Log4netHelper.WriteLogger(type, LogLevel.Error, "测试记录Error日志"); 16 Log4netHelper.WriteLogger(type, LogLevel.Debug, "测试记录Debug日志"); 17 18 car car2 = new car("dongdong", 1); 19 car2.drvie(); 20 21 Console.ReadKey(); 22 } 23 24 static void print() 25 { 26 Type type = MethodBase.GetCurrentMethod().DeclaringType; 27 Log4netHelper.WriteLogger(type, LogLevel.Error, "测试记录print日志"); 28 Console.WriteLine("==============this is test lognet==============="); 29 car car1 = new car(); 30 car1.drvie(); 31 } 32 } 33 34 class car 35 { 36 public string name; 37 public int ID; 38 public car(string na = "00",int id = 0) 39 { 40 name = na; 41 ID = id; 42 } 43 44 public void drvie() 45 { 46 Type type = MethodBase.GetCurrentMethod().DeclaringType; 47 Log4netHelper.WriteLogger(type, LogLevel.Debug, "测试记录car Debug日志"); 48 Log4netHelper.WriteLogger(type, LogLevel.Info, "测试记录car Info日志"); 49 Log4netHelper.WriteLogger(type, LogLevel.Warn, "测试记录car Warn日志"); 50 Log4netHelper.WriteLogger(type, LogLevel.Error, "测试记录car Error日志"); 51 Log4netHelper.WriteLogger(type, LogLevel.Fatal, "测试记录car Fatal日志"); 52 Console.WriteLine("==============this is car ==============="); 53 } 54 } 55 }
将日志记录输出到文件、控制台。
假设文本内容如下
2018-05-24 17:02:00,822 [9] WARN ID -出错类:Log4netConsole.car
property:[(null)] - 错误描述:测试记录car Warn日志
2018-05-24 17:02:00,762 [9] ERROR GH- Log4netConsole.Program
property:[(null)] - 错误描述:测试记录Error日志
2018-05-24 17:02:00,822 [9] WARN ED -出错类:Log4netConsole.car
property:[(null)] - 错误描述:测试记录car Warn日志
2018-05-24 17:02:00,824 [9] FATAL EF - Log4netConsole.car property:
[(null)] - 错误描述:测试记录car Fatal日志
2018-05-24 17:02:00,762 [9] ERROR CD- [12]Log4netConsole.Program
property:[(null)] - 错误描述:测试记录Error日志
2018-05-24 17:02:00,762 [9] ERROR AB - [12]Log4netConsole.Program
property:[(null)] - 错误描述:测试记录Error日志
采用正则表达式提取文本信息代码如下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 try 2 { 3 DataTable table = new DataTable(); 4 table.Columns.AddRange(new DataColumn[] { new DataColumn("TIME"), new DataColumn("THREAD"), new DataColumn("PRIORITY"), new DataColumn("LOGGER"), new DataColumn("MESSAGE") }); 5 string input = ""; 6 using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 7 { 8 using (StreamReader reader = new StreamReader(stream, Encoding.Default)) 9 { 10 input = reader.ReadToEnd(); 11 } 12 } 13 14 MatchCollection matchs = Regex.Matches(input, regexString, RegexOptions.RightToLeft); 15 foreach (Match match in matchs) 16 { 17 string str2 = match.Groups[1].Value; 18 string str3 = match.Groups[2].Value; 19 string str4 = match.Groups[3].Value; 20 string str5 = match.Groups[4].Value; 21 string str6 = match.Groups[5].Value; 22 DataRow row = table.NewRow(); 23 row.ItemArray = new string[] { str2, str3, str4, str5, str6 }; 24 table.Rows.InsertAt(row, 0); 25 } 26 this.dataGridView1.DataSource = table; 27 dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; 28 //this.gridView1.FocusedRowHandle = this.gridView1.RowCount - 1; 29 } 30 catch (Exception exception) 31 { 32 MessageBox.Show(exception.Message); 33 }
输出结果如下
参考
http://logging.apache.org/log4net/release/config-examples.html
https://blog.csdn.net/xiaouncle/article/details/52327324