统一日志收集的核心是规范容器日志路径并挂载至宿主机预设目录:.NET写入/app/Logs,Nginx用/var/log/nginx/,MySQL/PostgreSQL/Redis分别配置对应日志路径;宿主机logs/按backend/frontend/db等分层,docker-compose.yml中通过volumes统一映射并设rw权限,辅以日志轮转与定期清理。
多服务编排中配置统一日志收集目录,核心是让所有容器把日志输出到宿主机上同一个可预测、可管理的路径,而不是散落在各容器内部。关键不在于“改服务代码”,而在于规范日志输出位置 + 统一挂载策略 + 权限保障。
明确各服务日志输出路径(容器内)
不同服务默认日志路径不同,需提前确认并标准化,避免挂载错位:
-
.NET 后端:建议配置 appsettings.json,将日志写入
/app/Logs(如 Serilog 或 Microsoft.Extensions.Logging 配置) -
Vue 前端(Nginx 容器):Nginx 默认日志在
/var/log/nginx/,含access.log和error.log -
MySQL / PostgreSQL:通过配置文件(如
my.cnf或postgresql.conf)指定log_error或logging_collector = on并设日志目录(如/var/log/mysql/) -
Redis:在
redis.conf中设置logfile "/var/log/redis/redis.log",禁用stdout输出
宿主机统一目录结构规划
在 docker-compose.yml 同级目录下建 logs/,按服务类型分层,支持多实例自动隔离:
logs/ ├── backend/ │ ├── api-auth/ │ ├── api-order/ │ └── api-user/ ├── frontend/ │ ├── web-admin/ │ ├── web-customer/ │ └── web-mobile/ ├── db/ │ ├── mysql/ │ └── redis/ └── nginx-proxy/ # 若有独立反向代理
这样既清晰又便于后续用 tail -f logs/backend/api-order/*.log 快速定位。
docker-compose.yml 中统一挂载配置
每个 service 下用 volumes 将容器日志路径映射到上述宿主机对应子目录。示例片段:
services:
auth-api:
build: ./backend/auth
volumes:
- ./logs/backend/api-auth:/app/Logs:rw
# 其他配置...
<p>web-admin:
image: nginx:alpine
volumes:</p><ul><li>./logs/frontend/web-admin:/var/log/nginx:rw<h1>其他配置...</h1></li></ul><p>redis:
image: redis:7-alpine
volumes:</p><ul><li>./logs/db/redis:/var/log/redis:rw
command: redis-server /usr/local/etc/redis/redis.conf注意:挂载路径末尾的 :rw 显式声明读写权限;确保宿主机目录已创建(mkdir -p logs/...),且 Docker 进程有写入权限(必要时 chown -R 1001:1001 logs/,适配容器内 UID)。
补充建议:日志轮转与清理
宿主机目录长期运行易膨胀,建议在容器启动时或宿主机上启用日志轮转:
- Nginx 容器内可加
logrotate配置,或用nginx -s reload配合外部脚本切割 - .NET 应用若用 Serilog,启用
RollingFileSink并设retainedFileCountLimit: 7 - 宿主机可部署简单 cron:
find ./logs -name "*.log" -mtime +30 -delete


















