2017-02-22 205 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配置爲以日期開始,這可讓您的答案滿足我的需求!謝謝! –