Вращающиеся логи на Unix и Linux
Дистрибутивы Unix и Linux предлагают утилиту logrotate, которая очень упрощает ротацию лог-файлов. На этой странице описано, как настроить ротацию логов для журнала ошибок, журнала общих запросов и журнала медленных запросов.
Настройка расположения и имён файлов логов
На первом шаге необходимо настроить расположение и имена файлов логов. Для упрощения настройки ротации логов рекомендуется поместить эти файлы в отдельную директорию для логов.
Нам нужно будет настроить следующее:
- Расположение и имя файла журнала ошибок настраиваются переменной системы
log_error. - Расположение и имя файла журнала общих запросов настраиваются переменной системы
general_log_file. - Расположение и имя файла журнала медленных запросов настраиваются переменной системы
slow_query_log_file.
Если вы хотите сразу включить журнал общих запросов и журнал медленных запросов, то также необходимо настроить следующее:
- Журнал общих запросов включается переменной системы
general_log. - Журнал медленных запросов включается переменной системы
slow_query_log.
Эти параметры можно установить в группе опций сервера опций в файле опций опций до запуска сервера. Например, если мы хотим поместить наши лог-файлы в /var/log/mysql/, то мы можем настроить следующее:
[mariadb] ... log_error=/var/log/mysql/mariadb.err general_log general_log_file=/var/log/mysql/mariadb.log slow_query_log slow_query_log_file=/var/log/mysql/mariadb-slow.log long_query_time=5
Также нам нужно будет создать соответствующую директорию:
sudo mkdir /var/log/mysql/ sudo chown mysql:mysql /var/log/mysql/ sudo chmod 0770 /var/log/mysql/
Если вы используете SELinux, то вам также может потребоваться установить контекст SELinux для директории. Для получения дополнительной информации см. SELinux: Установка контекста файла для лог-файлов. Например:
sudo semanage fcontext -a -t mysqld_log_t "/var/log/mysql(/.*)?" sudo restorecon -Rv /var/log/mysql
После перезапуска MariaDB он будет использовать новые расположения и имена лог-файлов.
Настройка аутентификации для logrotate
Утилите logrotate необходимо иметь возможность аутентификации с MariaDB для сброса лог-файлов.
Самый простой способ разрешить утилите logrotate аутентификацию с MariaDB — настроить учетную запись пользователя root@localhost для использования аутентификации unix_socket.
В MariaDB 10.4 и более поздних версиях учетная запись пользователя root@localhost по умолчанию настроена на использование аутентификации unix_socket, поэтому эту часть можно пропустить в этих версиях.
В MariaDB 10.3 и более ранних версиях учетная запись пользователя может иметь только один метод аутентификации одновременно. В этих версиях это означает, что после включения аутентификации unix_socket для учетной записи пользователя root@localhost вы больше не сможете использовать пароль для входа с этой учетной записью. Учетная запись пользователя сможет использовать только аутентификацию unix_socket.
В MariaDB 10.3 и более ранних версиях необходимо установить плагин unix_socket, прежде чем настраивать учетную запись пользователя root@localhost для его использования. Например:
INSTALL SONAME 'auth_socket';
После установки плагина учетная запись пользователя root@localhost может быть настроена на использование аутентификации unix_socket. Способ настройки зависит от версии MariaDB.
Учетную запись пользователя root@localhost можно изменить на использование аутентификации unix_socket с помощью инструкции ALTER USER. Например:
ALTER USER 'root'@'localhost' IDENTIFIED VIA unix_socket;
<</product>>
Настройка Logrotate
На этом этапе мы можем настроить утилиту logrotate для ротации лог-файлов.
На многих системах основной файл конфигурации logrotate находится по следующему пути:
-
/etc/logrotate.conf
А файлы конфигурации logrotate для отдельных служб находятся в следующей директории:
-
/etc/logrotate.d/
Мы можем создать файл конфигурации logrotate для MariaDB, выполнив следующую команду в оболочке:
$ sudo tee /etc/logrotate.d/mariadb <<EOF
/var/log/mysql/* {
su mysql mysql
missingok
create 660 mysql mysql
notifempty
daily
minsize 1M # only use with logrotate >= 3.7.4
maxsize 100M # only use with logrotate >= 3.8.1
rotate 30
# dateext # only use if your logrotate version is compatible with below dateformat
# dateformat .%Y-%m-%d-%H-%M-%S # only use with logrotate >= 3.9.2
compress
delaycompress
sharedscripts
olddir archive/
createolddir 770 mysql mysql # only use with logrotate >= 3.8.9
postrotate
# just if mysqld is really running
if test -x /usr/bin/mysqladmin && \
/usr/bin/mysqladmin ping &>/dev/null
then
/usr/bin/mysqladmin --local flush-error-log \
flush-engine-log flush-general-log flush-slow-log
fi
endscript
}
EOF
Возможно, вам потребуется изменить этот файл конфигурации для использования его на вашей системе, в зависимости от конкретной версии утилиты logrotate которая установлена. Обратитесь к описанию каждой директивы конфигурации, чтобы определить, какие версии logrotate поддерживают эту директиву конфигурации.
Каждая конкретная директива конфигурации выполняет следующее:
-
missingok: Эта директива настраивает её на игнорирование отсутствующих файлов, а не на ошибку. -
create 660 mysql mysql: Эта директива настраивает её на пересоздание лог-файлов после ротации логов с указанными разрешениями и владельцем. -
notifempty: Эта директива настраивает её на пропуск лог-файла во время ротации, если он пуст. -
daily: Эта директива настраивает её на ротацию каждого лог-файла один раз в день. -
minsize 1M: Эта директива настраивает её на пропуск лог-файла во время ротации, если его размер меньше 1 МБ. Эта директива доступна только вlogrotate3.7.4 и более поздних версиях. -
maxsize 100M: Эта директива настраивает её на более частую ротацию лог-файла, чем ежедневно, если его размер превышает 100 МБ. Эта директива доступна только вlogrotate3.8.1 и более поздних версиях. -
rotate 30: Эта директива настраивает её на сохранение 30 старых копий каждого лог-файла. -
dateext: Эта директива настраивает её на использование даты в качестве расширения, а не только числа. Эта директива доступна только вlogrotate3.7.6 и более поздних версиях. -
dateformat .%Y-%m-%d-%H-%M-%S: Эта директива настраивает её на использование этой строки формата даты (как определено в спецификации формата дляstrftime) для расширения даты, настроенного директивойdateext. Эта директива доступна только вlogrotate3.7.7 и более поздних версиях. Поддержка%Hдоступна только вlogrotate3.9.0 и более поздних версиях. Поддержка%Mи%Sдоступна только вlogrotate3.9.2 и более поздних версиях. -
compress: Эта директива настраивает её на сжатие лог-файлов с помощьюgzip. -
delaycompress: Эта директива настраивает её на отсрочку сжатия каждого лог-файла до следующей ротации. Если лог-файл сжимается в то же время, что и ротация, то могут возникнуть случаи, когда лог-файл сжимается, пока сервер MariaDB все еще записывает в лог-файл. Отсрочка сжатия лог-файла до следующей ротации может предотвратить такие условия гонки, которые могут возникнуть между операцией сжатия и операцией сброса журнала сервера MariaDB. -
olddir archive/: Эта директива настраивает её на архивацию ротированных лог-файлов в/var/log/mysql/archive/. -
createolddir 770 mysql mysql: Эта директива настраивает её на создание указанной директорией директивыolddirс указанными разрешениями и владельцем, если директория еще не существует. Эта директива доступна только вlogrotate3.8.9 и более поздних версиях. -
sharedscripts: Эта директива настраивает её на выполнение скриптаpostrotateтолько один раз, а не для каждого ротированного лог-файла. -
postrotate: Эта директива настраивает её на выполнение скрипта после ротации логов. Этот конкретный скрипт выполняет утилиту mariadb-admin, которая выполняет оператор FLUSH, который сообщает серверу MariaDB сбросить различные лог-файлы. Когда сервер MariaDB сбрасывает лог-файл, он закрывает имеющуюся файловую дескриптор и открывает новый. Это гарантирует, что сервер MariaDB не продолжит запись в лог-файл после его ротации. Это важная часть процесса ротации логов.
Если на нашей системе нет logrotate 3.8.9 или более поздней версии, необходимой для поддержки директивы createolddir, то нам также потребуется создать соответствующую директорию, указанную в директиве olddir.
sudo mkdir /var/log/mysql/archive/ sudo chown mysql:mysql /var/log/mysql/archive/ sudo chmod 0770 /var/log/mysql/archive/
Тестирование ротации логов
Мы можем проверить ротацию логов, выполнив утилиту logrotate с опцией --force. Например:
sudo logrotate --force /etc/logrotate.d/mariadb
Помните, что при нормальной работе утилита logrotate может пропустить лог-файл при ротации, если утилита не считает, что лог-файл еще нужно вращать. Например:
- Если вы установите директиву
notifemptyуказанную выше, то она будет настроена на пропуск лог-файла во время ротации, если лог-файл пуст. - Если вы установите директиву
dailyуказанную выше, то она будет настроена на ротацию каждого лог-файла один раз в день. - Если вы установите директиву
minsize 1Mуказанную выше, то она будет настроена на пропуск лог-файла во время ротации, если размер лог-файла меньше 1 МБ.
Однако, при запуске тестов с опцией --force, утилита logrotate не учитывает эти опции.
После нескольких тестов мы можем увидеть, что ротация логов действительно работает:
$ sudo ls -l /var/log/mysql/archive/ total 48 -rw-rw---- 1 mysql mysql 440 Mar 31 15:31 mariadb.err.1 -rw-rw---- 1 mysql mysql 138 Mar 31 15:30 mariadb.err.2.gz -rw-rw---- 1 mysql mysql 145 Mar 31 15:28 mariadb.err.3.gz -rw-rw---- 1 mysql mysql 1007 Mar 31 15:27 mariadb.err.4.gz -rw-rw---- 1 mysql mysql 1437 Mar 31 15:32 mariadb.log.1 -rw-rw---- 1 mysql mysql 429 Mar 31 15:31 mariadb.log.2.gz -rw-rw---- 1 mysql mysql 439 Mar 31 15:28 mariadb.log.3.gz -rw-rw---- 1 mysql mysql 370 Mar 31 15:27 mariadb.log.4.gz -rw-rw---- 1 mysql mysql 3915 Mar 31 15:32 mariadb-slow.log.1 -rw-rw---- 1 mysql mysql 554 Mar 31 15:31 mariadb-slow.log.2.gz -rw-rw---- 1 mysql mysql 569 Mar 31 15:28 mariadb-slow.log.3.gz -rw-rw---- 1 mysql mysql 487 Mar 31 15:27 mariadb-slow.log.4.gz
Logrotate в Ansible
Давайте рассмотрим пример настройки logrotate в Ansible.
Сначала создадим несколько задач в нашем плейбуке:
- name: Create mariadb_logrotate_old_dir
file:
path: "{{ mariadb_logrotate_old_dir }}"
owner: mysql
group: mysql
mode: '770'
state: directory
- name: Configure logrotate
template:
src: "../templates/logrotate.j2"
dest: "/etc/logrotate.d/mysql"
Первая задача создаёт директорию для хранения старых, сжатых логов, и устанавливает правильные разрешения.
Вторая задача загружает файл конфигурации logrotate в соответствующий каталог и называет его mysql. Как видите, исходное имя отличается и заканчивается расширением .j2, потому что это шаблон Jinja 2.
Файл будет выглядеть следующим образом:
{{ mariadb_log_dir }}/* {
su mysql mysql
missingok
create 660 mysql mysql
notifempty
daily
minsize 1M {{ mariadb_logrotate_min_size }}
maxsize 100M {{ mariadb_logrotate_max_size }}
rotate {{ mariadb_logrotate_old_dir }}
dateformat .%Y-%m-%d-%H-%M-%S # only use with logrotate >= 3.9.2
compress
delaycompress
sharedscripts
olddir archive/
createolddir 770 mysql mysql # only use with logrotate >= 3.8.9
postrotate
# just if mysqld is really running
if test -x /usr/bin/mysqladmin && \
/usr/bin/mysqladmin ping &>/dev/null
then
/usr/bin/mysqladmin --local flush-error-log \
flush-engine-log flush-general-log flush-slow-log
fi
endscript
}
Файл очень похож на показанный выше, что очевидно, потому что мы всё ещё загружаем файл конфигурации logrotate. Ansible — это просто инструмент, который мы выбрали для этого.
Однако, как в задачах, так и в шаблоне, мы использовали некоторые переменные. Это позволяет использовать разные пути и параметры вращения для разных хостов или групп хостов.
Если у нас есть группа хостов, называемая mariadb, которая содержит стандартную конфигурацию для всех наших серверов MariaDB, мы можем определить эти переменные в файле, названном group_vars/mariadb.yml:
# MariaDB writes its logs here mariadb_log_dir: /var/lib/mysql/logs # logrotate configuration mariadb_logrotate_min_size: 500M mariadb_logrotate_max_size: 1G mariadb_logrotate_old_files: 7 mariadb_logrotate_old_dir: /var/mysql/old-logs
После настройки logrotate в Ansible, вы можете развернуть его на сервере вне рабочей среды и протестировать вручную, как описано выше. После того, как вы убедитесь, что всё работает правильно на одном сервере, вы можете быть уверены в новых задачах Ansible и развернуть их на всех серверах.
Для получения дополнительной информации о том, как использовать Ansible для автоматизации конфигурации MariaDB, см. Ansible и MariaDB.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/rotating-logs-on-unix-and-linux/