使用logrotate進行日志輪轉與備份
logrotate是Ubuntu系統自帶的日志管理工具,可自動完成Java日志的輪轉、壓縮、刪除及權限設置,是最常用的備份方案。
sudo apt-get install logrotate
命令安裝。/etc/logrotate.d/myjavaapp
),添加以下內容(以/var/log/myapp/*.log
為例):/var/log/myapp/*.log {
daily # 每天輪轉一次
rotate 7 # 保留7天的備份文件
compress # 使用gzip壓縮舊日志(如myapp.log.1.gz)
missingok # 若日志文件不存在,不報錯
notifempty # 若日志為空,不進行輪轉
create 0640 root root # 新日志文件的權限與所有者
}
sudo logrotate -d /etc/logrotate.d/myjavaapp
測試配置是否正確(模擬執行,不實際修改文件);修改完成后,系統會自動通過cron任務每日執行,無需額外操作。編寫Shell腳本實現自動備份與清理
通過Shell腳本可靈活控制備份邏輯(如添加時間戳、清理舊備份),適合需要自定義的場景。
backup_java_logs.sh
,內容如下(以/opt/myapp/logs/app.log
為例):#!/bin/bash
BACKUP_DIR="/opt/myapp/backup" # 備份目錄
LOG_DIR="/opt/myapp/logs" # Java日志目錄
DATE=$(date +"%Y%m%d_%H%M%S") # 當前時間戳(用于文件名)
# 備份日志文件(帶時間戳)
cp "$LOG_DIR/app.log" "$BACKUP_DIR/app_$DATE.log"
echo "[$(date)] Backup completed: $BACKUP_DIR/app_$DATE.log" >> "$BACKUP_DIR/backup.log"
# 清空原始日志文件(避免占用過多空間)
> "$LOG_DIR/app.log"
# 刪除30天前的備份文件(保留近期備份)
find "$BACKUP_DIR" -type f -name "app_*.log" -mtime +30 -exec rm -f {} \;
chmod +x backup_java_logs.sh
賦予腳本執行權限;使用crontab -e
添加定時任務(如每小時執行一次):0 * * * * /opt/myapp/backup_java_logs.sh
利用Java日志框架內置歸檔功能
若Java應用使用Log4j2、Logback等框架,可通過配置框架自身的滾動策略實現日志自動歸檔,無需依賴外部工具。
log4j2.xml
):<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<RollingFile name="RollingFile"
fileName="/var/log/myapp/app.log" <!-- 當前日志文件路徑 -->
filePattern="/var/log/myapp/app-%d{yyyy-MM-dd}-%i.log.gz"> <!-- 歸檔文件路徑(含日期和序號) -->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/> <!-- 按天滾動 -->
<SizeBasedTriggeringPolicy size="250 MB"/> <!-- 單個文件超過250MB時滾動 -->
</Policies>
<DefaultRolloverStrategy max="7"/> <!-- 最多保留7個歸檔文件 -->
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
該配置實現了按天+按大小雙重滾動,歸檔文件自動壓縮為.gz
格式,保留7天內的備份。通過systemd journalctl管理日志
若Java應用以systemd服務運行(如myapp.service
),可使用journalctl工具收集、存儲和備份系統日志。
/etc/systemd/journald.conf
,調整以下參數(限制日志總大小為500MB,保留5個日志文件):[Journal]
SystemMaxUse=500M
SystemMaxFiles=5
sudo systemctl restart systemd-journald
使配置生效;通過journalctl -u myapp.service
查看Java應用的日志,或使用journalctl --vacuum-size=200M
清理舊日志(保留200MB以內)。使用第三方日志管理工具(如ELK Stack)
對于需要集中管理、實時分析或大規模日志存儲的場景,可使用ELK(Elasticsearch+Logstash+Kibana)或Graylog等工具。
logstash.conf
,定義輸入(從Java日志文件讀?。?、過濾(解析日志格式)、輸出(發送到Elasticsearch);