【问题标题】:Parse IIS log file - is there an alternative to LogParser解析 IIS 日志文件 - 是否有 LogParser 的替代方法
【发布时间】:2020-06-26 05:47:04
【问题描述】:

我需要解析一个 IIS 日志文件。是否有任何LogParser 的替代品,一个查询日志文件的简单类?

我只需要知道我在两个日期之间收到了多少请求。

这是 iis 日志文件的示例:

#Software: Microsoft Internet Information Services 7.5
#Version: 1.0
#Date: 2014-08-26 12:20:57
#Fields: date time s-sitename s-computername s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs-version cs(User-Agent) cs(Cookie) cs(Referer) cs-host sc-status sc-substatus sc-win32-status sc-bytes cs-bytes time-taken
2014-08-26 12:20:57 W3SVC1 QXXXSXXXX 172.25.161.53 POST /XXXX/XXX/XXXX/XXXXX/1.0/XXXX/XXXXXXXX/xxxxxx.svc - 443 - 999.99.999.999 HTTP/1.1 - - - xxxx.xxxx.xxx.xxx.xxxx.xxxx.xxx.com 200 0 0 4302 5562 1560

【问题讨论】:

  • 你能告诉我们IIS日志的结构和示例行吗? PowerShell 和正则表达式在这里看起来像是一个很好的临时解决方案。

标签: c# parsing iis-logs tx


【解决方案1】:

你可以使用Tx (LINQ to Logs and Traces),你可以通过nuget安装它

并像这样使用它:

var iisLog = W3CEnumerable.FromFile(pathToLog);
int nbOfLogsForLastHour = iisLog.Where(x => x.dateTime > DateTime.Now.AddHours(-1)).Count();

如果日志文件被其他进程使用,可以使用W3CEnumerable.FromStream

【讨论】:

  • 不工作,不编译,当设置为框架 4.0 时编译为框架 4.5(如果更改则重置自身),并且似乎不是一个简单的日志解析器。将二进制文件输出到 c:\bin\debug... BS。为什么 LogParser 需要不安全的代码?为什么 logparser 需要平台依赖项?为什么设置为 4.0 时会为 4.5 生成二进制文件?为什么 1 个 logparser 需要 6 个 dll?为什么它甚至需要 Linq ? BS。大专业的BS。唯一可能成为 BS 代码更糟糕示例的就是将 Microsoft Log-Parser 与 COM-Interop 结合使用。
【解决方案2】:

现在是 2017 年,LogParser 仍然是封闭源代码。此外,云解决方案提供的所有工具似乎都使解析 IIS 日志的需求成为过去。但由于我也在处理遗留应用程序,所以我使用 .NET 核心编写了这个简单的解析器。

using System;
using System.IO;
using W3CParser.Extensions;
using W3CParser.Instrumentation;
using W3CParser.Parser;

namespace W3CParser
{
    class Program
    {
        static void Main(string[] args)
        {            
            var reader = new W3CReader(File.OpenText(args.Length > 0 ? args[0] : "Data/foobar.log"));

            using (new ConsoleAutoStopWatch())
            {
                foreach (var @event in reader.Read())
                {
                    Console.WriteLine("{0} ({1}):{2}/{3} {4} (bytes sent)",
                                      @event.Status.ToString().Red().Bold(),
                                      @event.ToLocalTime(),
                                      @event.UriStem.Green(),
                                      @event.UriQuery,
                                      @event.BytesSent);
                }
            }
        }
    }
}

源码:https://github.com/alexnolasco/32120528

【讨论】:

  • 恕我直言,您应该从中制作一个 nuget
【解决方案3】:

你可以使用IISLogParser,通过nuget安装,它支持大文件(> 1Gb)

List<IISLogEvent> logs = new List<IISLogEvent>();
using (ParserEngine parser = new ParserEngine([filepath]))
{
    while (parser.MissingRecords)
    {
        logs = parser.ParseLog().ToList();
    }
}

【讨论】:

    【解决方案4】:

    如果您正在处理大量和/或分散位置的 IIS 日志文件,那么SpectX 是一个方便的工具,因为您不必摄取日志,并且可以直接在多个原始文件上运行查询.每个内核的平均处理速度 - 350MB/秒。

    它不是开源的,而是全功能的30-day trial is free

    教程: Parsing IIS logsAnalyzing IIS logs - 20 sample queries

    要过滤时间段,请按日期对日志进行排序并过滤您需要的时间段,例如:

        | sort(date_time desc)
        | filter(date_time > T('2019-11-01 08:48:20.000 +0200')) 
        | filter(date_time < T('2019-11-05 11:48:20.000 +0200'));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多