Ubuntu系统中Java日志管理方法
Java日志管理需先选择合适的框架,主流框架包括Log4j(功能灵活)、SLF4J(日志门面,需搭配Logback/Log4j等实现)、Logback(Log4j继任者,性能更优)、java.util.logging(JDK自带,适合简单场景)。配置文件是日志管理的核心,需放置在项目src/main/resources目录或系统级路径(如/etc/):
log4j.properties或log4j.xml,可配置输出路径(如logs/app.log)、格式(如%d{ISO8601} [%t] %-5p %c - %m%n)、滚动策略(如MaxFileSize=10MB、MaxBackupIndex=5)。logback.xml,支持更丰富的功能(如异步日志),配置示例如下:<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%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}.log</fileNamePattern>
<maxHistory>30</maxHistory> <!-- 保留30天日志 -->
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
logback.xml中定义日志行为,代码中通过LoggerFactory.getLogger(Class)获取日志记录器。Java日志的存储位置由框架配置决定,常见路径包括:
/path/to/project/logs/app.log(通过框架配置文件指定)。/var/log/java/(系统级Java应用日志)、/var/log/tomcatX/(Tomcat运行的Java应用日志,X为版本号)。System.getProperty("user.dir")获取,日志通常位于该目录下的logs子目录。Ubuntu提供多种命令行工具查看和管理日志:
tail -f /path/to/logfile.log(实时输出日志文件最新内容,适合监控实时日志)。grep "ERROR" /path/to/logfile.log(筛选包含“ERROR”的日志行,支持正则表达式)。less /path/to/logfile.log(逐页查看大日志文件,支持上下翻页、搜索/keyword)。journalctl -u serviceName(查看指定服务(如tomcat)的系统日志,需systemd支持)。日志轮转可自动压缩、删除旧日志,常用工具为Logrotate(Ubuntu默认安装):
sudo apt update && sudo apt install logrotate(若未安装)。/etc/logrotate.d/下新建应用专属配置(如my-java-app),示例如下:/var/log/myapp/*.log {
daily # 每天轮转一次
rotate 7 # 保留最近7份日志
compress # 压缩旧日志(如.gz格式)
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.d/my-java-app(强制执行配置,查看效果)。对于分布式系统或多应用场景,可使用ELK Stack(Elasticsearch+Logstash+Kibana)实现集中化日志收集、存储、分析与可视化:
sudo apt update && sudo apt install elasticsearch logstash kibana(Ubuntu默认仓库安装)。logstash.conf文件,定义输入(如file插件读取Java日志)、过滤(如grok解析日志格式)、输出(如elasticsearch存储到ES):input {
file {
path => "/var/log/myapp/*.log"
start_position => "beginning"
}
}
filter {
grok { match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} \[%{THREAD:thread}\] %{LOGLEVEL:loglevel} %{JAVACLASS:class} - %{GREEDYDATA:logmessage}" } }
date { match => [ "timestamp", "ISO8601" ] }
}
output {
elasticsearch { hosts => ["localhost:9200"] }
stdout { codec => rubydebug } # 控制台输出(调试用)
}
sudo systemctl start elasticsearch && sudo systemctl start logstash && sudo systemctl start kibana(依次启动组件)。http://localhost:5601,配置索引模式(如logstash-*)即可可视化分析日志。