在CentOS上管理Java应用的日志,其实有一套成熟的方法可循。从日常的实时查看、问题排查,到防止日志文件撑爆磁盘,再到分布式环境下的集中管理,每个环节都有对应的最佳实践。下面把几个核心场景逐一拆解,希望能帮你搭建一套顺手又可靠的日志体系。
一、基础日志查看与管理
- 查找Java进程:先用
ps -ef | grep java列出所有运行中的Java进程,拿到PID——后面所有操作都离不开这个标识。 - 定位日志文件:日志路径一般由应用配置文件指定。比如Spring Boot在
application.properties里设置了logging.file.name=logs/application.log,Tomcat则默认输出到catalina.out。根据你项目的配置去确认就好。 - 实时查看日志:用
tail -f /path/to/logfile.log就可以实时追踪日志最新内容,排查线上问题时的常用操作。 - 过滤关键信息:通过
grep "ERROR" /path/to/logfile.log快速筛选错误信息。如果需要忽略大小写,加-i参数;想看错误行前后的上下文,用grep -A 5 "error"(显示匹配行及后5行),定位问题效率会高很多。
二、日志轮转配置(避免文件过大)
日志文件长时间不处理,很容易把磁盘占满。CentOS自带的logrotate就是用来解决这个问题的:自动切割、压缩、归档,省心又可靠。
- 创建配置文件:在
/etc/logrotate.d/目录下新建一个文件(比如java_logs),写入类似下面的配置:/path/to/java/logs/*.log { daily # 每天轮转一次 rotate 7 # 保留最近7个备份 compress # 压缩旧日志(.gz格式) missingok # 日志文件缺失时忽略 notifempty # 非空才轮转 create 0644 root root # 创建新日志文件并设置权限 postrotate # 轮转后执行命令(可选) /usr/bin/kill -HUP `cat /var/run/logrotate.pid` 2>/dev/null || true endscript } - 手动测试配置:运行
logrotate -vf /etc/logrotate.d/java_logs,看看配置是否生效,没问题再放入生产环境。
三、Java日志框架配置(灵活控制日志输出)
Java应用常用的日志框架是Logback(推荐,与SLF4J集成)和Log4j2。通过配置文件可以精细控制日志级别、输出格式和存储路径,分工很明确。
- Logback配置(logback.xml):
["是", "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n", "%msg%n"] /var/log/java_app/app.log /var/log/java_app/app.%d{yyyy-MM-dd}.log 30 ["是", "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n"] - Log4j2配置(log4j2.xml):
- 日志级别设置:根据环境灵活调整。开发环境可以用
DEBUG捕获详细信息,方便调试;生产环境建议用INFO或WARN,避免日志量过大。修改logback.xml里的为对应级别即可。
四、集中式日志管理(ELK Stack)
当应用是分布式架构或者有多个节点时,单机查看日志效率就很低了。ELK Stack(Elasticsearch + Logstash + Kibana)是业界常用的方案,把分散的日志收集到一起,再统一检索和可视化。
- 安装与配置:
- Elasticsearch:安装后启动服务(
systemctl start elasticsearch),负责存储和索引日志数据; - Logstash:编写配置文件(如
java_log.conf),定义输入(比如从文件读取)、过滤(解析JSON格式)和输出(发送到Elasticsearch); - Kibana:启动服务(
systemctl start kibana),通过Web界面就能做日志趋势分析、错误分布展示等。
- Elasticsearch:安装后启动服务(
- 日志发送:有两种常见方式——一是在Java应用内集成Logstash的Log4j2或Logback Appender(比如
logstash-log4j2-encoder),直接把日志发到Logstash;二是通过rsyslog将日志转发到Logstash,对已有应用侵入性更小。
五、定时备份与清理(防止磁盘爆满)
即使有了logrotate,有些场景下仍需要额外的备份策略,比如把旧日志归档到其他存储,或者按业务需求保留一定天数。这里给出一个手工脚本+Cron的组合方案。
- Shell脚本备份:
#!/bin/bash LOG_DIR="/var/log/java_app" BACKUP_DIR="/path/to/backup" DATE=$(date -d "yesterday" +%Y%m%d) # 备份日志 cp $LOG_DIR/*.log $BACKUP_DIR/java_app_$DATE.log # 清空原始日志 > $LOG_DIR/*.log # 删除30天前的备份 find $BACKUP_DIR -name "java_app_*.log" -mtime +30 -exec rm -f {} \; - 设置Cron定时任务:通过
crontab -e添加,例如每天凌晨1点执行:0 1 * * * /path/to/backup_script.sh - 结合Logrotate:其实logrotate本身就支持
compress(压缩旧日志)和maxage 30(删除30天前的备份)。脚本方案可以理解为一种补充,两者配合使用效果更佳。
