温馨提示×

Ubuntu Java日志如何实现自动化管理

小樊
48
2026-01-08 07:49:58
栏目: 编程语言

Ubuntu Java日志自动化管理实践

一 总体思路

  • 在应用内使用日志框架(如 Logback、Log4j2)做按时间与大小的滚动,控制单文件与保留数量,减少运维介入。
  • 在操作系统侧用 logrotate 做二次保护与统一治理(压缩、清理、权限、可执行脚本),并与 cron 配合实现无人值守。
  • 在需要检索与可视化时,引入 Filebeat → Logstash → Elasticsearch/Kibana 做集中采集、解析与展示。
  • nohup 输出或无法改造的应用,使用脚本与 cron 做定时备份与清理,避免磁盘被占满。

二 应用内自动滚动配置

  • Logback 示例(按天滚动,超过 250MB 触发,保留 30 天)
<configuration>
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/app.log</file>
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>logs/app-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
      <maxHistory>30</maxHistory>
      <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <maxFileSize>250MB</maxFileSize>
      </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
  </appender>
  <root level="info">
    <appender-ref ref="FILE"/>
  </root>
</configuration>
  • Log4j2 示例(基于时间与大小滚动,保留 20 份,自动压缩)
<Configuration status="WARN">
  <Appenders>
    <RollingFile name="RollingFile"
                 fileName="logs/app.log"
                 filePattern="logs/app-%d{yyyy-MM-dd}-%i.log.gz">
      <PatternLayout pattern="%d %p %c{1.} [%t] %m%n"/>
      <Policies>
        <TimeBasedTriggeringPolicy/>
        <SizeBasedTriggeringPolicy size="250 MB"/>
      </Policies>
      <DefaultRolloverStrategy max="20"/>
    </RollingFile>
  </Appenders>
  <Loggers>
    <Root level="info">
      <AppenderRef ref="RollingFile"/>
    </Root>
  </Loggers>
</Configuration>
  • 说明:上述配置分别通过 TimeBasedTriggeringPolicy/SizeBasedTriggeringPolicySizeAndTimeBasedFNATP 实现“按天+按大小”的滚动,避免单个日志无限增长。

三 操作系统侧自动化治理

  • 使用 logrotate 对应用日志统一轮转、压缩与清理(适合所有 Java 应用,包括 nohup 输出)
    1. 创建配置:/etc/logrotate.d/myapp
/var/log/myapp/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 appuser appgroup
    sharedscripts
    postrotate
        # 若应用支持信号平滑重载;不支持可改为重启或仅清空
        kill -USR1 $(cat /var/run/myapp.pid 2>/dev/null) 2>/dev/null || true
    endscript
}
  1. 测试与生效
sudo logrotate -d /etc/logrotate.d/myapp   # 语法与执行计划演练
sudo logrotate -vf /etc/logrotate.d/myapp  # 强制执行一次
  1. 运行方式:logrotate 通常由 /etc/cron.daily/logrotate 每日触发,无需额外定时任务。
  • 若必须“按大小立即切割”且应用不支持信号重载,可用 copytruncate 方式(注意其“复制后截断”的特性与可能的日志丢失窗口):
/var/log/myapp/nohup.out {
    size 100M
    rotate 10
    copytruncate
    missingok
    notifempty
}
  • 纯清理脚本 + cron(当仅需删除过期日志时)
#!/usr/bin/env bash
LOG_DIR="/var/log/myapp"
find "$LOG_DIR" -name "*.gz" -mtime +7 -delete
# 可扩展:按业务再清理 .log 或按目录层级清理
# 每天 03:00 执行
0 3 * * * /usr/local/bin/clean_old_logs.sh

上述做法分别体现了 logrotate 的标准用法与 copytruncate 的适用场景,以及用 cron 做定时清理的通用模式。

四 集中化采集与可视化

  • 轻量采集链路:Filebeat → Logstash → Elasticsearch/Kibana
    1. Filebeat 采集
# /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/myapp/*.log
output.logstash:
  hosts: ["localhost:5044"]
  1. Logstash 处理与输出
# /etc/logstash/conf.d/java.conf
input { beats { port => 5044 } }
filter {
  # 可添加 grok、date 等解析规则
}
output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "java-logs-%{+YYYY.MM.dd}"
  }
  stdout { codec => rubydebug }
}
  1. 启动服务
sudo systemctl start filebeat
sudo systemctl start logstash
  • 适用场景:多实例、多服务器集中存储与检索,配合 Kibana 做可视化与告警。

五 落地检查清单与最佳实践

  • 在应用内启用基于时间与大小的滚动,设置合理保留(如 30 天或 20 份),并输出到绝对路径且目录可写。
  • 在系统侧为日志目录创建 logrotate 配置,明确 rotate 7/30、compress、delaycompress、missingok、createpostrotate 动作;用 logrotate -d/-vf 验证。
  • nohup.out 等特殊文件,优先改造应用以支持日志框架;如不可改造,使用 copytruncate 并评估对业务日志一致性的影响。
  • 需要检索/告警时,部署 Filebeat → Logstash → ES/Kibana,在 Logstash 中完成多行堆栈合并、时间解析与字段标准化。
  • 建立磁盘与日志基线:监控 /var/log 使用率,定期审计日志保留策略与清理任务执行情况。

0