Перейти к содержанию

Настройка ротации логов

Во время работы приложение записывает информацию о своем состоянии, результатах работы и ошибках в логи (журналы). Со временем объем логов постоянно растет, они занимают все больше и больше дискового пространства, что в итоге может привести к проблемам в работе системы в целом. Для управления этим процессом необходимо организовать и настроить ротацию логов.

Рассмотрим настройку ротации логов PostgeSQL и Ngnix в системе.

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

Встроенная ротация логов PostgreSQL

После установки AppSec.Hub при старте контейнера создается конфигурационный файл /opt/apphub/config/postgresql/postgresql.conf. Мы рекомендуем использовать следующую конфигурацию (ниже приведен фрагмент файла без закомментированных строк).

listen_addresses = '*'
max_connections = 100           # (change requires restart)

shared_buffers = 128MB      # min 128kB
dynamic_shared_memory_type = posix  # the default is the first option

max_wal_size = 1GB
min_wal_size = 80MB

log_timezone = 'Europe/Moscow'

datestyle = 'iso, mdy'
timezone = 'Europe/Moscow'

lc_messages = 'en_US.utf8'      # locale for system error message
lc_monetary = 'en_US.utf8'      # locale for monetary formatting
lc_numeric = 'en_US.utf8'       # locale for number formatting
lc_time = 'en_US.utf8'          # locale for time formatting

default_text_search_config = 'pg_catalog.english'

Этот файл также можно создать отдельно и переписать через использование volume, либо просто поменять его в папке.

Чтобы включить логирование и ротацию логов, необходимо добавить в конфигурационный файл следующие строки.

log_timezone = 'Europe/Moscow'
log_connections = on
log_duration = off
log_hostname = on
log_min_messages = 'WARNING'
log_line_prefix = '%m [%p] %h %u@%d '

logging_collector = on
log_directory = 'logs'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_file_mode = 0644
log_truncate_on_rotation = on
log_rotation_age = 1d
log_destination = 'stderr'
log_statement = 'all'

#log_min_error_statement = debug1       # values in order of decreasing detail:
#log_min_duration_statement = 500        # -1 is disabled, 0 logs all statements
#log_min_duration_sample = 500           # -1 is disabled, 0 logs a sample of statements

Также можно добавить в файл любые другие опции согласно документации PostgreSQL.

Полный пример конфигурационного файла приведен в «Приложении 14. Конфигурационный файл postgresql.conf».

После первого запуска AppSec.Hub в файле docker-compose.yml можно добавить volumes для конфигурационного файла postgresql.conf и для папки с логами.

postgresql:
    image: docker.swordfishsecurity.com/public/sfs-postgresql:13.2.2-alpine
    container_name: postgresql
    volumes:
    - ./postgresql/data:/data
    - ./config/postgresql/postgresql.conf:/data/postgresql.conf
    - ./logs/postgresql:/data/logs

Важно!

Добавлять volumes для конфигурационного файла postgresql.conf и для папки с логами в файле docker-compose.yml можно только после первого запуска AppSec.Hub! Если volumes для конфигурационного файла и для папки с логами будут добавлены до первого запуска, то контейнер postgresql с PostgeSQL просто не запустится, что помешает запуску AppSec.Hub в целом. Это вызвано тем, что, если PostgeSQL является частью поставки AppSec.Hub, для успешного запуска PostgeSQL при первом старте папка data должна быть пустой.

Ротация логов с использованием logrotate

Описанная выше ротация логов реализует решение, предоставляемое встроенным функционалом PostgeSQL «из коробки». Это задается с помощью конфигурационного файла postgresql.conf. В частности, следующая строка в этом файле определяет использование данных о текущем моменте времени в имени файла лога, а также предусматривающей использование нескольких файлов логов:

log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'

Если изменить значение параметра log_filename, убрать из него переменные значения, зависящие от времени и даты, и зафиксировать имя файла лога, например postgresql.log, то все данные будут записываться в определенный таким образом один файл, что не позволит организовать ротацию. В результате более старые данные будут перезатираться более новыми и по сути ротации логов не будет как таковой. Эту проблему можно решить с помощью подхода, основанного на работе с утилитой logrotate, предназначенной для автоматизации обработки логов.

Как и при использовании встроенной ротации логов PostgeSQL, конфигурационный файл /opt/apphub/config/postgresql/postgresql.conf, задающий параметры логирования, может быть создан отдельно и переписан через использование volume, либо его можно просто поменять в папке.

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

log_timezone = 'Europe/Moscow'
log_connections = on
log_duration = off
log_hostname = on
log_min_messages = 'WARNING'
log_line_prefix = '%m [%p] %h %u@%d '

logging_collector = on
log_directory = 'logs'
log_filename = 'postgresql.log'
log_file_mode = 0644
#log_truncate_on_rotation = on
#log_rotation_age = 1d
log_destination = 'stderr'
log_statement = 'all'

Обратите внимание, что кроме использования фиксированного имени файла лога postgresql.log, в конфигурационном файле отключены параметры log_truncate_on_rotation и log_rotation_age.

После первого запуска AppSec.Hub в файле docker-compose.yml можно добавить volume для конфигурационного файла postgresql.conf и для папки с логами, см. детали и пример файла docker-compose.yml выше.

Проверьте, что утилита logrotate, предназначенная для автоматизации обработки логов, уже установлена на хостовой системе, и если это не так, установите ее, а также добавьте ее в автозагрузку:

apt-get update && apt-get install -y logrotate
systemctl enable logrotate

Примечание

У пользователя, запускающего утилиту logrotate, также должны быть права на запуск docker.

Создайте файл /etc/logrotate.d/postgresql-logs:

/opt/apphub/logs/postgresql/*.log {
create 0644
daily
rotate 365
missingok
notifempty
compress
sharedscripts
endscript
}

Остановимся на некоторых параметрах этого файла:

  • /opt/apphub/logs/postgresql/*.log — полный путь до логов на хостовой системе.

  • create 0644 — права, с которыми создаются логи. Сюда же можно дописать пользователя и группу, но возможна ошибка, что такого пользователя в хостовой системе нет.

  • rotate 365 — количество дней, определенное для хранения логов (в случае, если ротация создается с параметром daily).

Проверьте, все ли настроено корректно, с помощью следующей команды (по выведенному в терминал описанию того, что запланировано к выполнению командой logrotate с заданными параметрами и по отсутствию сообщений об ошибках):

logrotate -d /etc/logrotate.d/postgresql-logs

Для запуска ротации логов необходимо вручную выполнить команду:

logrotate -f /etc/logrotate.d/postgresql-logs

Для последующей автоматизации ротации логов предназначены два следующих шага:

  • Во-первых, проверьте, что ротация включена в сервисах (по статусу logrotate):

    systemctl status logrotate
    
  • Во-вторых, проверьте, что в cron.daily есть файл logrotate:

    /etc/cron.daily/logrotate
    

Ротация логов hub-ui (nginx)

Примечание

В отличие от PostgeSQL, Ngnix не предлагает решения для ротации логов «из коробки». Существует возможность настроить ротацию внутри самого контейнера, однако недостатком такого решения будет являться то, что будет запускаться более одного процесса в контейнере (нужен демон Cron, а также Nginx). В результате этот подход не будет соответствовать рекомендациям Docker best practices и на данный момент этот подход не рассматривается.

Настроить ротацию логов можно на хостовой системе, где установлен AppSec.Hub и, в частности, контейнер hub-ui.

Проверьте, что утилита logrotate, предназначенная для автоматизации обработки логов, уже установлена и, если это не так, установите ее, а также добавьте ее в автозагрузку:

apt-get update && apt-get install -y logrotate
systemctl enable logrotate

Примечание

У пользователя, запускающего утилиту logrotate, также должны быть права на запуск docker.

Создайте файл /etc/logrotate.d/docker-nginx:

/opt/apphub/logs/hub-ui/*.log {
create 0644
daily
rotate 365
missingok
notifempty
compress
sharedscripts
postrotate
    docker kill --signal="USR1" hub-ui
endscript
}

Остановимся на некоторых параметрах этого файла:

  • /opt/apphub/logs/hub-ui/*.log — полный путь до логов на хостовой системе.
  • create 0644 — права, с которыми создаются логи. Сюда же можно дописать пользователя и группу, но возможна ошибка, что такого пользователя в хостовой системе нет.
  • rotate 365 — количество дней, определенное для хранения логов (в случае, если ротация создается с параметром daily).

Важно!

Имя контейнера, указанное в команде docker kill --signal="USR1" hub-ui, должно совпадать с именем, указанным в файле docker-compose.yml в параметре container_name для данного контейнера (в примере, приведенном в «Приложении 9. Пример docker-compose.yml для контейнера AppSec.Hub», этот параметр для контейнера hub-ui расположен в строке 35).

Примечание

В случае, если docker запущен в rootless-режиме от какого-то конкретного пользователя, файл /etc/logrotate.d/docker-nginx должен выглядеть следующим образом:

/opt/apphub/logs/hub-ui/*.log {
create 0644
daily
rotate 365
missingok
notifempty
compress
sharedscripts
postrotate
    su <USER_NAME> -c "docker kill --signal=\"USR1\" hub-ui"
endscript
}

где <USER_NAME> — это имя пользователя, от которого запущен docker.

Проверьте, все ли настроено корректно, с помощью следующей команды (по выведенному в терминал описанию того, что запланировано к выполнению командой logrotate с заданными параметрами и по отсутствию сообщений об ошибках):

logrotate -d /etc/logrotate.d/docker-nginx

Для запуска ротации логов необходимо вручную выполнить команду:

logrotate -f  /etc/logrotate.d/docker-nginx

Для последующей автоматизации ротации логов предназначены два следующих шага:

Во-первых, проверьте, что ротация включена в сервисах (по статусу logrotate):

systemctl status logrotate

Во-вторых, проверьте, что в cron.daily есть файл logrotate:

/etc/cron.daily/logrotate
К началу