Spec-Zone.ru › MariaDB

Вращающиеся логи на 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

В MariaDB 10.4 и более поздних версиях учетная запись пользователя root@localhost по умолчанию настроена на использование аутентификации unix_socket, поэтому эту часть можно пропустить в этих версиях.

MariaDB до 10.3

В 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 МБ. Эта директива доступна только в logrotate 3.7.4 и более поздних версиях.
  • maxsize 100M: Эта директива настраивает её на более частую ротацию лог-файла, чем ежедневно, если его размер превышает 100 МБ. Эта директива доступна только в logrotate 3.8.1 и более поздних версиях.
  • rotate 30: Эта директива настраивает её на сохранение 30 старых копий каждого лог-файла.
  • dateext: Эта директива настраивает её на использование даты в качестве расширения, а не только числа. Эта директива доступна только в logrotate 3.7.6 и более поздних версиях.
  • dateformat .%Y-%m-%d-%H-%M-%S: Эта директива настраивает её на использование этой строки формата даты (как определено в спецификации формата для strftime) для расширения даты, настроенного директивой dateext. Эта директива доступна только в logrotate 3.7.7 и более поздних версиях. Поддержка %H доступна только в logrotate 3.9.0 и более поздних версиях. Поддержка %M и %S доступна только в logrotate 3.9.2 и более поздних версиях.
  • compress: Эта директива настраивает её на сжатие лог-файлов с помощью gzip.
  • delaycompress: Эта директива настраивает её на отсрочку сжатия каждого лог-файла до следующей ротации. Если лог-файл сжимается в то же время, что и ротация, то могут возникнуть случаи, когда лог-файл сжимается, пока сервер MariaDB все еще записывает в лог-файл. Отсрочка сжатия лог-файла до следующей ротации может предотвратить такие условия гонки, которые могут возникнуть между операцией сжатия и операцией сброса журнала сервера MariaDB.
  • olddir archive/: Эта директива настраивает её на архивацию ротированных лог-файлов в /var/log/mysql/archive/.
  • createolddir 770 mysql mysql: Эта директива настраивает её на создание указанной директорией директивы olddir с указанными разрешениями и владельцем, если директория еще не существует. Эта директива доступна только в logrotate 3.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.

Содержимое, воспроизведённое на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проверяется предварительно компанией MariaDB. Мнения, информация и мнения, выраженные в этом содержимом, не обязательно отражают точки зрения 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API