Debian上Java日志的有效管理实践
一 架构总览与关键原则
二 应用内日志框架配置要点
<configuration>
<appender name="JSON" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/app.%d{yyyy-MM-dd}.gz</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp><timeZone>UTC</timeZone></timestamp>
<loggerName/><threadName/><logLevel/><message/><stackTrace/>
</providers>
</encoder>
</appender>
<!-- 可选:异步提升吞吐 -->
<appender name="ASYNC_JSON" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>500</queueSize>
<discardingThreshold>0</discardingThreshold>
<appender-ref ref="JSON"/>
</appender>
<root level="INFO">
<appender-ref ref="ASYNC_JSON"/>
</root>
</configuration>
三 系统侧日志轮转与清理
/home/app/logs/app.log {
daily
missingok
rotate 30
dateext
copytruncate
notifempty
compress
delaycompress
create 0640 app app
}
sudo logrotate -d /etc/logrotate.d/myappsudo logrotate -vf /etc/logrotate.d/myappkill -USR1 <pid>,避免使用copytruncate带来的潜在一致性问题。四 集中式日志采集与分析
# /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /home/app/logs/*.log
output.elasticsearch:
hosts: ["http://localhost:9200"]
setup.kibana:
host: "localhost:5601"
# /etc/logstash/conf.d/java.conf
input { beats { port => 5044 } }
filter {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:log_level} %{GREEDYDATA:msg}" }
}
date { match => [ "timestamp", "ISO8601" ] }
}
output { elasticsearch { hosts => ["localhost:9200"] index => "java-logs-%{+YYYY.MM.dd}" } }
sudo systemctl start filebeat logstashjava-logs-*,即可进行检索与可视化。五 日常运维与排错清单
tail -f /path/to/app.logmultitail /var/log/myapp/*.log 或 lnav /var/log/myapp/grep -n "ERROR" app.log 或 grep -A20 -B5 "Exception" app.log