1. 選擇合適的日志框架
優先使用SLF4J作為日志門面(統一API,解耦業務代碼與具體實現),搭配Logback(SLF4J原生實現,性能優于Log4j 1.x,支持異步日志與動態配置)或Log4j2(更高性能、更好擴展性)。避免使用JCL(Jakarta Commons Logging),因其類加載問題可能導致兼容性故障。
2. 優化日志配置
INFO
或WARN
級別,禁用DEBUG
及以下級別(減少不必要的I/O消耗);開發環境可使用DEBUG
排查問題。通過配置文件(如Logback的logback.xml
、Log4j2的log4j2.xml
)動態調整,無需重啟應用。%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
。logger.debug("User {} logged in", username)
),避免在日志語句中進行字符串拼接(減少不必要的對象創建);禁止在循環中記錄日志(防止大量I/O操作影響性能)。3. 實施日志輪轉策略
通過logrotate(Linux系統自帶工具)或日志框架內置輪轉(如Logback的TimeBasedRollingPolicy
、Log4j2的RollingFileAppender
)管理日志文件,防止單個文件過大占用磁盤空間。
/etc/logrotate.d/java_app
):/path/to/java/logs/*.log {
daily # 每天輪轉
rotate 7 # 保留7天日志
compress # 壓縮舊日志(節省空間)
missingok # 日志文件不存在時不報錯
notifempty # 日志為空時不輪轉
create 0644 root root # 新日志文件權限與所有者
}
logback.xml
):<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/app-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory> <!-- 保留30天 -->
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
4. 集中式日志管理
使用ELK Stack(Elasticsearch+Logstash+Kibana)或Graylog搭建集中式日志平臺,實現日志的收集、存儲、搜索、可視化。
input
(如Filebeat采集Java日志)、filter
(解析日志格式)、output
(發送至Elasticsearch);ERROR
級別日志)、性能瓶頸(如接口響應時間)。5. 異步日志記錄
使用Log4j2的異步Logger(AsyncLogger
)或Logback的異步Appender(AsyncAppender
),將日志事件寫入內存隊列,由單獨線程異步刷新至磁盤。優勢:減少日志記錄對業務線程的阻塞,提升應用性能(尤其在高并發場景下)。
<appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="FILE" /> <!-- 關聯同步FileAppender -->
<queueSize>1024</queueSize> <!-- 隊列大小 -->
<discardingThreshold>0</discardingThreshold> <!-- 不丟棄日志 -->
</appender>
6. 日志監控與告警
ERROR
、Exception
),當出現異常日志時,通過郵件、短信或釘釘通知運維人員;Discover
功能搜索特定日志(如logger.name=com.example.service
),或通過Visualize
創建圖表(如每日錯誤日志數量趨勢);find /path/to/logs -size +1G -exec rm -f {} \;
)。7. 敏感信息脫敏
在日志記錄前對敏感信息(如用戶密碼、身份證號、手機號、銀行卡號)進行脫敏處理,避免泄露。例如:
public class SensitiveDataLogger {
public static void logUserInfo(String username, String password) {
String maskedPassword = maskSensitiveInfo(password, "*", 6, 4); // 密碼中間部分替換為*
logger.info("User {} logged in, password: {}", username, maskedPassword);
}
private static String maskSensitiveInfo(String info, char maskChar, int start, int end) {
if (info == null || info.length() <= start + end) {
return info;
}
return info.substring(0, start) + repeat(maskChar, info.length() - start - end) + info.substring(info.length() - end);
}
private static String repeat(char c, int times) {
return String.valueOf(c).repeat(times);
}
}
8. 自動化清理與備份
cron
定期執行清理腳本,刪除超過保留期限的日志文件(如保留30天)。示例腳本(backup_java_logs.sh
):#!/bin/bash
BACKUP_DIR="/path/to/backup/java_logs"
DATE=$(date +%Y%m%d)
LOG_DIR="/path/to/java/logs"
# 備份日志
cp $LOG_DIR/*.log "$BACKUP_DIR/app_$DATE.log"
# 清空原日志文件
cat /dev/null > $LOG_DIR/*.log
# 刪除30天前的備份
find $BACKUP_DIR -mtime +30 -type f -name "app_*.log" -exec rm -f {} \;
配置cron任務(每天凌晨0點執行):0 0 * * * /path/to/backup_java_logs.sh