Ubuntu Java日志管理实用技巧
一 日志框架选型与配置
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.14.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version>
</dependency>
代码中使用:import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(MyClass.class);
logger.info("Hello, {}", "world");
以上做法可统一日志门面、提升性能并利于集中化采集。二 日志轮转与保留策略
<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}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>250MB</maxFileSize>
</triggeringPolicy>
</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 interval="1" modulate="true"/>
<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 root root
sharedscripts
postrotate
/bin/kill -HUP $(cat /var/run/myapp.pid 2>/dev/null) 2>/dev/null || true
endscript
}
测试与生效:sudo logrotate -vf /etc/logrotate.conf;logrotate 通常由cron.daily定时执行。注意:若应用已按时间/大小切分,系统级轮转应以“复制后清空”为主,避免破坏应用内滚动逻辑。三 集中化收集与分析
input {
file {
path => "/var/log/myapp/*.log"
start_position => "beginning"
sincedb_path => "/var/lib/logstash/sincedb-myapp"
}
}
filter {
grok { match => { "message" => "%{COMBINEDAPACHELOG}" } }
date { match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ] }
}
output {
elasticsearch { hosts => ["localhost:9200"] }
stdout { codec => rubydebug }
}
启动顺序建议:Elasticsearch → Logstash → Kibana。该方案适合多实例、多环境统一检索与告警。四 日常查看与定位技巧
tail -f /var/log/myapp/app.loggrep -i "error\|exception" /var/log/myapp/*.logless /var/log/myapp/app.logjournalctl -u myapp.service -fSystem.getProperty("user.dir")五 备份清理与合规安全
rotate与compress实现按日/周轮转与压缩归档,控制保留周期。#!/usr/bin/env bash
BACKUP_DIR="/opt/backup/java-logs"
DATE=$(date +%Y%m%d)
mkdir -p "$BACKUP_DIR"
cp /var/log/myapp/*.log "$BACKUP_DIR/$DATE.log"
> /var/log/myapp/*.log
find "$BACKUP_DIR" -mtime +30 -type f -name "*.log" -delete
配合crontab定时执行,实现自动化留存与清理。