我的程序从服务器日志文件读取IP地址时出现错误

本文关键字:地址 错误 IP 读取 程序 服务器 日志 文件 我的 | 更新日期: 2023-09-27 17:49:15

我是c#新手,有一个问题。

我的服务器有像

这样的日志文件行

2015-05-14 20:56:50 72.167.255.87 GET//电子邮件/site_05_12_2015/email-contactus-button.png图像Mozilla/5.0+(兼容;+MSIE+9.0;+Windows+NT+6.2;+WOW64;+Trident/7.0;+Microsoft+Outlook+15.0.4711;+Microsoft+Outlook+15.0.4711;+ms-office;+ moffice +15)304 0 0 46

和我的程序旨在收集请求某个资产的唯一IP地址。在上面的行中,如果程序正在搜索"email-contactus-button.png",我将提取"50.48.46.50"

在这里:

using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Collections.Generic; 

class Test
{
    static void Main(string[] args)
    {
        // args[0] = expression to search for, e.g. "cloudrealized-email-top-banner"
        try
        {
            string [] logs = System.IO.Directory.GetFiles(System.IO.Directory.GetCurrentDirectory());
            Console.WriteLine("{0} log files found", logs.Length);
            HashSet<string> ipList;
            string ipreg = "^(?:[0-9]{1,3}'.){3}[0-9]{1,3}$";
            foreach (string thislog in logs)
            {
                using (StreamReader sr = new StreamReader(thislog))
                {
                    Console.WriteLine("Checking log file {0} for expression '{1}' ...'n", thislog, args[0]);
                    String line = sr.ReadToEnd();
                    if (line.Contains(args[0]))
                    {
                        Match thisip = Regex.Match(line,ipreg);
                        thisip = thisip.NextMatch();
                        if (thisip.ToString() != args[1]) ipList.Add(thisip);
                    }
                    //for (Match m = Regex.Match(line,regx); m.Success; m = m.NextMatch()) ++count;
                }
            }
            Console.WriteLine("'n'nRESULT:'n'nThe asset {0} was requested {1} times.", args[0], ipList.Count());
            Console.WriteLine("Unique IPs:");
            foreach (string s in ipList) Console.WriteLine(s);
        }
        catch (Exception e)
        {
            Console.WriteLine("Error occured: ");
            Console.WriteLine(e.Message);
        }
    }
}

我得到的第一个编译器警告是在

string ipreg = "^(?:[0-9]{1,3}'.){3}[0-9]{1,3}$";

因为它认为我试图转义.字符。我怎样才能解决这个问题呢?

另外两个警告是关于我在iplist上调用的方法。他们没有被认出来,我不知道为什么。我正在寻找的HashSet的文档是https://msdn.microsoft.com/en-us/library/bb359438%28v=vs.110%29.aspx.

我的程序从服务器日志文件读取IP地址时出现错误

下面是一个基本的c#示例,使用正则表达式提取IP地址。这是假设所有日志文件的结构都是相同的。

string strRegex = @"(?<=-'s)([0-9]{1,3}'.){3}[0-9]{1,3}";
Regex myRegex = new Regex(strRegex, RegexOptions.None);
string strTargetString = @"2015-05-14 20:56:50 72.167.255.87 GET /images/email/site_05_12_2015/email-contactus-button.png - 80 - 50.48.46.50 Mozilla/5.0+(compatible;+MSIE+9.0;+Windows+NT+6.2;+WOW64;+Trident/7.0;+Microsoft+Outlook+15.0.4711;+Microsoft+Outlook+15.0.4711;+ms-office;+MSOffice+15) 304 0 0 46";
foreach (Match myMatch in myRegex.Matches(strTargetString))
{
    if (myMatch.Success)
    {
    // Add your code here
    }
}