1. 选择合适的日志框架
优先使用SLF4J作为日志门面(统一API,解耦业务与具体实现),搭配**Logback(SLF4J原生实现,性能优于Log4j 1.x,支持异步日志与动态配置)或Log4j2(高性能、扩展性强,支持JSON配置)**作为日志实现。避免使用JCL(Jakarta Commons Logging),因其类加载问题易导致兼容性故障。
2. 规范日志级别与格式
logback.xml、Log4j2的log4j2.xml)动态调整级别,无需重启应用。pattern:%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} [%thread] - %msg%n。3. 实现日志轮转与归档
通过日志框架内置功能或系统工具防止日志文件过大,避免磁盘空间耗尽:
TimeBasedRollingPolicy(按时间切割,如app-%d{yyyy-MM-dd}.log,保留30天)或SizeAndTimeBasedRollingPolicy(按时间+大小切割,如app-%d{yyyy-MM-dd}.%i.log.gz,单文件最大10MB,保留30天,总大小不超过1GB);RollingFileAppender配合TimeBasedTriggeringPolicy(时间触发)或SizeBasedTriggeringPolicy(大小触发),支持压缩(如.gz格式)。logrotate(Linux自带)自动化管理日志轮转。配置示例(/etc/logrotate.d/myapp):/var/log/myapp/*.log {
daily # 每天轮转
rotate 7 # 保留7个归档文件
compress # 压缩旧日志(gzip)
missingok # 忽略缺失文件
notifempty # 空文件不轮转
create 0664 root root # 新日志文件权限与所有者
sharedscripts # 所有文件轮转完成后执行脚本
postrotate # 轮转后通知应用重新打开日志文件
/bin/kill -USR1 `cat /var/run/myapp.pid`
endscript
}
测试配置:logrotate -d /etc/logrotate.d/myapp(模拟运行),强制轮转:logrotate -f /etc/logrotate.d/myapp。4. 集中式日志管理
对于分布式系统或微服务架构,使用ELK Stack(Elasticsearch+Logstash+Kibana)或Graylog实现日志集中收集、存储、分析与可视化:
5. 强化日志安全性
Filter(如Logback的SensitiveDataFilter)或代码拦截(如AOP)替换为***;root或应用用户)可读写(如chmod 0664 /var/log/myapp/*.log,chown root:root /var/log/myapp/*.log),防止未授权访问。6. 优化日志性能
AsyncAppender或Log4j2的AsyncLogger,将日志写入操作放入单独线程,减少对主线程的阻塞(提升应用响应速度);logger.debug("User {} logged in", username),而非logger.debug("User " + username + " logged in"),减少字符串拼接开销)。7. 监控与自动化维护
logwatch(每日发送日志摘要邮件)、goaccess(实时分析日志并生成报表)或Prometheus+Granafa(监控日志量、异常数等指标),及时发现异常(如日志量突增可能意味着系统故障);cron定时任务定期清理过期日志(如30天前的日志),示例脚本:#!/bin/bash
BACKUP_DIR="/backup/logs"
DATE=$(date +%Y%m%d)
LOG_DIR="/var/log/myapp"
find $LOG_DIR -name "*.log" -mtime +30 -exec rm -f {} \; # 删除30天前的.log文件
find $BACKUP_DIR -name "*.gz" -mtime +90 -exec rm -f {} \; # 删除90天前的.gz归档文件
添加定时任务:crontab -e,添加0 0 * * * /path/to/cleanup_logs.sh(每天0点执行)。