【问题标题】:Take IP Addresses only from log file and save to File, Table, or .CSV仅从日志文件中获取 IP 地址并保存到文件、表格或 .CSV
【发布时间】:2017-03-07 02:15:37
【问题描述】:

仅从日志文件中获取 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 地址并将其保存为数据库中的行或行的最佳方法。我可能会先保存到一个列表或类似的东西中,然后保存到一个只有 IP 地址的 db、csv 或文本文件中。

类似这样的:

"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 号开始,然后抓住所有的东西,直到我找到一个空格?

在我将它们全部抓取后,我会对它们进行计数和排序,然后将它们保存为最终格式。

我在正确的道路上吗? 谢谢。

显然我没有在这里完成整个任务;看来这会有点困难。涉及大量排序;我想第一部分是抓取这些数据并放入某种表格中,然后进行所有这些排序,最后写出计数,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.123.6.89”

【问题讨论】:

  • 对于这样的任务,了解源数据的格式总是很重要。它看起来像来自 Web 服务器的日志,你能告诉我们哪个 Web 服务器以及设置了哪些日志记录选项吗?
  • 这是一个我相信来自 IIS 的 .log 文件,其中每一行如下所示: 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 LOL.org 我认为它需要以某种方式逐行读取并解析,以便整个事情最终在数据库表中进行排序完成/问题是;那部分怎么做?
  • IIS 支持 3 种开箱即用的格式和插件以几乎任何格式存储日志。但是,如果您没有更改任何设置,它可能是 W3C 扩展日志文件格式(请参阅w3.org/TR/WD-logfile.html)。请注意,并非这种格式的每一行都是相同的,其中一些行是描述其他行结构的“指令”,这些行以 # 开头。此外,使用配置设置,有时可以在文件的一部分中添加或删除列。因此,最好使用预先编写的解析器。 Yann 在下面建议的选择似乎是一个合理的选择。
  • 1.我看到这样做的方式是将日志文件的每一行读入 list LogFileList = new list();某种。 2. 现在我们有一个列表中的日志文件行,我们遍历该列表并在第一遍消除以“207.114”开头的 IP 发出的请求。 3. 再次运行并消除端口 80 上不是 GET 的行。 4. 现在我们创建第二个 List =LogFileResults = new List();或者可以是一个 List 来保存最终结果。
  • 5.我们需要从 LogFileList 中取出每一行并检查 IP 地址,如果这已经在 LogFileResults 中,那么我们只需将该 IP 的计数设为 1,如果没有,那么这是一个新的 IPaddress 条目,我们将其添加到 LogFileResults 为另一排。 6. 最后,我们应该对每个 IP 地址进行计数,结果中没有任何重复的 IP 地址。 12, "64.143.116.98" 4, "65.37.53.228" 2, "166.123.16.100" 1, "166.123.16.12" 你将如何在 C# 中执行此操作?

标签: c# sql sql-server regex csv


【解决方案1】:

您可以从 nugget 安装 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

【讨论】:

  • 我将如何使用它来将整个日志文件解析为 SQL 表或我们可以使用的可排序的东西?我在上面编辑了我的答案,看来需要进行大量排序才能完成此操作。
【解决方案2】:
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,您将只能匹配有效的IP,如果没有匹配的IP,它将继续while循环(根据if语句)

【讨论】:

  • 我将如何使用它来将整个日志文件解析为 SQL 表或我们可以使用的可排序的东西?我在上面编辑了我的答案,似乎需要进行大量排序才能完成此操作。我考虑过使用 LogParser,但有没有办法用代码做同样的事情?
【解决方案3】:

添加命名空间,

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/

【讨论】:

  • 我将如何使用它来将整个日志文件解析为 SQL 表或我们可以使用的可排序的东西?我在上面编辑了我的答案,似乎需要进行大量排序才能完成此操作。我考虑过使用 LogParser,但有没有办法用代码做同样的事情?
猜你喜欢
  • 1970-01-01
  • 2012-03-26
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
  • 2021-10-31
  • 1970-01-01
相关资源
最近更新 更多