Я планирую использовать 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, поскольку все отдельные журналы уже отсортированы, и поэтому мне не нужно было бы читать больше, чем несколько строк за раз, но я стараюсь избегать этого, если это возможно. .
Учитывая, что вы сталкиваетесь с проблемами при попытке отсортировать данные за один день, я бы выбрал одну из двух стратегий.
Найдите лучший сорт. Посмотрите, сможете ли вы заставить инструмент сортировки Windows работать на вас. Журналы сначала настраиваются с указанием даты и времени в удобном для сортировки ascii-текстовом формате. Он использует намного меньше памяти и не должен разбирать строки для сортировки. Держу пари, это работает для вас.
Напишите чередование, которое открывает все 14 файлов и вытягивает самую раннюю строку сверху каждого, проходя через 14 файлов одновременно. Я содрогаюсь при мысли об этом, но для этого не потребуется 64 КБ памяти для каждого файла.
старый ответ:
Разделяй и властвуй. Напишите один сценарий, который считывает журналы и помещает их в новые файлы по дате, с известным именем файла, в котором указана дата (weblog-20110101.log). Выполните сортировку каждого файла по времени. Соберите нужные файлы вместе.