Docker Centralized Logging
Centralized logging collects logs from all containers into a single place.
ELK Stack
version: '3.8'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.10.0
environment:
- discovery.type=single-node
- xpack.security.enabled=false
volumes:
- es-data:/usr/share/elasticsearch/data
ports:
- "9200:9200"
logstash:
image: docker.elastic.co/logstash/logstash:8.10.0
volumes:
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
depends_on:
- elasticsearch
kibana:
image: docker.elastic.co/kibana/kibana:8.10.0
ports:
- "5601:5601"
depends_on:
- elasticsearch
api:
build: ./backend
logging:
driver: fluentd
options:
fluentd-address: localhost:24224
networks:
- logging-net
networks:
logging-net:
volumes:
es-data:
Fluentd Configuration
# docker-compose.yml
services:
fluentd:
build: ./fluentd
volumes:
- ./fluentd/conf:/fluentd/etc
ports:
- "24224:24224"
- "24224:24224/udp"
<!-- fluentd/conf/fluent.conf -->
<source>
@type forward
port 24224
bind 0.0.0.0
</source>
<match **>
@type elasticsearch
host elasticsearch
port 9200
index_name docker-logs
</match>
Use Case: Application Logging
version: '3.8'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.10.0
environment:
- discovery.type=single-node
volumes:
- es-data:/usr/share/elasticsearch/data
kibana:
image: docker.elastic.co/kibana/kibana:8.10.0
ports:
- "5601:5601"
api:
build: ./backend
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
volumes:
es-data:
Everyday Use Case
Case: A developer needs to view logs from all services.
# Kibana: http://localhost:5601
# Search logs by service, time, or level
# Export logs from Docker
docker logs api > api.log 2>&1
Best Practices
- Use structured logging: JSON format
- Centralized logging: ELK or similar
- Log rotation: Configure max-size and max-file
- Monitor: Watch for errors and warnings
Conclusion
Centralized logging makes monitoring and debugging easier. Use the ELK stack or similar for effective log management.