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

Logging

Логирование в animails состоит из нескольких этапов, но в конечном итоге оно гораздо более гибкое и его проще интегрировать в демон логирования, чем раньше.

В Docker контейнеризированное приложение (PID 1) записывает свой вывод в stdout. Для настоящих контейнеров с одним приложением это работает отлично. Выполните команду ниже, чтобы узнать больше:

docker compose logs --help
docker-compose logs --help

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

Ни один контейнер не хранит постоянные логи внутри себя. Контейнеры — это временные объекты!

В конце концов, каждая строка логов достигнет демона Docker — без фильтрации.

Драйвер логирования по умолчанию — "json".

Фильтрованные логи

Некоторые логи фильтруются и записываются в ключи Redis, а также транслируются в канал Redis.

Канал Redis используется для потоковой передачи логов с неудачными попытками аутентификации для чтения компонентом netfilter-animails.

Ключи Redis являются постоянными и хранят 10000 строк логов для веб-интерфейса.

Этот механизм позволяет использовать любой драйвер логирования Docker по вашему желанию, не теряя возможности читать логи из интерфейса или блокировать подозрительных клиентов с помощью netfilter-animails.

В ключах Redis будут храниться только логи приложений, системные сообщения (например, cron и т. д.) отфильтровываются.

Драйверы логирования

Через docker-compose.override.yml

Хорошие новости: поскольку в Docker есть отличные драйверы логирования, вы можете с легкостью интегрировать animails в вашу существующую среду сбора логов.

Создайте файл docker-compose.override.yml и добавьте, например, этот блок, чтобы использовать плагин логирования "gelf" для postfix-animails:

services:
  postfix-animails: # или любой другой
    logging:
      driver: "gelf"
      options:
        gelf-address: "udp://graylog:12201"

Другой пример для Syslog:

services:

  postfix-animails: # или любой другой
    logging:
      driver: "syslog"
      options:
        syslog-address: "udp://127.0.0.1:514"
        syslog-facility: "local3"

  dovecot-animails: # или любой другой
    logging:
      driver: "syslog"
      options:
        syslog-address: "udp://127.0.0.1:514"
        syslog-facility: "local3"

  rspamd-animails: # или любой другой
    logging:
      driver: "syslog"
      options:
        syslog-address: "udp://127.0.0.1:514"
        syslog-facility: "local3"
Только для Rsyslog:

Убедитесь, что следующие строки не закомментированы в /etc/rsyslog.conf:

# обеспечивает прием UDP syslog
module(load="imudp")
input(type="imudp" port="514")

Чтобы направить ввод local3 в /var/log/animails.log и остановить дальнейшую обработку, создайте файл /etc/rsyslog.d/docker.conf:

local3.*        /var/log/animails.log
& stop

После этого перезапустите rsyslog.

Через daemon.json (глобально)

Если вы хотите изменить драйвер логирования глобально, отредактируйте файл конфигурации демона Docker /etc/docker/daemon.json и перезапустите службу Docker:

{
...
  "log-driver": "gelf",
  "log-opts": {
    "gelf-address": "udp://graylog:12201"
  }
...
}

Для Syslog:

{
...
  "log-driver": "syslog",
  "log-opts": {
    "syslog-address": "udp://1.2.3.4:514"
  }
...
}

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

docker compose down
docker compose up -d
docker-compose down
docker-compose up -d

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

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

Создайте файл /etc/logrotate.d/animails со следующим содержимым:

/var/log/animails.log {
        rotate 7
        daily
        compress
        delaycompress
        missingok
        notifempty
        create 660 root root
        copytruncate
#        postrotate
#                systemctl restart rsyslog
#                docker compose -f /opt/animails/docker-compose.yml restart postfix-animails
#        endscript
}

С этой конфигурацией logrotate будет запускаться ежедневно и хранить максимум 7 архивов. Так как лог-файл постоянно занят демоном Docker, параметр copytruncate гарантирует, что текущее содержимое animails.log копируется в новый ротированный файл, а сам файл затем очищается. Это необходимо, так как в противном случае логи продолжат записываться в старый (уже ротированный) файл.

В качестве альтернативы copytruncate можно использовать блок postrotate, который по умолчанию закомментирован. Для этого закомментируйте copytruncate и раскомментируйте строки ниже. После ротации лог-файлов перезапускаются демон rsyslog и Docker-контейнер с postfix-animails. Эти два шага необходимы, иначе логи продолжат записываться в старый файл. Если для логирования используется драйвер, отличный от syslog, команду (systemctl restart rsyslog) необходимо соответствующим образом изменить или удалить эту строку из примера выше.

Для еженедельной или ежемесячной ротации лог-файла замените daily на weekly или monthly соответственно.

Чтобы хранить больше архивов, установите желаемое число в параметре rotate.

После этого logrotate можно перезапустить.