Java在Linux下的日志管理指南
Java应用在Linux下的日志管理首先需要选择合适的框架,常见的组合有:
pom.xml
:<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.7</version>
</dependency>
src/main/resources
目录下创建logback.xml
,配置日志级别、输出格式、输出目的地(控制台/文件)及滚动策略:<?xml version="1.0" encoding="UTF-8"?>
<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", "%msg%n"]</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/var/log/java-app/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/var/log/java-app/app.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<maxHistory>7</maxHistory> <!-- 保留7天日志 -->
</rollingPolicy>
<encoder>
<pattern>["是", "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n", "%msg%n"]</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
上述配置将日志输出到控制台和/var/log/java-app/app.log
,并按日期滚动压缩,保留7天。tail -f /var/log/java-app/app.log
:实时查看日志末尾内容;grep "ERROR" /var/log/java-app/app.log
:过滤出包含“ERROR”的日志行;less /var/log/java-app/app.log
:逐页查看日志文件。logrotate
工具自动管理日志文件大小和保留周期,避免单个文件过大。创建/etc/logrotate.d/java-app
配置文件:/var/log/java-app/*.log {
daily # 每天轮转
rotate 7 # 保留7个旧日志
compress # 压缩旧日志(.gz格式)
missingok # 日志文件不存在时不报错
notifempty # 日志为空时不轮转
create 640 root root # 新日志文件权限和所有者
}
该配置会自动处理/var/log/java-app/
目录下的所有.log
文件。对于分布式系统或多节点应用,建议使用集中式日志管理工具,如ELK Stack(Elasticsearch+Logstash+Kibana):
配置步骤:
LogstashTcpSocketAppender
),将日志发送至Logstash;input
(接收日志)、filter
(解析日志,如提取时间戳、日志级别)、output
(发送至Elasticsearch);INFO
,避免DEBUG
日志过多影响性能;DEBUG
定位问题;TRACE
获取详细信息。logger.debug("User {} logged in at {}", username, loginTime); // 正确
logger.debug("User " + username + " logged in at " + loginTime); // 错误(即使DEBUG关闭也会执行拼接)
AsyncAppender
或Log4j2的异步日志模块,将日志写入队列,由单独线程处理,减少业务线程阻塞。systemd
启动):journalctl -u java-app.service -f # 实时查看服务日志
journalctl -u java-app.service | grep "ERROR" # 过滤错误日志