1. 使用logrotate進行日志輪轉與清理
logrotate是Linux系統自帶的日志管理工具,可自動處理Java日志的輪轉、壓縮、刪除及權限設置,防止日志文件無限增長占用磁盤空間。
sudo yum install logrotate
;Ubuntu: sudo apt-get install logrotate
)。/etc/logrotate.d/
目錄下創建Java應用專屬配置文件(如java_app
),內容示例如下:/path/to/your/java/logs/*.log {
daily # 按天輪轉(可選:weekly/monthly)
rotate 7 # 保留最近7個日志文件
compress # 壓縮舊日志(節省空間)
missingok # 日志文件不存在時不報錯
notifempty # 日志為空時不輪轉
create 640 root adm # 新日志文件權限(屬主:root,屬組:adm)
sharedscripts # 多個日志文件匹配時僅執行一次postrotate
postrotate
# 可選:通知Java應用重新打開日志文件(需應用支持)
if [ -f /path/to/your/java/logs/app.pid ]; then
kill -USR1 $(cat /path/to/your/java/logs/app.pid)
fi
endscript
}
logrotate -d /etc/logrotate.d/java_app
測試配置語法(模擬運行,不實際修改文件);無誤后通過sudo systemctl reload logrotate
重載配置,使設置生效。2. Java應用內配置日志框架輪轉
通過Log4j、Logback等Java日志框架的配置文件,直接設置日志文件的滾動策略(如按大小、時間分割),無需依賴外部工具。
log4j.rootLogger=INFO, file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=/var/log/myapp.log
log4j.appender.file.MaxFileSize=10MB # 單個日志文件最大10MB
log4j.appender.file.MaxBackupIndex=10 # 保留10個備份文件
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
<configuration>
<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.gz</fileNamePattern> # 按天分割,壓縮為gz格式
<maxHistory>30</maxHistory> # 保留30天的日志
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
這種方式更貼合Java應用自身需求,靈活性更高。3. 編寫Shell腳本自動化處理
對于需要自定義邏輯的場景(如備份到遠程服務器、清理特定模式的日志),可編寫Shell腳本并通過Cron定時執行。
#!/bin/bash
BACKUP_DIR="/path/to/backup/java_logs"
LOG_DIR="/path/to/your/java/logs"
DATE=$(date +%Y%m%d)
# 創建備份目錄(若不存在)
mkdir -p "$BACKUP_DIR"
# 備份日志文件(帶日期后綴)
cp "$LOG_DIR"/*.log "$BACKUP_DIR"/myapp_$DATE.log
# 清空原始日志文件(避免占用空間)
> "$LOG_DIR"/*.log
# 刪除30天前的備份文件
find "$BACKUP_DIR" -type f -name "myapp_*.log" -mtime +30 -exec rm -f {} \;
crontab -e
添加以下內容,每天凌晨0點執行腳本:0 0 * * * /path/to/backup_java_logs.sh
腳本可根據需求擴展,如添加日志壓縮、同步到FTP服務器等功能。4. 使用systemd管理Java應用日志
若Java應用以systemd服務運行(如通過systemctl start myapp
啟動),可通過修改服務單元文件,將日志重定向到系統日志(journalctl),便于統一管理。
/etc/systemd/system/myapp.service
(若不存在則創建),在[Service]
段添加以下內容:[Service]
ExecStart=/path/to/your/java-app
StandardOutput=append:/var/log/myapp.log # 標準輸出追加到日志文件
StandardError=append:/var/log/myapp_error.log # 標準錯誤追加到錯誤日志文件
Restart=always # 應用崩潰時自動重啟
sudo systemctl daemon-reload
sudo systemctl restart myapp
journalctl
命令查看,例如:journalctl -u myapp -f # 實時查看myapp服務的日志
journalctl -u myapp --since "2025-10-01" # 查看2025-10-01以來的日志
這種方式將Java日志整合到系統日志中,便于通過systemd工具統一管理。5. 集中式日志管理(ELK Stack)
對于分布式系統或需要集中分析日志的場景,可使用ELK Stack(Elasticsearch + Logstash + Kibana)實現日志的收集、存儲、搜索與可視化。
<appender name="SOCKET" class="ch.qos.logback.classic.net.SocketAppender">
<remoteHost>logstash-server-ip</remoteHost>
<port>5000</port>
<includeCallerData>true</includeCallerData>
</appender>
集中式管理便于團隊協作分析日志,快速定位跨服務的異常問題。