Java日志在Ubuntu上的存储策略
Java应用通过日志框架(如Log4j、Logback、SLF4J、java.util.logging)管理日志存储,不同框架的默认存储位置有所差异:
/var/log/目录下(如/var/log/java.log),可通过logging.properties文件修改路径(如handlers=java.util.logging.FileHandler\njava.util.logging.FileHandler.pattern=/path/to/app.log)。src/main/resources)下的logs目录(如logs/app.log),需通过配置文件(log4j.properties/log4j.xml/logback.xml)指定绝对路径(如fileName=/var/log/myapp/app.log)。日志轮转是存储策略的核心,用于自动分割、压缩旧日志,避免单个文件过大占用磁盘空间。常见工具及配置如下:
TimeBasedRollingPolicy(时间触发)或SizeBasedTriggeringPolicy(大小触发)实现。示例配置(logback.xml):<appender name="ROLLING_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}.log.gz</fileNamePattern> <!-- 按日期滚动并压缩 -->
<maxHistory>30</maxHistory> <!-- 保留30天日志 -->
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
RollingFile Appender结合TimeBasedTriggeringPolicy(时间)和SizeBasedTriggeringPolicy(大小)实现。示例配置(log4j2.xml):<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} %-5level %logger{36} - %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy /> <!-- 每天滚动 -->
<SizeBasedTriggeringPolicy size="10 MB"/> <!-- 单个文件最大10MB -->
</Policies>
<DefaultRolloverStrategy max="30"/> <!-- 保留30个归档文件 -->
</RollingFile>
logrotate是Ubuntu系统自带的日志管理工具,可自动轮转、压缩、删除旧日志。配置步骤:
/etc/logrotate.d/myapp文件,添加以下内容:/var/log/myapp/*.log {
daily # 每天轮转
rotate 7 # 保留7个归档文件
compress # 压缩旧日志(.gz格式)
delaycompress # 延迟压缩(避免当天日志未完全写入)
missingok # 日志文件不存在时不报错
notifempty # 日志为空时不轮转
create 0640 root adm # 新日志文件的权限和所有者
sharedscripts # 所有日志轮转完成后执行脚本
postrotate
/bin/kill -HUP $(cat /var/run/myapp.pid 2>/dev/null) 2>/dev/null || true
endscript
}
sudo logrotate -f /etc/logrotate.d/myapp(强制执行一次)。对于需要集中管理、实时分析的大规模应用,可使用ELK Stack(Elasticsearch+Logstash+Kibana)或Fluentd:
input(监听Java日志文件)、filter(解析日志格式)、output(发送到Elasticsearch)。示例logstash.conf:input {
file {
path => "/var/log/myapp/app.log"
start_position => "beginning"
}
}
filter {
grok { match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:msg}" } }
date { match => [ "timestamp", "ISO8601" ] }
}
output {
elasticsearch { hosts => ["localhost:9200"] }
stdout { codec => rubydebug }
}
elasticsearch.yml(network.host: 0.0.0.0)。kibana.yml(elasticsearch.hosts: ["http://localhost:9200"])。/var/log/myapp/),而非系统日志目录(/var/log/),避免权限冲突。需确保应用对该目录有写入权限(sudo chown -R appuser:appgroup /var/log/myapp)。Filter(如Logback的SensitiveDataFilter)实现。640(所有者可读写,组可读,其他用户无权限),所有者为应用运行用户(如tomcat、appuser),避免未授权访问。AsyncAppender)提高性能,减少日志记录对应用主线程的影响。INFO或WARN,开发环境设置为DEBUG,避免不必要的日志记录占用磁盘空间。