Ограничение размера логов linux

Обновлено: 07.07.2024

Написать заметку по настройке ротации логов в logrotate меня побудило то, что постоянно забываю все сделать правильно. Запишу все нюансы, заодно с остальными поделюсь информацией. Речь пойдет о ротации лог файлов по достижении ими определенного размера.

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужно пройти .

Это будет короткая заметка про конкретную настройку. Подробно описывать работу logrotate не буду, так как в интернете и так полно материала на эту тему.

Для примера буду описывать ротацию логов nginx. После установки nginx, вы получите следующий конфиг для ротации логов - /etc/logrotate.d/nginx.

Все не указанные явно параметры будут браться из дефолтного конфига /etc/logrotate.conf.

Для того, чтобы защитить сервер от заполнения всего свободного пространства диска логами access.log, ротация раз в день не подходит. Тебе за час без напряга смогут забить весь диск логами. Лучше настроить ротацию по достижении определенного размера файла. Для этого вы используете параметр:

И ждете, что по достижении размера файла access.log в десять мегабайт, будет произведена ротация. На самом деле не будет. По-умолчанию, logrotate запускается раз в сутки, поэтому он при всем желании не сможет следить за размером файла и ротировать его чаще, чем раз в сутки.

За его запуск отвечает скрипт в директории /etc/cron.daily/logrotate. Для того, чтобы logrotate мог проверять размер лог файла хотя бы раз в час, скрипт запуска надо перенести в директорию /etc/cron.hourly. А для более частой проверки, добавить его напрямую в cron с нужным интервалом запуска. Например, раз в 5 минут.

Допустим вы все это сделали, но логи все равно не будут ротироваться при достижении заданного размера. Понять, в чем же теперь проблема, не так просто. При запуске logrotate вы не увидите никаких ошибок. Он просто ничего не будет делать. Понять, в чем проблема, можно только при запуске в режиме отладки. Там вы увидите ошибку, если в этот день ротация уже была хотя бы раз.

Смысл тут в том, что logrotate сегодня уже произвел ротацию и создал архив лога с определенным именем и второй раз такой же файл он сделать не может. А маска имени файла при создании настроена в формате %Y%m%d. За эту маску отвечает параметр в /etc/logrotate.conf:

Самый простой вариант - это просто закомментировать этот параметр, тогда все архивы логов будут иметь следующую маску в файлах:

И так далее. Если же вам хочется сохранить исходный формат лога для всех файлов, а для тех, что ротируются по размеру, настроить другую маску имени, используйте дополнительный параметр:

Таким образом, чтобы настроить ротацию лог файла, например, aceess.log, по достижении определенного размера, вам нужно:

  1. Запускать через cron logrotate с достаточно высокой периодичностью, например раз в час или чаще.
  2. Настроить маску файла для архива лога, чтобы она была уникальной в каждый момент запуска logrotate.

Вот пример для ротации конфигов nginx или apache по достижении размера лог файла в 10 мегабайт.

Не забудьте создать директорию /var/log/nginx/old для хранения старых логов. На этом у меня все по ротации логов в logrotate с учетом размера файла.

У меня на компьютере моей мамы работает Ubuntu 12.04 LTS. Он работал просто отлично, но весь внезапный системный журнал заполнялся. И, заполняя, я имею в виду, что я только что удалил /var/log/syslog файл размером 400 ГБ. Да - гигабайты

Хотя я уверен, что там была некоторая полезная информация, я не уверен, что 400 ГБ - это какая-либо информация, которую нужно просеять. И что на самом деле удивительно, так это то, что это произошло в течение 8 часов - я бегал df около полудня, и между тем и сейчас ее драйв заполнил 30% (от чуть менее 70% до 100%).

РЕДАКТИРОВАТЬ Похоже, USB является преступником:

Я попробовал это перед тем, как потерять файл - казалось, ничего не повторилось, но я еще раз посмотрю Так что, похоже, проблема в "demond_nscan", о котором я ничего не нахожу в Google. nscan это приложение для сканирования портов, так что это может быть чья-то модификация (но я просто теоретизирую). Если это не приложение, которое вы явно пытаетесь запустить, я рекомендую попытаться найти исполняемый файл (что-то вроде find / -iname demond_nscan ) и переименовать его / изменить его разрешения, чтобы он не выполнялся. (Таким образом, если это действительно важно для чего-то, вы не потеряли его, и если это было запущено чем-то другим, вы могли бы заметить. Кроме того, проверьте crontab -l ? Похоже, что demond_nscan связан с драйверами сканирования lexmark.

Тем не менее, до тех пор вы можете положить в базу ротации бревен на одном из следующих.

  • время (например, вращаться каждый день)
  • размер (например, поворот, когда файл достигает 10 МБ)

Это уже будет установлено в системе по умолчанию: /etc/logrotate.d/rsyslog

Отсюда видно, что он будет ежедневно вращать файл / var / log / syslog и хранить 7 копий повернутого файла.

Вы можете изменить это, чтобы повернуть на ограничение размера, скажем, 1 МБ или уменьшить количество копий, которые он хранит.

Предупреждение: это не устранит основную причину вашей проблемы , однако выиграет вам некоторое время, так как остановит заполнение файловой системы.

  • Источник: /etc/logrotate.d/rsyslog
  • Источник: man logrotate

Ограничить размер logrotate

Откройте /etc/logrotate.d/syslog файл конфигурации

Файл выглядит как что-то. нравиться

Добавьте, например, size 100k в скобках. После этого это должно выглядеть так:

Обратите внимание, что это ограничивает размер вращающихся файлов, а не фактический файл системного журнала. Сохраните файл. При следующем запуске задания logrotate chron будет ограничен размер повернутых журналов.

Ограничить размер текущего системного журнала

Чтобы ограничить размер /var/log/syslog , вы должны отредактировать /etc/rsyslog.d/50-default.conf и установить фиксированный размер журнала.

Добавьте или измените этот параметр, изменив следующую строку в /etc/rsyslog.d/50-default.conf :

Здесь максимальный размер составляет 1 МБ, поместите эту строку перед *.*; . строкой

В Linux, большинство сервисов и программ, которые работают в фоне, таких как Apache, Nginx, Postfix и других записывают информацию о своем состоянии, результатах работы и ошибках в лог файлы. Стандартное расположение логов или как их еще называют - журналов - в папке /var/log.

С помощью анализа логов вы можете понять что работает не так, почему произошла ошибка и как решить возникшую проблему. Но тот кроется одна проблема. Размер логов постоянно растет и они занимают все больше и больше места на диске, поэтому необходимо вовремя чистить логи и удалять устаревшие записи, чтобы они не мешали нормально работать. Это можно делать вручную время от времени или настроить скрипты Cron, но есть еще более простой вариант - утилита logrotate. В этой статье будет рассмотрена настройка logrotate и ее использование.

Как работает Logrotate?

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

Проверку условий можно настроить ежедневно, еженедельно или ежемесячно. Это позволяет создать схему ротации логов, удобную именно для вас и вашего сервера. Также ротация логов может быть полезна на домашнем компьютере, но здесь она не так важна как на серверах, где только в логи Apache могут записываться до сотен тысяч строк ежедневно.

Настройка Logrotate

Logrotate - это популярная утилита, поэтому в большинстве дистрибутивов она поставляется по умолчанию. Вы можете убедиться, что программа установлена в вашем дистрибутиве, попытавшись ее установить. Например, в CentOS:

sudo yum install logrotate


Или в Ubuntu и основанных на ней дистрибутивах:

sudo apt install logrotate

Теперь, даже если утилита не была установлена, вы ее установите. Все основные настройки программы находятся в файле /etc/logrotate.conf, дополнительные настройки, касаемо правил и других возможностей могут быть размещены в папке /etc/logroate.d/. Вы можете размещать все настройки logroatae прямо в основном конфигурационном файле, будет более правильно, если настройки для каждого отдельного сервиса будут находиться в отдельном файле, в папке /etc/logrotate.d/.

Чтобы конфигурационные файлы из этой папки загружались программой, необходимо добавить в основной конфигурационный файл такую строчку:


Просто убедитесь что она там уже есть. Сначала давайте рассмотрим основные директивы, которые мы будем применять во время настройки. Здесь директивы выглядят не совсем обычно, сама директива и определяет что и когда нужно делать, а уже если нужно, ей передаются дополнительные параметры. Чтобы указать как часто нужно выполнять проверку совпадению условий используются такие директивы:

Основные директивы управления и обработки логов:

  • rotate - указывает сколько старых логов нужно хранить, в параметрах передается количество;
  • create - указывает, что необходимо создать пустой лог файл после перемещения старого;
  • dateext - добавляет дату ротации перед заголовком старого лога;
  • compress - указывает, что лог необходимо сжимать;
  • delaycompress - не сжимать последний и предпоследний журнал;
  • extension - сохранять оригинальный лог файл после ротации, если у него указанное расширение;
  • mail - отправлять Email после завершения ротации;
  • maxage - выполнять ротацию журналов, если они старше, чем указано;
  • missingok - не выдавать ошибки, если лог файла не существует;
  • olddir - перемещать старые логи в отдельную папку;
  • postrotate/endscript - выполнить произвольные команды после ротации;
  • start - номер, с которого будет начата нумерация старых логов;
  • size - размер лога, когда он будет перемещен;

Это те основные директивы, которые мы будем использовать. В главном конфигурационном файле находится глобальная конфигурация, директивы, которые будут распространяться на все логи если не было отменено их действие. Каждый лог, который подлежит ротации описывается таким образом:

адрес_файла_лога
директивы
>

Теперь давайте создадим файл rsyslog.conf в папке /etc/logrotate.d/ и поместим в него настройки для ротации этого лога:

/var/log/messages daily
rotate 3
size 10M
compress
delaycompress
>


Эти настройки означают, что ротация журналов будет выполняться ежедневно, и мы будем хранить три последних журнала, более старые копии будут автоматически удаляться. Минимальный размер для ротации - 10 мегабайт, ротация не будет выполнена, если лог не занимает более 10 мегабайт. Будет использоваться сжатие, для всех журналов кроме последнего и предпоследнего. Точно по такому же принципу вы можете настроить ротацию логов для любого из журналов. Нужно создать такую секцию для каждого из логов, которыми вы хотите управлять.

Теперь осталось протестировать как работает наша конфигурация. Для этого запустим утилиту logrotate с опцией -d. Она выведет все, что планируется сделать, но не будет изменять файлы на диске. У нас есть файл /var/log/messages, размером 40 Мегабайт, посмотрим что будет делать утилита:

logrotate -d /etc/logrotate.d/rsyslog.conf



Как видите, программа обнаруживает файл лога и разделяет его на несколько частей. Вы можете убедиться, что logrotate будет запускаться как положено проверив расписание cron:


Настройка Logrotate завершена, а вам осталось всего лишь расписать как будет выполняться ротация логов для каждого из журналов, которые занимают много места.

Выводы

В этой статье мы рассмотрели как выполняется настройка logrotate centos или в любом другом дистрибутиве Linux. Работа утилиты не сильно отличается в зависимости от дистрибутивов. Если у вас есть сервер с большой нагрузкой, вам обязательно необходимо настроить ротацию логов. Надеюсь, эта информация была полезной для вас. На завершение видео, о том как выполняется ротация логов в Ubuntu от LPIC:

И еще одно на английском:


Как сжимать файлы журналов в Linux с помощью Logrotate

В системе Linux и почти во всех системах файлы журналов имеют решающее значение, когда дело доходит до изучения и устранения ошибок. Они дают важные подсказки относительно того, что могло пойти не так с различными системными службами до отказа.

Любая служба, установленная в ваших системах Linux, например веб-сервер Apache или сервер базы данных MySQL, создает файлы журнала, которые обычно хранятся в каталоге /var/log.
Со временем по мере регистрации дополнительной информации файлы журнала увеличиваются в размере и занимают больше места на жестком диске. Прежде чем вы даже узнаете об этом, файлы журналов увеличатся в размерах, занимая большую часть места на жестком диске. Если вы не будете осторожны, у вас может легко закончиться свободное место на диске.

Имея это в виду, становится разумным поддерживать файлы журнала в управляемом размере и удалять старые записи журнала, которые занимают драгоценное дисковое пространство. И здесь на помощь приходит ротация журналов.

Что такое ротация журналов?

Процесс ротации журналов упрощается с помощью утилиты logrotate . Это инструмент, который упрощает ротацию файлов журналов, а также архивирование и удаление старых, чтобы освободить место на диске. Таким образом, logrotate выполняет следующее:

  • Создание новых файлов журналов после ротации старых.
  • Архивирование старых файлов журналов.
  • Удаление старых файлов журналов, которые были повернуты для экономии места.

Ротация журналов обычно активируется, когда размер файлов журнала увеличивается и превышает определенный предел.

Как работает утилита logrotate

Прежде чем мы исследуем работу утилиты logrotate, убедитесь, что logrotate установлен в вашей системе.

Системы Debian / Ubuntu:

Для системы CentOS / RHEL / Fedora:

Запустите команду ниже, чтобы проверить версию logrotate,

Из выходных данных мы ясно видим, что у нас есть logrotate версии 3.14.0. По умолчанию logrotate предустановлен в современных дистрибутивах Linux, поэтому устанавливать его не нужно.

Файлы конфигурации Logrotate

Logrotate запускается ежедневно как задание cron, просматривая различные файлы журналов, меняя их и очищая старые файлы журналов, как определено в файле конфигурации. Есть два основных источника конфигурации, на которые нужно обратить пристальное внимание:

Из показанной конфигурации файл /etc/logrotate.conf еженедельно меняет файлы журнала, как указано в строке 3 .

  • Ст. 7 указывает, что файлы журнала принадлежат пользователю root и группе adm.
  • 10 указывает, что выполняется резервное копирование файлов журнала всего за 4 недели, после чего более старые будут очищены или удалены, чтобы освободить место на диске.
  • 13 инструктирует о создании нового файла журнала после ротации текущего файла журнала.
  • Оператор include в строке 22 извлекает конфигурации файлов приложения, которые перечислены в каталоге /etc/logrotate.d.

Давайте посмотрим на файл конфигурации инструмента диспетчера пакетов dpkg..

Создайте образец файла конфигурации logrotate

Предположим, что у нас есть приложение, работающее как пользователь linuxtechi, которое генерирует файлы журналов, которые хранятся в /home/linuxtechi/logs . Нам нужно настроить ротацию файлов журналов на еженедельной основе.

Но сначала мы собираемся создать файл конфигурации logrotate в домашнем каталоге, как показано:

Затем мы собираемся вставить показанную конфигурацию:

Давайте поместим это в контекст:

Теперь мы собираемся создать каталог журналов, который будет содержать файлы журналов приложения, а затем создать файл журнала с именем app.log.

Теперь мы запустим команду logrotate, чтобы создать файл состояния logrotate в домашнем каталоге, чтобы проверить, были ли созданы записи журнала или нет.

Вы получите примерно такой результат:

Судя по выходным данным, файл журнала не менялся по той простой причине, что ротация происходит еженедельно, а возраст файла журнала составляет всего час.

Изучите файл logrotate, чтобы убедиться, что была записана какая-либо информация о запуске ротации журнала..

Из выходных данных мы видим, что утилита logrotate подтвердила, когда последний раз рассматривала файл журнала для ротации, и напечатала метку времени.

Если вы вернетесь в каталог журналов, вы увидите дополнительный файл журнала, который был повернут и сжат, как показано.

Сжимайте и вращайте файлы журналов в зависимости от размера

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

Например, чтобы запустить ротацию, когда размер файла превышает 40 мегабайт, включите параметр:

максимальный размер 40M

Предположим, мы создаем собственный файл ротации журналов для нашего приложения в папке /etc/logrotate.d

Сохраните и закройте файл,

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

Файлы журнала размером более 40 мегабайт будут вращаться без учета временного интервала вращения.

Это означает, что для файла журнала, который подлежит ротации через 1 час. Он будет повернут до указанного интервала, если он превышает пороговое значение в 40 МБ.

Давайте сбросим некоторые данные в файл журнала нашего пользовательского приложения. Затем посмотрим, как logrotate будет вращать файлы журнала,

Как видно из выходных данных, logrotate не будет вращать файл журнала, так как его размер не превышает 40 МБ.

Теперь сделаем размер файла журнала более 40 МБ,

Приведенный выше вывод подтверждает, что logrotate будет вращать файл журнала, если его размер превышает 40 МБ.

Помимо улучшения ротации файлов журнала в зависимости от размера, разумно убедиться.

Что файл конфигурации logrotate вызывается с регулярной частотой с помощью задания cron.

Журнали которые так быстро увеличиваются в размере и рискуют заполнить место на диске.

Есть два способа сделать это:

Вы можете скопировать сценарий logrotate из каталога /etc/cron.daily в папку /etc/cron.hourly . Это переключит ротацию журналов на почасовую, а не на ежедневную.

Это будет запускать ротацию каждые 10 минут.

Чтобы узнать о дополнительных параметрах инструмента logrotate, посетите страницы руководства, как показано:

Привет, друг. Если, вдруг, ты решил изучать Linux чуть глубже чем процесс установки, то рано или поздно (скорее рано), а если начнешь что-то шаманить в системе, то практически сразу, ты столкнёшься с такой штукой, которую принято называть логи. А если, вдруг, ты решишь озаботиться вопросами безопасности каких-нибудь серверов то красноглазить в километры логов будет твои любимым занятием. Я конечно утрирую, но не сильно.

Логи Linux

Теперь по сути. Основные файлы логов лежат в папке /var/log.

логи linux

Для начала рассмотрим какие вообще есть логи Linux и что в них пишется. Конечно прям все мы обсуждать не будем, дабы не плодить много букв. Возьмем только те которые мне кажуться наиболее актуальными. Кстати, в разных дистрибутивах Linux названия одних и тех-же логов могут отличаться. Для более глубокого понимания можно заглянуть в конфиг службы rsyslog. Именно она является одной из основных служб Linux отвечающей за сбор логов. Её конфиг лежит: /etc/rsyslog.d/50-default.conf

логи linux

Типы логов

А сейчас разберем, собственно сами логи, точнее какие бывают логи:

/var/log/mysql/ — лог базы данных MySQL.

Это конечно не все возможные логи, но для большинства основных задач достаточно. Ещё с некоторыми познакомимся дальше.

Информация о пользователях

Теперь познакомимся с командами позволяющими получить основную информацию о системе и пользователях. Это намного удобнее если нужно получить какую-то конкретную информацию и лопатить логи нет необходимости или желания.

логи linux

Команда who покажет нам кто из пользователей сейчас залогинен в системе и когда он зашел. Данная информация хранится в файле /var/run/utmp, но хранится она там временно, только пока пользователь в системе. Если пользователей выйдет, запись удалится. Т.е. эта команда показывает только актуальные данные.

Если нужно выяснить когда пользователь заходил в систему и сколько времени в ней находился то эта инфа хранится в логе /var/log/wtmp. Чтобы получить эти данные используется команда last и указывается имя пользователя, либо можно имя не указывать тогда увидим отчет по всем пользователям.

логи linux

Следующая команда, которая может быть крайне полезной, это:

логи linux

Эта команда показывает список всех пользователей системы с датами их последнего входа. Тут стоит проверять чтобы системные пользователи ни когда не логинились в системе. Просто потому что они не могут этого делать сами и, если вдруг, ты подобное видишь, значит у тебя явно что-то идет не так как должно.

Способы чтения логов в Linux

Просматривать логи в Linux можно несколькими способами. Можно делать это стандартными средствами системы, а можно использовать специализированный софт.

Также логи можно изучать используя инструменты командной строки. Так как логи хранятся в виде текстовой информации, то и просматривать их можно соответствующими способами, как текстовую информацию. Самый простой, но не самый удобный вариант, команда cat:

cat

Она просто выведет в терминал содержимое файла, дополнительный функционал не предусмотрен.

Чуть более удобна в использовании утилита less.

после ввода команды, чтобы увидеть справку можно нажать кнопку h, чтобы выйти кнопку q. Используя less, можно перемещаться по файлу лога впере-назад построчно, либо поэкранно. Также можно следить за изменениями в реальном времени.

Если нужно только следить за каким-либо логом в режиме реального времени, то для этого подойдет команда tail -f. Если параметр -f не указывать, то команда tail просто покажет последние 10 строк лога.

В общем стандартные утилиты это хорошо, и знать про них нужно. Вот только, как и практически всё стандартное, они не дают того удобства которое можно получить используя утилиты специализированные.

Одна из лучших утилит для просмотра логов это Log File Navigator или lnav. Установить её можно командой:

либо, если ты используешь дистрибутив, в репозиториях которого её нет, то вот ссылка на неё:

Log File Navigator

Основные фишки lnav это удобная подсветка, возможность чтения любых форматов логов, в том числе архивированных, возможность объединения нескольких файлов в единый отчет, удобный поиск и фильтрация, ну и всякое другое, по мелочи. Короче если часто лопатишь логи, штука мастхэвная.

Как пользоваться? Тут все просто. Если запустить программу без параметров:

то нам покажет журнал syslog. Если нужно посмотреть какой-то другой лог, то после lnav нужно указать какой именно, а если нужно увидеть несколько логов то просто их перечисляем, например:

Log File Navigator

Log File Navigator

Естественно есть возможность поиска нужны строк. Для этого жмём кнопку ? и вводим слово для поиска, одновременно с этим видим подсказку по синтаксису поиска.

Log File Navigator

Ротация логов

Вроде как разобрались с lnav и неспеша переходим дальше. А дальше у нас такая штука как ротация логов. Учитывая что логи пишутся постоянно и по любому поводу, то если бы этот процес был неконтролируемым, через некоторое время файлы логов стали бы огромными, занимали бы кучу места и работать с ними стало бы просто нереально. Естественно этот процес контролируемый и отвечает за него утилита logrotate. Она плодит файлы с названием лога и цифрой через точку, либо такие же архивы. Туда сохраняются старые записи, чтобы к ним можно было вернуться через время. Естественно работу этой утилиты можно и нужно настраивать. Под свои потребности, так сказать.

Основной конфиг утилиты лежит в файле /etc/logrotate.conf. Но правильнее будет настраивать используя конфиги в папке: /etc/logrotate.d/. Здесь под каждый лог лежит отдельный конфиг. В котором, после названия самого лога перечисляются параметры его ведения.

ротация логов

Теперь понимая, какой параметр за что отвечает, можно каждому логу задать индивидуальные параметра ведения. И если для домашнего использования это вряд ли необходимо, подойдут и стандартные параметры, то для, какого-нибудь сервера, пожалуй обязательная история.

Логи Linux. journald

Для начала мы можем посмотреть все запуски системы:

journald

journald

Можно также получить логи касающиеся только конкретной службы. Например давай увидим все что касается только службы Network Manager:

Если нужно следить за логами в режиме реального времени, то используется параметр -f.
Также, параметры запуска этой утилиты можно комбинировать, для получения более конкретного результата:

Если нужно увидеть только несколько последних записей, то их количество можно задать параметром -n:

Ну и раз уж, уже вспомнили про systemd в целом, то наверное надо сказать и про systemd-analyze. Это такая штука которая собирает статистику загрузки системы.

Если ввести в терминале просто:

без каких-либо параметров, то мы увидим общее время загрузки системы. А если добавить параметр blame, то увидим сколько времени загружалась каждая служба, самые медленные процессы будут сверху.

systemd

Эта штука может быть полезна для выявления процессов затормаживающих загрузку и оптимизации старта системы на слабых компьютерах.

Мы можем использовать их для просмотра логов, фильтруя информацию по конкретному приоритету.

логи linux

Или в случае с journalctl:

логи linux

Ну, а на этом наше знакомство с логами можно считать оконченным. Мы конечно рассмотрели здесь только самые важные моменты, но на то оно и знакомство, что бы узнать азы, а глубже уже изучать самостоятельно. Если в этом есть необходимость, конечно. Потому что, описанного в этой статье, как по мне, вполне достаточно обычному пользователю, чтобы комфортно чувствовать себя при работе с логами. Ну и свой баф к линуксоидности ты сегодня получил. Потому не забывай возвращаться к нам, ведь есть ещё много тем которые стоит изучить.

Читайте также: