Исходные данные:
имеется n-ое (от 10 и больше) количество стандартныйх combined логов за один период времени (сутки). Суммарный размер логов под гиг, может больше.
Задача:
слить эти логи в один в отсортированном по времени виде, т.е. мне нужно получить такой файл, как будто бы этот лог писался одним единственным Апачем.
Мысли есть, но все какие-то костыльно-кривые и маловразумительные. Пока двигаются в напралении выдергивания даты, преобразования ее в таймштап, сортировки по таймштампу, преобразования таймштампа назад и записи, но как и на чем это сделать не могу придумать. Особено смущает, что придется гиг, а то и больше, загонять в операч. Был у меня уже такой чудо-скрипт, пришлось на Питоне переписать. И почему-то мне кажется, что решение не сложное, просто я что-то очевидное упускаю.
Слияние нескольких логов Apache в один (Натолкните на мысль пожалуйста)
Модератор: Модераторы разделов
-
Devon
- Сообщения: 101
- ОС: Debian, Mac, SlackHat :)
-
rm_
- Сообщения: 3340
- Статус: It's the GNU Age
- ОС: Debian
Re: Слияние нескольких логов Apache в один
Приведите пример записи в логе.
-
Devon
- Сообщения: 101
- ОС: Debian, Mac, SlackHat :)
Re: Слияние нескольких логов Apache в один
Вот пример, обычный комбинированный лог.
Появилась идея, как реализовать это на Питоне, считывая строки из файлов построчно, но блин отвлекли другим делом, да и не факт, что это будет простейшее решение.
З.Ы. Перл практически не знаю, тут я пасс, если что.
Код:
95.78.138.178 - - [16/Jan/2009:00:49:38 +0300] "GET /favicon.ico HTTP/1.1" 200 0 "http://site.ru/" "Opera/9.62 (Windows NT 5.1; U; ru) Presto/2.1.1"
95.78.138.178 - - [16/Jan/2009:00:50:10 +0300] "GET /img/magic/ HTTP/1.1" 200 16732 "http://site.ru/" "Opera/9.62 (Windows NT 5.1; U; ru) Presto/2.1.1"
89.207.177.7 - - [16/Jan/2009:00:51:43 +0300] "GET / HTTP/1.0" 200 54083 "-" "check_http/v1759 (nagios-plugins 1.4.10)"Появилась идея, как реализовать это на Питоне, считывая строки из файлов построчно, но блин отвлекли другим делом, да и не факт, что это будет простейшее решение.
З.Ы. Перл практически не знаю, тут я пасс, если что.
-
rm_
- Сообщения: 3340
- Статус: It's the GNU Age
- ОС: Debian
Re: Слияние нескольких логов Apache в один
Devon
Мне видится решение из двух частей:
1) Сконвертировать дату "16/Jan/2009:00:49:38 +0300" в формат UNIX Timestamp, представляющий из себя кол-во секунд с 1970-го года; добавить это число в самое начало каждой записи. Это можно сделать на питоне, построчно. Грузить и держать всё в оперативке - не обязательно.
2) Шелл-скриптом слить все файлы в один, после чего с помощью программы sort (ключ -n) отсортировать записи. Они окажутся отсортированными по timestamp'у (который мы добавили в их начало), а значит - по дате.
Почему две части - чтоб не слишком уж активно ворочать гигабайтными файлами на питоне. Есть мнение, что простые cat и sort с этим управятся гораздо быстрее.
Мне видится решение из двух частей:
1) Сконвертировать дату "16/Jan/2009:00:49:38 +0300" в формат UNIX Timestamp, представляющий из себя кол-во секунд с 1970-го года; добавить это число в самое начало каждой записи. Это можно сделать на питоне, построчно. Грузить и держать всё в оперативке - не обязательно.
2) Шелл-скриптом слить все файлы в один, после чего с помощью программы sort (ключ -n) отсортировать записи. Они окажутся отсортированными по timestamp'у (который мы добавили в их начало), а значит - по дате.
Почему две части - чтоб не слишком уж активно ворочать гигабайтными файлами на питоне. Есть мнение, что простые cat и sort с этим управятся гораздо быстрее.
-
Devon
- Сообщения: 101
- ОС: Debian, Mac, SlackHat :)
Re: Слияние нескольких логов Apache в один
rm_
благодарю! Идея впихнуть таймштамп в начало строки и прогнать sort-ом мне в голову не приходила. Из адекватных пришла после небольшого совещания только считывать из каждого из конфигов одну строку, сравнивать с остальными строками из других конфигов, и если она меньшая по дате, то писать ее в общий лог и читать следующую, и снова круговое сравнение. Попробую реализовать оба варианта, посмотрим какой будет более быстрым и менее ресурсоемким, в Вашем ведь еще придется потом питоном или awk отрезать таймштамп, что еще прибавляет время обработки.
благодарю! Идея впихнуть таймштамп в начало строки и прогнать sort-ом мне в голову не приходила. Из адекватных пришла после небольшого совещания только считывать из каждого из конфигов одну строку, сравнивать с остальными строками из других конфигов, и если она меньшая по дате, то писать ее в общий лог и читать следующую, и снова круговое сравнение. Попробую реализовать оба варианта, посмотрим какой будет более быстрым и менее ресурсоемким, в Вашем ведь еще придется потом питоном или awk отрезать таймштамп, что еще прибавляет время обработки.
-
Devon
- Сообщения: 101
- ОС: Debian, Mac, SlackHat :)
Re: Слияние нескольких логов Apache в один
Написал по варианту rm_ - питон обрабатывает логи построчно, потом они сортируются уже sort -n и вырезается таймштамп sed-ом. При обработке самого злого набора логов в 1,4 гига sort сожрал около 256 Мб оперативки, что в общем для сервера, где ведется обрабока, приемлемо. В свободное от неотложных дел время попробую переписать на питоне полностью, пока пусть так живет. Всем спасибо!
-
rm_
- Сообщения: 3340
- Статус: It's the GNU Age
- ОС: Debian
Re: Слияние нескольких логов Apache в один
Devon
Отлично.
Если Вы поправите Питоновский добавляющий таймстемпы скрипт таким образом, чтобы он всегда добавлял фиксированное кол-во символов (с запасом, к примеру пятнадцать: 000001234567890), вырезать эти таймстемпы можно будет даже не sed'ом, а программой colrm, что, вероятно, быстрее.
Отлично.
Если Вы поправите Питоновский добавляющий таймстемпы скрипт таким образом, чтобы он всегда добавлял фиксированное кол-во символов (с запасом, к примеру пятнадцать: 000001234567890), вырезать эти таймстемпы можно будет даже не sed'ом, а программой colrm, что, вероятно, быстрее.
-
Devon
- Сообщения: 101
- ОС: Debian, Mac, SlackHat :)
Re: Слияние нескольких логов Apache в один
Спасибо, поэксперементирую по-разному. Главное пока работает приемлемо, созданные этим способом логи парсятся во всю сейчас, без ошибок.