Назад | Перейти на главную страницу

Слияние больших журналов 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, который будет работать, поскольку того, что я придумал, недостаточно.

P.S. Я знаю, что, вероятно, мог бы написать программу слияния в .NET, поскольку все отдельные журналы уже отсортированы, и поэтому мне не нужно было бы читать больше, чем несколько строк за раз, но я стараюсь избегать этого, если это возможно. .

Учитывая, что вы сталкиваетесь с проблемами при попытке отсортировать данные за один день, я бы выбрал одну из двух стратегий.

  1. Найдите лучший сорт. Посмотрите, сможете ли вы заставить инструмент сортировки Windows работать на вас. Журналы сначала настраиваются с указанием даты и времени в удобном для сортировки ascii-текстовом формате. Он использует намного меньше памяти и не должен разбирать строки для сортировки. Держу пари, это работает для вас.

  2. Напишите чередование, которое открывает все 14 файлов и вытягивает самую раннюю строку сверху каждого, проходя через 14 файлов одновременно. Я содрогаюсь при мысли об этом, но для этого не потребуется 64 КБ памяти для каждого файла.

старый ответ:

Разделяй и властвуй. Напишите один сценарий, который считывает журналы и помещает их в новые файлы по дате, с известным именем файла, в котором указана дата (weblog-20110101.log). Выполните сортировку каждого файла по времени. Соберите нужные файлы вместе.