Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅从日志文件中获取IP地址并保存到文件、表或.CSV_C#_Sql_Sql Server_Regex_Csv - Fatal编程技术网

C# 仅从日志文件中获取IP地址并保存到文件、表或.CSV

C# 仅从日志文件中获取IP地址并保存到文件、表或.CSV,c#,sql,sql-server,regex,csv,C#,Sql,Sql Server,Regex,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.5

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

大概是这样的:

"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请求,并且应从计数中排除从IP以“207.114”开头发出的所有请求

  • )最后一个CSV文件的顺序应确保首先列出发出最多请求的IP

  • )发出相同数量请求的IP应在它们之间排序,并首先列出更大值的IP八位字节

  • )第一列应包含请求数,第二列将包含发出请求的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”

    使用此
    Regex
    您将能够只匹配有效的IP,如果没有匹配的IP,它将继续
    ,而
    循环(根据
    if
    语句)

    添加名称空间

    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检查正则表达式:

    您可以从nugget安装TX.Windows:

    PM>安装软件包Tx.Windows

    然后像这样使用它:

            var iisLog = W3CEnumerable.FromFile(pathToLog);
            List<string> IpsLog = new List<string>();
            foreach (var item in iisLog)
            {
                IpsLog.Add(item.c_ip);
            }
    
    var iisLog=W3CEnumerable.FromFile(pathToLog);
    List IpsLog=新列表();
    foreach(iisLog中的var项目)
    {
    IpsLog.Add(项目c_ip);
    }
    

    如果日志文件被另一个进程使用,您可以使用W3CEnumerable.FromStream

    执行此类任务,了解源数据的格式始终很重要。它看起来像是来自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)_uuutma=228961600.1845892080.1265608268.1279440521.1279522956.43我认为它需要以某种方式逐行读取和解析,以便整个内容最终在一个DB表中完成排序/问题是,如何完成这部分?IIS支持3种开箱即用格式和插件,以几乎任何格式存储日志。但是如果您没有更改任何设置,它可能是W3C扩展日志文件格式(请参阅)。请注意,此格式中的每一行都不相同,有些行是“指令”这描述了其他行的结构,这些行以#开头。此外,使用配置设置,有时可以通过文件的一部分添加或删除列。因此,最好使用预编写的解析器。Yann建议下面的方法似乎是一个合理的选择。1.我认为这样做的方式是读取日志的每一行le进入一个列表LogFileList=new list();某种类型。2.现在我们有了列表中的日志文件行,我们运行该列表,并在第一次通过时消除从以“207.114”开头的IP发出的请求。3.再次运行并消除端口80上的非GET行。4.现在我们创建第二个列表=LogFileResults=new 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#中执行此操作?我将如何使用此功能将整个日志文件解析为SQL表或我们可以使用的可排序的内容?我编辑了上面的答案,似乎需要进行大量排序才能完成此操作。我将如何使用此功能将整个日志文件解析为SQL表或其他可排序的内容ortable我们可以使用?我编辑了上面的答案,似乎需要进行大量排序才能完成。我曾考虑过使用LogParser,但有没有一种方法可以使用代码来做同样的事情?我如何使用它将整个日志文件解析成SQL表或我们可以使用的可排序的东西?我编辑了我的答案abov我曾经考虑过使用LogParser,但是有没有办法用代码来做同样的事情呢?
            var iisLog = W3CEnumerable.FromFile(pathToLog);
            List<string> IpsLog = new List<string>();
            foreach (var item in iisLog)
            {
                IpsLog.Add(item.c_ip);
            }