Объединение больших журналов IIS
Я планирую использовать Webalizer для анализа и построения графиков наших журналов IIS, но поскольку у нас есть ферма серверов, Webalizer требует от меня убедиться, что все журналы расположены в хронологическом порядке (иначе он начнет пропускать результаты).
Наши журналы хранятся в сжатом виде, поэтому я начал с разархивирования всего, чтобы разделить файлы, а затем я использовал LogParser 2.2 для объединения этих файлов. Моя команда LogParser была:
LogParser.exe -i:iisw3c "select * into combinedLogFile.log from *.log order by date, time" -o:w3c
Я, вероятно, не нуждаюсь *, но мне нужны большинство полей, потому что они нужны Webalizer. Это прекрасно работает с некоторыми из моих журналов, однако один из кластеров нашей фермы серверов генерирует МНОГО журналов, у нас есть 14 серверов, на которых журналы каждого сервера составляют (как минимум) 2,5 ГБ в день (каждый журнал находится в отдельный день). Поэтому, когда я пытаюсь объединить эти журналы, LogParser просто падает с бессмысленной общей ошибкой.
Я предположил, что это была проблема с памятью, и поэтому я попытался несколькими способами попытаться минимизировать память.
Я использую PowerShell для вызова LogParser, и поэтому я начал пытаться передавать данные с использованием стандартного конвейера Powershell. (Это вызвало OutOfMemoryException в Powershell (вместо LogParser) раньше, чем использование файлов любым возможным способом).
В конце концов я закончил с использованием нескольких именованных каналов, вызываемых из вызова пакетного файла в "Cat", напрямую передавая это в LogParser... и я вернулся к тому, с чего начал, когда предварительно их сжал.
У нас есть другие сценарии, которые обрабатывают те же самые файлы журналов, и ни у одного из них нет проблем (хотя их вывод, как правило, меньше, чем этот).
Поэтому я просто хочу знать, есть ли у вас какие-либо идеи о лучшем способе слияния всех этих файлов или какой-либо сценарий LogParser, который будет работать так, как того, который я создал, недостаточно.
PS Я знаю, что мог бы написать программу слияния в.NET, так как все отдельные журналы уже отсортированы, и поэтому мне не нужно читать больше нескольких строк одновременно, но я стараюсь избегать этого, если возможный.
1 ответ
Учитывая, что вы сталкиваетесь с проблемами, пытаясь отсортировать данные за один день, я бы выбрал одну из двух стратегий.
Найдите лучший сорт. Посмотрите, сможете ли вы заставить инструмент сортировки Windows работать на вас. Журналы сначала содержат дату и время в удобном для ascii-текстового формата формате. Он использует намного меньше памяти и не должен анализировать строки для сортировки. Держу пари, это работает для вас.
Напишите чередование, которое откроет все 14 файлов и вытянет самую раннюю строку сверху каждого, пробираясь через 14 файлов одновременно. Страшно подумать об этом, но для каждого файла не потребуется 64 КБ памяти.
старый ответ:
Разделяй и властвуй. Напишите один скрипт, который читает журналы и помещает их в новые файлы по дате, с известным именем файла, в котором есть дата (weblog-20110101.log). Запустите сортировку для каждого файла, который сортирует по времени. Cat файлы, которые вам нужны вместе.