Разобрать файл журнала IIS - есть ли альтернатива LogParser

Мне нужно проанализировать файл журнала IIS. Есть ли альтернатива LogParser, простой класс для запроса файла журнала?

Мне нужно только знать, сколько запросов я получаю между 2 датами.

Вот пример файла журнала 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

5 ответов

Решение

Вы можете использовать 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

Это 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/

Вы можете использовать IISLogParser и установить его через Nuget, он поддерживает большие файлы (> 1 Гб)

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

Я использую функцию фильтра инструмента CMTrace.exe (см. снимок экрана):

Если вы имеете дело с большими объемами и / или рассредоточенными расположениями файлов журналов IIS, SpectX - удобный инструмент для этого, потому что вам не нужно загружать журналы и можно запускать запросы непосредственно к нескольким необработанным файлам. Средняя скорость обработки на ядро ​​- 350 МБ / сек.

Это не открытый исходный код, но полнофункциональная 30-дневная пробная версия бесплатна.

Учебники:Анализ журналов IIS. Анализ логов IIS - 20 примеров запросов.

Чтобы отфильтровать период времени, отсортируйте журналы по дате и отфильтруйте нужный период, например:

    | 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'));
Другие вопросы по тегам