Ubuntu 上 Java 日志管理实操指南
一 整体思路与分层
二 应用内日志框架配置
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" 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}.%i.log</fileNamePattern>
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
</Console>
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/app-%d{yyyy-MM-dd}-%i.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<DefaultRolloverStrategy max="20"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
java -Djava.util.logging.config.file=logging.properties -jar myapp.jar
参考配置(logging.properties):handlers=java.util.logging.FileHandler, java.util.logging.ConsoleHandler
java.util.logging.FileHandler.pattern=/var/log/myapp/java.log
java.util.logging.FileHandler.limit=10485760
java.util.logging.FileHandler.count=5
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.ConsoleHandler.level=ALL
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
.level=INFO
以上做法覆盖 Log4j/Logback/SLF4J 与 JUL 的常见用法与最小可用配置。
三 系统层日志轮转与清理
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 myapp myapp
sharedscripts
postrotate
# 若应用支持信号重载;不支持时可省略或改为重启
kill -USR1 $(cat /var/run/myapp.pid 2>/dev/null) 2>/dev/null || true
endscript
}
sudo logrotate -vf /etc/logrotate.d/myapp四 systemd 服务日志与本地检索
[Unit]
Description=My Java App
After=network.target
[Service]
Type=simple
User=myapp
ExecStart=/usr/bin/java -jar /opt/myapp/myapp.jar
StandardOutput=journal
StandardError=journal
SuccessExitStatus=143
Restart=on-failure
[Install]
WantedBy=multi-user.target
sudo journalctl -u myapp.service -fsudo journalctl -u myapp.service --since "2025-12-01 10:00:00" -u myapp.service --until "2025-12-01 12:00:00"sudo journalctl -u myapp.service -p err -b五 集中化日志平台与可视化
sudo apt update && sudo apt install elasticsearch logstash kibanainput {
file {
path => "/var/log/myapp/*.log"
start_position => "beginning"
sincedb_path => "/var/lib/logstash/sincedb-myapp"
codec => "json_lines" # 若应用输出 JSON;否则用 plain 并配合 grok
}
}
filter {
# 如非 JSON,可用 grok 解析;示例模式可按需调整
# grok { match => { "message" => "%{COMBINEDAPACHELOG}" } }
# date { match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ] }
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "myapp-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug }
}
sudo systemctl start elasticsearch logstash kibana