18. Логирование
Логирование — критически важная часть мониторинга контейнеризованных приложений. Docker предоставляет гибкую систему логирования с поддержкой различных драйверов и интеграцией с централизованными системами сбора логов.
Базовые команды docker logs
Заголовок раздела «Базовые команды docker logs»# Просмотр логов контейнера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 строк с timestampdocker 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 # системный syslogdocker run --log-driver=journald myapp # systemd journaldocker run --log-driver=gelf myapp # Graylog Extended Log Formatdocker run --log-driver=fluentd myapp # Fluentd/Fluent Bitdocker run --log-driver=awslogs myapp # Amazon CloudWatchdocker run --log-driver=none myapp # отключить логированиеКонфигурация json-file драйвера
Заголовок раздела «Конфигурация json-file драйвера»{ "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Централизованное логирование с ELK/EFK
Заголовок раздела «Централизованное логирование с ELK/EFK»# docker-compose.yml с Fluentdversion: '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)