Opensource: практический опыт использования. Ротация логов на FreeBSD.

Есть у меня один сервер, который был создан аж в 2003 году. Стоит на нем FreeBSD 4.9. С того момента все работало отлично, ну а зачем трогать работающую систему ? Однако захотелось большего. Дошло до меня, что логи nginx-а приходится просто раз в несколько месяцев грохать вручную. И решил я этот процесс автоматизировать, т.е. настроить ротацию.

Как этот процесс выглядит под Windows: находим небольшую бесплатную утилитку, ставим ее, конфигурим через простенький GUI. Весь процесс занимает минут 5. 

Ниже пойдет рассказ, как этот совсем простой процесс происходит на опенсорс системе не последней версии. Рекомендуемый способ ротации логов нашелся очень быстро. Есть утилита logrotate, которая входит в packages FreeBSD. Ее-то я и пытался установить… в течение целого дня.

Нахожу нужный package, набираю "make install clean". Идет обращение к куче разных серверов и… нету там этой программки. Точнее нет той версии, которая прописана в package 2003 года. Понимаю, что packages надо обновить.

Нахожу документацию по обновлению packages. Оно делается утилитами, которые опять же не установлены по умолчанию (представьте себе, что Windows Update придется откуда-то качать). Одна из трех утилит собралась. Это уже хорошо. Вытягиваю актуальные packages, обновляю. Наверно это единственный этап, который прошел без танцев с бубном.

Установилась новая версия package для logrotate. Запускаю make — на сервере файл находится. А потом выясняется, что просто так такую простую утилитку не собрать… Для нее надо столько всего, что я просто офигел. В первую очередь зависит она от библиотеки popt. Это просто набор функций, разбивающих командную строку на параметры. Но сколько же всего нужно этому, извиняюсь, попту…

Сначала попт ругнулся, что у меня не та версия libtool. Нашел в packages, что можно установить версию 2.2. Качаю, ставлю… make в какой-то момент ругается, что у меня нет "C99" компилятора. Лезу изучать что это такое… Да — gcc стоит версии 2.9.5, а C99 поддерживает версия 3.0. В packages полно версий gcc. Думаю, сейчас поставлю самый последний (4.6) и будет мне щастье… Ага — как же. После 20 минут сборки получаю ту же ошибку — gcc 4.6 опять же надо собирать C99 компилятором. Это вам не Visual Studio 2010 поставить, это значительно сложнее. Ладно, пытаюсь собрать версию 3.2. В какой-то момент получаю еще какую-то невнятную ошибку от make. Лезу искать. Оказывается make почему-то решил, что в системе стоит 2 процессора и пытается запустить еще один тред для сборки. Чтобы он этого не делал (ну это ведь так сложно — проверить количество процессоров), нужно в /etc/make.conf прописать соответствующую директиву. Пошла сборка gcc32… Оппа — не хватает какого-то bison-а. Нахожу что этот bison опять же есть новый, собираю вручную. Собрался gcc32 за 40 минут. Еще минут 15 ушло на изучение вопроса, как сделать, чтобы make вызывал его, а не старую версию.

Собираю libtool. Потом попт начинает требовать последнюю версию gettext (который создает библиотеку libintl). При этом так странно предупреждает, что "вы конечно можете установить последнюю версию". Не требует, не собирает автоматически, а именно предупреждает. Ладно, начинаю собирать gettext… А вот его почему-то выложили не в обычном "tar.gz" формате, а в файле с расширением .lzma. Для открытия этих файлов нужен архиватор XZ. Он собрался автоматически, но, сцуко, не работает. Просто говорит "мне не хватает памяти" и ничего не делает. Поиском нашлось, что это жутко передовая технология, она использует очень много памяти, но при этом очень эффективно сжимает данные. Может, говорят, и несколько гигабайт легко использовать для декомпрессии. Но мне от этого не легче — на моей машине оно просто не работает. Ради интереса посмотрел packages на другом сервере (там последняя версия FreeBSD стоит). А там этот package сделан нормально — в tar.gz. Убираю из конфига "USE_XZ", прописываю новые контрольные суммы в другом конфиге. Оппа — скачался gettext. 

Но дальше ждет еще одна засада… gettext установил новую библиотеку libintl.so. Я это сразу понял, потому что перестал запускаться Midnight Commander. Говорит, нету libintl.so.5. Лезу изучать этот вопрос… Оказывается "по науке" после установки новой версии libintl нужно пересобрать весь софт, который ее использует. Поскольку эта перспектива мне не очень понравилась, лезу изучать дальше. Нахожу совет умного человека: найди эту библиотеку и просто сделай хард линк. Нахожу, что теперь она называется libintl.so.9, делаю линк. Все заработало !

Так, чем мы там изначально занимались ? Я уже и подзабыл. Ах да — мы пытались собрать popt, который требует logrotate. И он собрался. Все собралось, кроме его внутреннего теста. А на внутреннем тесте линкер просто не находит пару функций, работающих с юникодом. Оказывается, ядро у меня собрано без поддержки юникода. Плюнул я на это дело, ядро пересобирать не стал. Просто за 15 минут написал скриптик для шелла, который архивирует логи. Не такой продвинутый, как пресловутая утилита logrotate, но мне хватает.

Зачем обычной крутилке логов поддержка юникода, куча библиотек и прочего, я не понимаю. Видимо не дорос я еще до религии Opensource.

Да — на сервере с последней версией FreeBSD эта утилита собралась за 10 минут.

3 комментария Opensource: практический опыт использования. Ротация логов на FreeBSD.

  • pablo

    Спасибо, посмеялся. 🙂
    Религия основы "религии опен соурс", в системном подходе к решению проблемы и достаточном предварительном анализе.
    В данном случае нужно было потратить 15 минут на мысль о том, что сама система также пишет логи (с года 2003) и при этом разделы не переполняются и всё каким то образом организовано. Потом быстрый поиск по документации/гуглу, кому что привычнее и утилита newsyslog быстро находится. Включена в состав Freebsd с какой-то 3.махровой_ветки. Системные логи архивируются с её помощью. Еще две минуты на правку newsyslog.conf и задача решена.
    Нескромный вопрос, сколько стоит ваше время что вы себе так спокойно позволяете потратить целый день на решение проблемы не относящейся напрямую к профилю работы?

  • newsyslog я нашел в первую очередь. Меня не устроил принцип его работы. logrotate лучше (иначе бы никто ее писать не стал, если она ничем от newsyslog не отличается). 

    Рабочее время стоит недешево 🙂 Но я могу себе позволить тратить его так, как мне этого хочется. ? делать то, что мне интересно. В тот момент было просто интересно разобраться.

  • Alex

    "Просто за 15 минут написал скриптик для шелла, который архивирует логи. "
    Вот это правильно, подход настоящего программиста. 
    "Настоящий программист не ищет утилиты ротации логов. Он пишет функцию log заново".
    Недавно один коллега как раз делал такую, в общей сложности растянулось на месяц и баги еще есть.
     

Leave a Reply to pablo Cancel reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>