Ubuntu Java日志管理策略
Java生态中有多种成熟的日志框架,可根据项目需求选择:
java.util.logging(配置复杂、功能有限)。通过配置文件定义日志的输出格式、级别、目标(控制台/文件)及归档策略:
%d{yyyy-MM-dd HH:mm:ss}表示时间、%-5p表示日志级别、%c{1}表示类名)提高性能,避免拼接字符串;DEBUG/TRACE,生产环境用INFO/WARN),减少不必要的日志输出;TimeBasedTriggeringPolicy(按时间,如每天)和SizeBasedTriggeringPolicy(按大小,如100MB)触发归档,设置maxHistory(保留天数,如7天)和max(最大文件数,如20个)限制存储空间。示例(Logback配置,logback.xml):
<configuration>
<appender name="STDOUT" 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>/var/log/myapp/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/var/log/myapp/app-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>7</maxHistory>
</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="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
示例(Log4j2配置,log4j2.xml):
<?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="/var/log/myapp/app.log"
filePattern="/var/log/myapp/app-%d{yyyy-MM-dd}-%i.log.gz">
<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="7"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
注意:确保Java应用有权限写入日志目录(如/var/log/myapp),可通过sudo chown -R appuser:appgroup /var/log/myapp修改权限。
logrotate是Ubuntu系统自带的日志管理工具,可自动轮转、压缩、删除旧日志,避免日志文件过大占用磁盘空间。
sudo apt-get install logrotate(通常预装);/etc/logrotate.d/my-java-app),内容如下:/var/log/myapp/*.log {
daily # 每天轮转
rotate 7 # 保留7个归档日志
compress # 压缩旧日志(.gz格式)
missingok # 日志文件丢失时不报错
notifempty # 日志为空时不轮转
create 640 root adm # 新日志文件的权限(用户:root,组:adm)
}
sudo logrotate -f /etc/logrotate.d/my-java-app;/etc/cron.daily/logrotate)。若Java应用以systemd服务运行(如my-java-app.service),可通过journald管理日志:
/etc/systemd/journald.conf,调整以下参数(根据磁盘空间调整):[Journal]
SystemMaxUse=500M # 日志总大小上限
SystemKeepFree=100M # 保留的空闲空间
SystemMaxFileSize=50M # 单个日志文件大小上限
SystemMaxFiles=5 # 保留的日志文件数量
sudo systemctl restart systemd-journald;journalctl命令(如journalctl -u my-java-app查看指定服务的日志,journalctl -f实时查看日志更新)。部分日志框架(如Log4j2、Logback)内置滚动归档功能,无需额外工具(参考上述配置示例)。
对于生产环境,可使用ELK Stack(Elasticsearch + Logstash + Kibana)实现日志的集中收集、存储、搜索和可视化:
logstash.conf文件,定义输入(如Java应用的日志文件)、过滤(如解析时间戳、提取关键字)、输出(如发送到Elasticsearch):input {
file {
path => "/var/log/myapp/app.log"
start_position => "beginning"
}
}
filter {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} %{JAVACLASS:class} - %{GREEDYDATA:logmessage}" }
}
date {
match => ["timestamp", "ISO8601"]
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "myapp-logs-%{+YYYY.MM.dd}"
}
stdout {
codec => rubydebug
}
}
sudo systemctl start elasticsearch、sudo systemctl start logstash、sudo systemctl start kibana;http://<服务器IP>:5601,配置索引模式(如myapp-logs-*),即可开始搜索和可视化日志。tail -f /var/log/myapp/app.log实时跟踪日志更新;grep "ERROR" /var/log/myapp/app.log查找错误日志;grep "WARN" /var/log/myapp/app.log筛选警告日志;df -h查看磁盘使用情况,避免日志文件占用过多空间(可通过logrotate或框架归档策略自动清理)。