日志管理与配置说明
📋 概述
本文档详细说明麦瓣健康项目的日志管理策略、配置方法和运维最佳实践,包括应用日志、系统日志、Docker容器日志的完整管理方案。
🎯 日志管理目标
- 空间控制:防止日志文件无限增长占满磁盘
- 自动轮转:定期归档和清理旧日志
- 便于排查:保留足够的历史日志用于问题定位
- 性能优化:避免大日志文件影响系统性能
📁 日志文件分布
1. 应用服务日志
所有微服务的运行日志统一存放在 /var/log/ 目录:
/var/log/
├── maiban-admin.log # 后台管理服务
├── maiban-auth.log # 认证授权服务
├── maiban-gateway.log # API网关服务
├── maiban-health-service.log # 健康服务
├── maiban-im.log # 即时通讯服务
├── maiban-mall.log # 商城服务
├── maiban-marketing.log # 营销服务
├── maiban-monitor.log # 监控服务
├── maiban-nurse.log # 护士端服务
├── maiban-order.log # 订单服务
├── maiban-payment.log # 支付服务
├── maiban-search.log # 搜索服务
└── maiban-user.log # 用户服务
2. 项目本地日志
各微服务项目目录下的日志:
/root/maiban/backend/
├── maiban-admin/logs/
├── maiban-auth/logs/
├── maiban-gateway/logs/
└── ... (其他服务)
3. Docker 容器日志
Docker 容器的日志通过 docker logs 命令查看:
docker logs maiban-es # Elasticsearch日志
docker logs nacos-registry # Nacos注册中心日志
docker logs mysql # MySQL日志
docker logs redis # Redis日志
docker logs rabbitmq # RabbitMQ日志
⚙️ Logrotate 配置
配置文件位置
/etc/logrotate.d/maiban
配置内容
# Maiban 服务日志轮转配置
/var/log/maiban-*.log {
su root root
daily
rotate 7
missingok
notifempty
compress
delaycompress
copytruncate
maxsize 100M
create 0644 root root
}
# Maiban 项目日志
/root/maiban/backend/*/logs/*.log {
su root root
daily
rotate 7
missingok
notifempty
compress
delaycompress
copytruncate
maxsize 50M
create 0644 root root
}
配置参数说明
| 参数 | 说明 |
|---|---|
su root root | 指定轮转时使用的用户和组 |
daily | 每天执行日志轮转 |
rotate 7 | 保留最近7天的日志文件 |
missingok | 如果日志文件不存在,不报错继续 |
notifempty | 日志文件为空时不轮转 |
compress | 对旧日志进行 gzip 压缩 |
delaycompress | 延迟压缩,保留最近一次的日志不压缩 |
copytruncate | 复制日志内容后清空原文件(不中断服务) |
maxsize 100M | 单个文件超过100MB立即轮转 |
create 0644 root root | 创建新日志文件的权限和所有者 |
🔧 日志轮转验证
测试配置
# 测试配置文件语法
logrotate -d /etc/logrotate.d/maiban
# 强制执行日志轮转(测试用)
logrotate -f /etc/logrotate.d/maiban
查看轮转状态
# 查看 logrotate 状态
cat /var/lib/logrotate/status | grep maiban
# 查看轮转后的日志文件
ls -lh /var/log/maiban-*.log*
🗂️ 日志清理脚本
手动清理脚本
创建 /root/scripts/clean-logs.sh:
#!/bin/bash
# 麦瓣健康日志清理脚本
echo "开始清理日志..."
# 清理应用日志(保留最后500行)
for log in /var/log/maiban-*.log; do
if [ -f "$log" ]; then
tail -500 "$log" > "$log.tmp" && mv "$log.tmp" "$log"
echo "已清理: $log"
fi
done
# 清理项目日志
find /root/maiban/backend -name "*.log" -type f -size +10M -exec sh -c '
tail -500 "$1" > "$1.tmp" && mv "$1.tmp" "$1"
echo "已清理: $1"
' _ {} \;
# 清理系统日志
journalctl --vacuum-time=3d
# 清理 Docker 日志和未使用的资源
docker system prune -f --volumes
echo "日志清理完成!"
df -h /
执行清理
chmod +x /root/scripts/clean-logs.sh
/root/scripts/clean-logs.sh
📊 日志监控与告警
磁盘空间监控
# 检查磁盘使用率
df -h /
# 查看最大的日志文件
du -sh /var/log/maiban-*.log | sort -hr | head -10
# 统计所有日志文件总大小
du -sh /var/log/maiban-*.log | awk '{sum+=$1} END {print sum, "KB"}'
设置磁盘空间告警
创建监控脚本 /root/scripts/disk-alert.sh:
#!/bin/bash
# 磁盘空间告警脚本
THRESHOLD=85
CURRENT=$(df -h / | grep -v Filesystem | awk '{print $5}' | sed 's/%//')
if [ $CURRENT -gt $THRESHOLD ]; then
echo "⚠️ 警告:磁盘使用率 ${CURRENT}% 超过阈值 ${THRESHOLD}%"
echo "最大的日志文件:"
du -sh /var/log/maiban-*.log | sort -hr | head -5
fi
添加到 Crontab
# 每小时检查一次磁盘空间
0 * * * * /root/scripts/disk-alert.sh
🔍 应用层日志配置
Spring Boot Logback 配置
在各微服务的 logback-spring.xml 中配置日志轮转:
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/var/log/maiban-${spring.application.name}.log</file>
<!-- 滚动策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 日志文件名模式 -->
<fileNamePattern>/var/log/maiban-${spring.application.name}-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<!-- 单个文件最大大小 -->
<maxFileSize>100MB</maxFileSize>
<!-- 保留天数 -->
<maxHistory>7</maxHistory>
<!-- 总大小限制 -->
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
推荐配置参数
| 参数 | 开发环境 | 生产环境 | 说明 |
|---|---|---|---|
maxFileSize | 50MB | 100MB | 单个日志文件最大大小 |
maxHistory | 3天 | 7-30天 | 保留历史日志天数 |
totalSizeCap | 500MB | 1-5GB | 所有日志文件总大小限制 |
level | DEBUG | INFO | 日志级别 |
🐳 Docker 日志管理
配置 Docker 日志驱动
在 docker-compose-env.yml 中配置:
services:
elasticsearch:
logging:
driver: "json-file"
options:
max-size: "10m" # 单个日志文件最大10MB
max-file: "3" # 最多保留3个日志文件
全局 Docker 日志配置
编辑 /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
重启 Docker 服务:
systemctl restart docker
清理 Docker 日志
# 查看 Docker 日志占用
du -sh /var/lib/docker/containers/*/*-json.log
# 清理所有容器日志
truncate -s 0 /var/lib/docker/containers/*/*-json.log
# 清理未使用的 Docker 资源
docker system prune -af --volumes
📈 日志分析工具
1. 实时查看日志
# 实时查看应用日志
tail -f /var/log/maiban-admin.log
# 过滤错误日志
tail -f /var/log/maiban-admin.log | grep ERROR
# 多个日志文件同时查看
tail -f /var/log/maiban-*.log
2. 日志统计分析
# 统计错误日志数量
grep -c ERROR /var/log/maiban-admin.log
# 统计最近1小时的错误
grep ERROR /var/log/maiban-admin.log | grep "$(date -d '1 hour ago' '+%Y-%m-%d %H')"
# 按时间段分析日志
awk '/2025-10-23 10:/ && /ERROR/' /var/log/maiban-admin.log
3. 日志搜索
# 搜索特定关键词
grep -rn "Connection refused" /var/log/maiban-*.log
# 搜索最近的异常堆栈
grep -A 20 "Exception" /var/log/maiban-admin.log | tail -30
# 搜索并高亮显示
grep --color=auto "ERROR" /var/log/maiban-admin.log
🚨 常见问题处理
1. 磁盘空间不足
现象:磁盘使用率超过 90%
排查:
# 查找大文件
find /var/log -type f -size +100M
# 查看日志总大小
du -sh /var/log/maiban-*.log
解决:
# 立即清理日志
/root/scripts/clean-logs.sh
# 或手动清理
for log in /var/log/maiban-*.log; do
tail -500 "$log" > "$log.tmp" && mv "$log.tmp" "$log"
done
2. 日志轮转未生效
排查:
# 检查 logrotate 配置
logrotate -d /etc/logrotate.d/maiban
# 查看 logrotate 日志
cat /var/lib/logrotate/status
解决:
# 修复权限问题
chmod 644 /etc/logrotate.d/maiban
# 手动执行轮转
logrotate -f /etc/logrotate.d/maiban
3. 日志写入权限问题
现象:应用无法写入日志
解决:
# 检查日志文件权限
ls -l /var/log/maiban-*.log
# 修复权限
chmod 644 /var/log/maiban-*.log
chown root:root /var/log/maiban-*.log
# 检查目录权限
chmod 755 /var/log
📝 最佳实践
1. 日志级别使用建议
| 级别 | 使用场景 | 示例 |
|---|---|---|
| ERROR | 系统错误、异常 | 数据库连接失败、接口调用异常 |
| WARN | 警告信息 | 配置参数缺失、性能阈值告警 |
| INFO | 关键业务流程 | 订单创建、支付成功、用户登录 |
| DEBUG | 调试信息 | 方法入参、SQL语句、接口请求 |
| TRACE | 详细追踪 | 详细的方法调用栈 |
2. 日志内容规范
好的日志示例:
2025-10-23 10:30:45.123 [http-nio-8080-exec-1] INFO OrderService - 创建订单成功, orderId=20251023001, userId=1001, amount=199.00
不好的日志示例:
订单创建了
3. 敏感信息处理
❌ 不要记录:
- 用户密码
- 身份证号码
- 银行卡号
- 手机号完整信息
✅ 脱敏处理:
// 手机号脱敏
String phone = "138****5678";
// 身份证脱敏
String idCard = "320***********1234";
4. 定期维护计划
| 频率 | 维护项目 |
|---|---|
| 每天 | 自动日志轮转(logrotate) |
| 每周 | 检查磁盘空间使用率 |
| 每月 | 分析日志统计数据,优化配置 |
| 每季度 | 清理超期的归档日志 |
🔗 相关文档
📞 运维支持
如遇到日志相关问题,请按以下步骤排查:
- 检查磁盘空间:
df -h / - 检查日志大小:
du -sh /var/log/maiban-*.log - 查看最新日志:
tail -100 /var/log/maiban-服务名.log - 检查轮转配置:
cat /etc/logrotate.d/maiban
文档版本:v1.0
最后更新:2025-10-23
维护人员:麦瓣健康技术运维团队
