CentOS下Java日志管理技巧
在CentOS中管理Java日志的第一步是快速定位并查看日志内容。首先通过ps -ef | grep java命令列出所有Java进程,获取其PID和运行参数(如日志路径);Java应用的日志文件位置通常由开发者配置,常见名称包括application.log(Spring Boot默认)、catalina.out(Tomcat)等,可通过应用配置文件(如Spring Boot的application.properties中logging.file.name参数)确认;使用tail -f /path/to/logfile.log实时监控日志最新内容,通过grep "ERROR" /path/to/logfile.log过滤出包含“ERROR”的行,快速定位异常信息。
日志轮转是防止日志文件占用过多磁盘空间的关键手段,常用工具为logrotate(CentOS自带)。
logrotate通常已预装,若未安装可通过sudo yum install logrotate(CentOS 7)或sudo dnf install logrotate(CentOS 8)安装;在/etc/logrotate.d/目录下创建Java专用配置文件(如java_app),添加以下内容:/path/to/java/logs/*.log {
daily # 每天轮转
rotate 7 # 保留7个轮转文件
compress # 压缩旧日志(节省空间)
missingok # 日志不存在时不报错
notifempty # 日志为空时不轮转
create 640 root root # 新日志文件权限(属主root,属组root,权限640)
postrotate # 轮转后执行的脚本(通知Java应用重新打开日志文件)
if [ -f /path/to/java/logs/your_app.pid ]; then
kill -USR1 `cat /path/to/java/logs/your_app.pid`
fi
endscript
}
其中postrotate脚本通过kill -USR1向Java进程发送信号,使其重新打开日志文件(避免日志写入旧文件)。sudo logrotate -d /etc/logrotate.d/java_app测试配置是否正确(仅显示执行计划,不实际操作);若测试无误,用sudo logrotate -f /etc/logrotate.d/java_app强制执行一次轮转,验证日志文件是否按配置生成。对于分布式或大规模Java应用,集中式日志管理能提升分析效率。ELK Stack(Elasticsearch+Logstash+Kibana)是主流方案:
elasticsearch.yml,设置集群名称、监听IP)→安装Logstash(配置管道文件,如apache.conf,定义input/file、filter/grok、output/elasticsearch)→安装Kibana(配置kibana.yml,设置Elasticsearch地址)→启动服务并访问Kibana(http://服务器IP:5601)。通过日志框架(如Logback、Log4j2)配置日志级别,控制日志输出的详细程度(减少不必要的日志,提升性能):
logback.xml):<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/var/log/java-app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/var/log/java-app.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <!-- 按天+索引滚动,压缩 -->
<maxHistory>30</maxHistory> <!-- 保留30天日志 -->
<maxFileSize>20MB</maxFileSize> <!-- 单个文件最大20MB -->
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern> <!-- 日志格式 -->
</encoder>
</appender>
<root level="INFO"> <!-- 根日志级别(INFO及以上输出) -->
<appender-ref ref="FILE"/>
</root>
</configuration>
log4j2.xml):<Configuration status="WARN">
<Appenders>
<RollingFile name="File" fileName="/var/log/java-app.log"
filePattern="/var/log/java-app-%d{yyyy-MM-dd}.%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/> <!-- 按天滚动 -->
<SizeBasedTriggeringPolicy size="20 MB"/> <!-- 单个文件大小限制 -->
</Policies>
<DefaultRolloverStrategy max="30"/> <!-- 保留30个文件 -->
</RollingFile>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="File"/>
</Root>
</Loggers>
</Configuration>
根据应用需求调整level(如DEBUG用于调试,ERROR用于生产环境),避免过度日志输出。#!/bin/bash
BACKUP_DIR="/path/to/backup"
LOG_DIR="/path/to/java/logs"
DATE=$(date +%Y%m%d)
# 备份日志
cp $LOG_DIR/*.log $BACKUP_DIR/${DATE}.log
# 清空原始日志
> $LOG_DIR/*.log
# 删除30天前的备份
find $BACKUP_DIR -mtime +30 -type f -name "*.log" -exec rm -f {} \;
通过crontab -e添加定时任务(如每天凌晨1点执行):0 1 * * * /path/to/backup_script.sh。logrotate配置中通过rotate参数设置保留日志数量(如rotate 7保留7天),配合compress压缩旧日志,自动删除过期文件。避免在日志中泄露敏感信息(如用户密码、银行卡号),需对日志内容进行脱敏处理:
String password = "123456";
String maskedPassword = password.replaceAll(".", "*");
logger.info("User login: username={}, password={}", username, maskedPassword);
Filter实现脱敏,例如自定义SensitiveDataFilter,拦截日志消息并替换敏感内容。