Docker容器日志管理最佳实践
容器日志管理是运维中容易忽视但非常重要的环节。日志不管理会导致磁盘被撑满(容器宕机)、排查问题困难(日志丢失)、安全审计缺失。本文分享Docker容器日志管理的最佳实践。
日志驱动
Docker支持多种日志驱动(logging driver):json-file(默认,写入JSON文件)、syslog(发送到syslog)、journald(写入systemd journal)、fluentd(发送到Fluentd)、awslogs(发送到CloudWatch)。
生产环境建议不要使用默认的json-file(日志文件会无限增长),而是使用专门的日志收集方案。
日志轮转
如果使用json-file驱动,务必配置日志轮转:"log-driver": "json-file", "log-opts": {"max-size": "100m", "max-file": "3"}。这样每个容器的日志最多占用300MB磁盘空间。可以在Docker daemon.json中全局配置。
K8s容器日志
在Kubernetes中,容器标准输出(stdout/stderr)会被K8s自动收集到节点上的日志文件中。推荐使用DaemonSet方式部署日志采集Agent(如Logtail、Filebeat),自动采集所有Pod的日志。
应用日志建议输出到标准输出而非文件,这样K8s的日志采集机制可以自动处理。如果必须写文件,使用emptyDir Volume挂载日志目录,配合Sidecar容器采集。
日志格式规范
统一使用JSON格式输出日志,包含以下字段:timestamp(ISO8601格式)、level(DEBUG/INFO/WARN/ERROR)、service(服务名)、traceId(链路追踪ID)、message(日志内容)。JSON格式便于日志系统解析和检索。
日志级别管理
生产环境使用INFO级别,排查问题时动态调整为DEBUG(通过环境变量或配置中心)。ERROR级别日志应该同时触发告警。避免在循环中打印大量日志(会导致磁盘IO瓶颈)。
