使用 logrotate 工具(系統級自動管理)
logrotate 是 Ubuntu 系統自帶的日志管理工具,可自動輪轉、壓縮和刪除舊日志,適合大多數 Java 應用場景。
sudo apt-get update && sudo apt-get install logrotate
。/etc/logrotate.d/
下新建應用專屬配置(如 /etc/logrotate.d/my-java-app
),內容示例如下:/var/log/myapp/*.log {
daily # 每天輪轉一次
rotate 7 # 保留最近7個歸檔日志
compress # 使用 gzip 壓縮舊日志
missingok # 若日志文件不存在,不報錯
notifempty # 若日志為空,不進行輪轉
create 640 root adm # 新日志文件的權限(用戶:組)
}
sudo logrotate -f /etc/logrotate.d/my-java-app
(強制執行一次,驗證配置是否正確)。/etc/cron.daily/logrotate
)每日執行,無需額外配置。調整 systemd journald 日志策略(Systemd 管理的服務)
若 Java 應用以 systemd 服務運行(如 Tomcat、Spring Boot 打包的 jar),可通過 journald 限制日志大小和保留時間。
sudo systemctl status systemd-journald
(確保服務運行正常)。/etc/systemd/journald.conf
(或創建 /etc/systemd/journald.conf.d/50-default.conf
),添加以下參數:[Journal]
SystemMaxUse=500M # 日志總大小上限(如500MB)
SystemKeepFree=100M # 磁盤需保留的空閑空間
SystemMaxFileSize=50M # 單個日志文件最大大小
SystemMaxFiles=5 # 保留的日志文件數量
sudo systemctl restart systemd-journald
。sudo journalctl --vacuum-size=500M
(保留不超過500MB的日志)或 sudo journalctl --vacuum-time=1w
(保留最近1周的日志)。配置 Java 日志框架自帶歸檔(應用層精準控制)
通過 Log4j、Logback 等日志框架的配置,實現日志按時間/大小分割、壓縮及自動清理,適合需要精細化管理的應用。
<configuration>
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/var/log/myapp/myapp.log</file> <!-- 當前日志路徑 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/var/log/myapp/myapp-%d{yyyy-MM-dd}-%i.log.gz</fileNamePattern> <!-- 歸檔路徑(含日期和序號,自動壓縮) -->
<maxHistory>7</maxHistory> <!-- 保留最近7天的歸檔 -->
<maxFileSize>250MB</maxFileSize> <!-- 單個日志文件最大250MB -->
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="ROLLING" />
</root>
</configuration>
<Configuration status="WARN">
<Appenders>
<RollingFile name="RollingFile" fileName="/var/log/myapp/myapp.log"
filePattern="/var/log/myapp/myapp-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%d %p %c{1.}[%t] %m%n" />
<Policies>
<TimeBasedTriggeringPolicy /> <!-- 按天分割 -->
<SizeBasedTriggeringPolicy size="250 MB" /> <!-- 超過250MB觸發分割 -->
</Policies>
<DefaultRolloverStrategy max="7" /> <!-- 最多保留7個歸檔 -->
</RollingFile>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="RollingFile" />
</Root>
</Loggers>
</Configuration>
注:需將配置文件放置在應用的 resources
目錄下,并確保應用有權限寫入日志目錄。手動清理緊急情況
若日志文件已占滿磁盤空間,需立即釋放,可通過以下命令快速清理:
sudo rm -f /var/log/myapp/myapp.log
(刪除當前日志,應用可能需重啟以生成新日志)。sudo truncate -s 0 /var/log/myapp/myapp.log
(將文件大小截斷為0,不影響應用運行)。sudo find /var/log -type f -name "*.log" -mtime +30 -delete
(刪除30天前的所有 .log
文件)。使用定時任務自動清理
通過 cron 定時執行腳本,定期清理過期日志,避免人工干預。
/path/to/log_clean.sh
):#!/bin/bash
# 刪除/var/log下超過30天的.log文件
find /var/log -type f -name "*.log" -mtime +30 -exec rm -f {} \;
# 可選:壓縮剩余日志以節省空間
find /var/log -type f -name "*.log" -exec gzip {} \;
sudo chmod +x /path/to/log_clean.sh
。crontab -e
,添加以下行(每天凌晨2點執行):0 2 * * * /path/to/log_clean.sh