Перейти к содержимому

18. Логирование

Логирование — критически важная часть мониторинга контейнеризованных приложений. Docker предоставляет гибкую систему логирования с поддержкой различных драйверов и интеграцией с централизованными системами сбора логов.

Окно терминала
# Просмотр логов контейнера
docker logs mycontainer
# Следить за логами в реальном времени
docker logs -f mycontainer
# Последние N строк
docker logs --tail 100 mycontainer
# Логи с временными метками
docker logs --timestamps mycontainer
# Логи за последние 30 минут
docker logs --since 30m mycontainer
# Логи с по конкретное время
docker logs --since "2024-01-15T10:00:00" --until "2024-01-15T11:00:00" mycontainer
# Комбинация: последние 50 строк с timestamp
docker logs -f --tail 50 --timestamps mycontainer

Docker поддерживает множество драйверов для отправки логов в разные системы:

Окно терминала
# Просмотр текущего драйвера
docker inspect --format='{{.HostConfig.LogConfig}}' mycontainer
# Запуск с конкретным драйвером
docker run --log-driver=json-file myapp # стандартный (по умолчанию)
docker run --log-driver=syslog myapp # системный syslog
docker run --log-driver=journald myapp # systemd journal
docker run --log-driver=gelf myapp # Graylog Extended Log Format
docker run --log-driver=fluentd myapp # Fluentd/Fluent Bit
docker run --log-driver=awslogs myapp # Amazon CloudWatch
docker run --log-driver=none myapp # отключить логирование
/etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3",
"compress": "true",
"labels": "production_status,geo",
"env": "os,customer"
}
}
Окно терминала
# Или на уровне контейнера
docker run \
--log-driver=json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
myapp
# docker-compose.yml с Fluentd
version: '3.8'
services:
app:
image: myapp
logging:
driver: fluentd
options:
fluentd-address: localhost:24224
tag: app.myservice
fluentd:
image: fluent/fluentd:v1.16
volumes:
- ./fluent.conf:/fluentd/etc/fluent.conf
- fluent_data:/fluentd/log
ports:
- "24224:24224"
elasticsearch:
image: elasticsearch:8.11.0
environment:
- discovery.type=single-node
volumes:
- es_data:/usr/share/elasticsearch/data
kibana:
image: kibana:8.11.0
ports:
- "5601:5601"

Формат логов в приложении:

// Структурированные JSON-логи
const winston = require('winston');
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json() // ← Структурированный формат!
),
transports: [new winston.transports.Console()],
});
logger.info('Request processed', {
method: 'GET',
path: '/api/users',
duration: 45,
statusCode: 200,
requestId: 'abc-123',
});
{
"timestamp": "2024-01-15T10:00:00.000Z",
"level": "info",
"message": "Request processed",
"method": "GET",
"path": "/api/users",
"duration": 45,
"statusCode": 200,
"requestId": "abc-123"
}

Правила:

  • Пишите в stdout/stderr (не в файлы внутри контейнера)
  • Используйте структурированный JSON формат
  • Не логируйте секреты и персональные данные
  • Настраивайте ротацию логов (max-size, max-file)