2017-02-22 204 views
-1

我正在使用log4net,它偶尔会向日志文件写入异常。现在我想插入每条日志行,可以多于1行(例如包括堆栈跟踪的例外)长,所以按日志行解析日志文件

foreach(var line in File.ReadAllLines(...)){} 

会分解异常。下面是一个示例日志文件:

2017-02-22 14:37:17,212 [Foo.Bar] INFO - This is something nice to log 
System.InvalidCastException: Specified cast is not valid. 
    at System.Data.DataRowExtensions.UnboxT`1.ValueField(Object value) 
    at System.Data.DataRowExtensions.Field[T](DataRow row, String columnName) 
    at Foo.Bar.<>c__DisplayClass282_0.<FooBar>b__0(DataRow row) in somefile.cs:line 2657 
    at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source, Func`2 predicate) 
    at Foo.Bar.<FooBar>d__282.MoveNext() in somefile.cs:line 2657 

我想的第一行中的字符串被解析,以及整个剩余的其余(在这个例子中,在一般情况除外)。

任何好主意开始?

+0

我就从这里开始:[问] –

+0

@ rory.ap感谢,我很精细。我刚开始并没有任何意见。感谢您在不明确原因的情况下进行降低投票的方式。也许你应该看一看关于如何正确回顾(在你的书中)“愚蠢问题”的指南。为什么stackoverflow如此不友好? –

+0

我低估了,因为在发布您的问题之前,您没有阅读[帮助]和[问]。你的问题太宽泛,并没有显示研究工作。并不是说SO不友好,更多的是人们厌倦了一个人一遍又一遍地提出相同类型的问题,而没有人理解规则。 –

回答

0

这是我想出来的,用正则表达式来分割行。但是,这是假设所有日志条目都以该格式的日期开始。

static void Main(string[] args) 
{ 
    string RegexString = @"(?=\d{4}[-]\d{2}[-]\d{2}[ ]\d{2}[:]\d{2}[:]\d{2}[,])"; 
    string Log4NetSample = Properties.Resources.Log4Net_Example; 
    List<string> ParsedLogItems = new List<string>(); 
    foreach (var Item in Regex.Split(Log4NetSample, RegexString)) 
     if (Item.Trim() != string.Empty) 
      ParsedLogItems.Add(Item); 


    foreach (var Item in ParsedLogItems) 
    { 
     Console.WriteLine(); 
     Console.WriteLine("===== New Log Item ====="); 
     Console.WriteLine(Item); 
    } 
    Console.ReadLine(); 
} 

我用这段文字作为演示,我改变了一些日期以表明它会匹配多个。

2017-02-22 14:37:17,212 [Foo.Bar] INFO - This is something nice to log 
System.InvalidCastException: Specified cast is not valid. 
    at System.Data.DataRowExtensions.UnboxT`1.ValueField(Object value) 
    at System.Data.DataRowExtensions.Field[T](DataRow row, String columnName) 
    at Foo.Bar.<>c__DisplayClass282_0.<FooBar>b__0(DataRow row) in somefile.cs:line 2657 
    at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source, Func`2 predicate) 
    at Foo.Bar.<FooBar>d__282.MoveNext() in somefile.cs:line 2657 

2012-03-31 14:37:17,212 [Foo.Bar] INFO - This is something nice to log 
System.InvalidCastException: Specified cast is not valid. 
    at System.Data.DataRowExtensions.UnboxT`1.ValueField(Object value) 
    at System.Data.DataRowExtensions.Field[T](DataRow row, String columnName) 
    at Foo.Bar.<>c__DisplayClass282_0.<FooBar>b__0(DataRow row) in somefile.cs:line 2657 
    at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source, Func`2 predicate) 
    at Foo.Bar.<FooBar>d__282.MoveNext() in somefile.cs:line 2657 

2018-08-14 14:37:17,212 [Foo.Bar] INFO - This is something nice to log 
System.InvalidCastException: Specified cast is not valid. 
    at System.Data.DataRowExtensions.UnboxT`1.ValueField(Object value) 
    at System.Data.DataRowExtensions.Field[T](DataRow row, String columnName) 
    at Foo.Bar.<>c__DisplayClass282_0.<FooBar>b__0(DataRow row) in somefile.cs:line 2657 
    at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source, Func`2 predicate) 
    at Foo.Bar.<FooBar>d__282.MoveNext() in somefile.cs:line 2657 

和代码生成以下的输出:

===== New Log Item ===== 
2017-02-22 14:37:17,212 [Foo.Bar] INFO - This is something nice to log 
    System.InvalidCastException: Specified cast is not valid. 
     at System.Data.DataRowExtensions.UnboxT`1.ValueField(Object value) 
     at System.Data.DataRowExtensions.Field[T](DataRow row, String columnName) 
     at Foo.Bar.<>c__DisplayClass282_0.<FooBar>b__0(DataRow row) in somefile.cs:line 2657 
     at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source, Func`2 predicate) 
     at Foo.Bar.<FooBar>d__282.MoveNext() in somefile.cs:line 2657 


===== New Log Item ===== 
2012-03-31 14:37:17,212 [Foo.Bar] INFO - This is something nice to log 
    System.InvalidCastException: Specified cast is not valid. 
     at System.Data.DataRowExtensions.UnboxT`1.ValueField(Object value) 
     at System.Data.DataRowExtensions.Field[T](DataRow row, String columnName) 
     at Foo.Bar.<>c__DisplayClass282_0.<FooBar>b__0(DataRow row) in somefile.cs:line 2657 
     at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source, Func`2 predicate) 
     at Foo.Bar.<FooBar>d__282.MoveNext() in somefile.cs:line 2657 


===== New Log Item ===== 
2018-08-14 14:37:17,212 [Foo.Bar] INFO - This is something nice to log 
    System.InvalidCastException: Specified cast is not valid. 
     at System.Data.DataRowExtensions.UnboxT`1.ValueField(Object value) 
     at System.Data.DataRowExtensions.Field[T](DataRow row, String columnName) 
     at Foo.Bar.<>c__DisplayClass282_0.<FooBar>b__0(DataRow row) in somefile.cs:line 2657 
     at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source, Func`2 predicate) 
     at Foo.Bar.<FooBar>d__282.MoveNext() in somefile.cs:line 2657 
+0

谢谢。我将log4net配置为以日期开始,这可让您的答案满足我的需求!谢谢! –