2016-10-25 74 views
1

採取IP地址,並保存到文件,表或.csv只能從日誌文件以IP地址保存到只能從日誌文件文件,表或.csv

我有一個像這樣的條目日誌文件:

2010-09-13 00:00:01 69.143.116.98 - W3SVC2 STREAM 209.22.66.152 80 GET /p7pm/p7popmenu.js - 200 0 7700 379 188 .org Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+6.0;+WOW64;+GoogleT5;+SLCC1;+.NET+CLR+2.0.50727;+Media+Center+PC+5.0;+.NET+CLR+3.5.30729;+.NET+CLR+3.0.30618;+.NET4.0C) - .org/ 
Mozilla/5.0+(compatible;+Yahoo!+Slurp/3.0;+.com) - waste.html 
2010-09-13 08:52:15 67.195.112.157 - W3SVC2 STREAM 209.22.66.152 80 GET /includes/Center_nav_p4.css - 304 0 164 482 0 HTTP/1.0 LOL.org Mozilla/5.0+(compatible;+Yahoo!+Slurp/3.0;+.com) - waste.html 

我在想什麼是提取每個日誌條目的IP地址和保存爲一條線或行中數據庫的最佳方式。我可能會先保存到List中或類似的東西中,然後將其保存到只有ip addreses的db,csv或text文件中。

事情是這樣的:

"69.143.116.98" 
"65.37.53.228" 
"169.123.16.100" 
"169.123.16.12" 
"169.123.16.9" 
"169.123.6.89" 

它看起來像IP地址21號線開始這樣想我能以某種方式從那裏開始,但隨後弄清楚如何獲得IP的其餘部分。 也許像21日開始,然後抓住所有,直到我打了一個空間?

當我抓住他們所有的我會計數和排序他們,並將他們保存到最終格式。

我在正確的道路上嗎? 謝謝。

顯然我沒有在這裏得到整個任務;它似乎會變得更加困難。這是一個涉及分揀的TON;我想象的第一部分是抓住這些數據並放入某種表格,然後做這種排序,最後寫出計數,IP後排序爲csv ........

我需要解析在這個日誌文件中,這裏是需要發生的事情;它是瘋狂的:

1.)代碼將統計日誌文件中包含的IP地址所做的請求數。

2.)代碼只會計算通過HTTP標準端口發出的GET請求,並且應該從計數中排除從「207.114」開始的所有IP請求。

  1. )應該對最終的CSV文件進行排序,以便首先列出提出最多請求的IP。

  2. )提出請求的請求數相同的IP應該在它們之間排序,首先列出更大值的IP八位組。

  3. )第一列應該包含請求的數量,第二列應該包含創建它們的IP地址。 SomeFromLog.csv - 實施例基於以下數據:

8中, 「69.143.116.98」

3, 「65.37.53.228」

1 「169.123.16.100」

1, 「169.123.16.12」

1, 「169.123.16.9」

1「169.12 3.6。89"

+0

像這樣的任務,知道源數據的格式總是很重要。它看起來像來自Web服務器的日誌,你能告訴我們哪個Web服務器和什麼日誌記錄選項被設置? –

+0

它是一個.log文件,我相信從IIS,其中每行看起來像這樣: 2010-08-12 08:52:58 63.160.106.254 - W3SVC111 STREAM 207.22.66.152 80 GET /includes/scripts.js - 304 0 164 456 0 HTTP/1.1 www.LOL.org Mozilla/4.0 +(兼容; + MSIE + 6.0; + Windows + NT + 5.1; + SV1; +。NET + CLR + 1.1.4322; +。NET + CLR + 2.0 .50727)__utma = 228961600.1845892080.1265608268.1279440521.1279522956.43 http://www.LOL.org/ 我在想,它需要以某種方式逐行閱讀並解析,以便整個事情在數據庫表中結束,以便排序可以完成/問題是;如何做那部分? – MLBdev

+0

IIS支持3種格式的外觀和插件,以幾乎任何格式存儲日誌。但是,如果您沒有更改任何設置,則可能採用W3C擴展日誌文件格式(請參閱https://www.w3.org/TR/WD-logfile.html)。請注意,並非每一行的格式都相同,其中一些行是「指令」,用於描述其他行的結構,這些行以#開始。另外,使用配置設置,有時可能在文件中間添加或刪除列。因此,最好使用預編寫的解析器。 Yann在下面的建議似乎是一個合理的選擇。 –

回答

0
string line = string.Empty; 
using(StreamReader sr = new StreamReader("path/to/file")) { 
    while((line = sr.ReadLine())!=null) { 
     var matches = Regex.Match(line, @"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3} 
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"); 
     if(matches == null) continue; 
     foreach(var group in match.Group) { 
      //Do your staff here 
     } 
    } 
} 

使用此Regex,您將能夠只(根據if語句)匹配的有效的IP地址,如果有什麼可以與之匹敵將繼續while週期

+0

我怎麼會用這個來分析整個日誌文件轉換成SQL表格或我們可以處理的可排序的東西?我編輯了上面的答案,看起來會有很多排序需要完成這個。我想過使用LogParser,但有沒有辦法用代碼來做同樣的事情? – MLBdev

0

添加的命名空間,

System.Text.RegularExpressions 

然後使用正則表達式

string pattern = @"\b(?:(?:2(?:[0-4][0-9]|5[0-5])|[0-1]?[0-9]?[0-9])\.){3}(?:(?:2([0-4][0-9]|5[0-5])|[0-1]?[0-9]?[0-9]))"; 
     Regex r = new Regex(pattern); 
     string input =File.ReadAllText(path) ; 
     MatchCollection matches = r.Matches(input); 
     foreach (Match match in matches) 
      Console.WriteLine(match.Value); 

這樣您將獲得陣列中的所有IP地址。 您可以使用regexr檢查正則表達式:http://regexr.com/

+0

我該如何使用它來將整個日誌文件解析到SQL表格中或者我們可以使用的可排序的東西?我在上面編輯了我的答案,看起來會有很多需要完成的排序。我想過使用LogParser,但有沒有辦法用代碼來做同樣的事情? – MLBdev

2

您可以從金塊安裝TX.Windows: https://www.nuget.org/packages/Tx.Windows

PM > Install-Package Tx.Windows

,然後用它這樣的:

 var iisLog = W3CEnumerable.FromFile(pathToLog); 
     List<string> IpsLog = new List<string>(); 
     foreach (var item in iisLog) 
     { 
      IpsLog.Add(item.c_ip); 
     } 

如果該日誌文件被另一個進程使用,可以使用W3CEnumerable.FromStream

+0

我如何使用t他把整個日誌文件解析成一個SQL表或者我們可以處理的可排序的東西?我在上面編輯了我的答案,看起來會有很多排序來完成這個任務。 – MLBdev