溫馨提示×

Ubuntu Java日志文件過大怎么辦

小樊
40
2025-09-20 11:30:36
欄目: 編程語言

使用 logrotate 工具(系統級自動管理)
logrotate 是 Ubuntu 系統自帶的日志管理工具,可自動輪轉、壓縮和刪除舊日志,適合大多數 Java 應用場景。

  • 安裝 logrotate(若未安裝):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(強制執行一次,驗證配置是否正確)。
  • 自動運行:logrotate 默認由系統 cron 任務(/etc/cron.daily/logrotate)每日執行,無需額外配置。

調整 systemd journald 日志策略(Systemd 管理的服務)
若 Java 應用以 systemd 服務運行(如 Tomcat、Spring Boot 打包的 jar),可通過 journald 限制日志大小和保留時間。

  • 檢查 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       # 保留的日志文件數量
    
  • 重啟 journald 生效sudo systemctl restart systemd-journald。
  • 清理舊日志:若需立即釋放空間,可運行:sudo journalctl --vacuum-size=500M(保留不超過500MB的日志)或 sudo journalctl --vacuum-time=1w(保留最近1周的日志)。

配置 Java 日志框架自帶歸檔(應用層精準控制)
通過 Log4j、Logback 等日志框架的配置,實現日志按時間/大小分割、壓縮及自動清理,適合需要精細化管理的應用。

  • Logback 示例(logback.xml)
    <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>
    
  • Log4j2 示例(log4j2.xml)
    <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
    

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女