Ubuntu Java日志自动化管理实践
一 总体思路
二 应用内自动滚动配置
<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>
<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>
三 操作系统侧自动化治理
/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
}
sudo logrotate -d /etc/logrotate.d/myapp # 语法与执行计划演练
sudo logrotate -vf /etc/logrotate.d/myapp # 强制执行一次
/var/log/myapp/nohup.out {
size 100M
rotate 10
copytruncate
missingok
notifempty
}
#!/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 做定时清理的通用模式。
四 集中化采集与可视化
# /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/myapp/*.log
output.logstash:
hosts: ["localhost:5044"]
# /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 }
}
sudo systemctl start filebeat
sudo systemctl start logstash
五 落地检查清单与最佳实践