CentOS Java如何监控与日志
小樊
32
2025-12-13 10:50:34
CentOS 上 Java 应用的监控与日志实践
一 快速定位与基础命令
- 进程与资源:使用 ps -ef | grep java 获取 PID;用 top -p 观察 CPU/内存;用 jps 快速列出本机 Java 进程。
- 实时日志:对应用日志文件使用 tail -f /path/to/app.log;按关键字过滤用 grep “ERROR” /path/to/app.log;系统服务日志用 journalctl -u your-app.service -f 或 journalctl --since “1 hour ago”。
- 常见日志路径:application.log(Spring Boot 常见)、catalina.out(Tomcat)。以上命令覆盖日常排查与定位所需的最小集。
二 JVM 与应用性能监控
- 常用内置工具:
- jstat -gcutil 观察 GC/堆使用率;
- jstack 抓取线程栈,定位 死锁/阻塞;
- jmap 生成堆转储,配合分析工具排查 内存泄漏;
- jinfo 查看/调整 JVM 参数;
- jps 快速列出 Java PID。
- JMX 远程监控:启动时添加参数开启 JMX,便于图形化工具连接(示例端口 9010):
java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false -jar yourapp.jar
可用 JConsole/VisualVM 连接监控 内存、线程、类加载、CPU 等。
- 指标与可视化:
- Prometheus + JMX Exporter 暴露 JVM/MBean 指标,配合 Grafana 展示;
- Spring Boot Actuator + Micrometer 暴露应用健康与业务指标;
- 分布式追踪可用 SkyWalking/Zipkin。
- 进程存活巡检:用 crontab 定时检测 PID/端口 存活并告警,保障稳定性。
三 日志采集 存储 与可视化
- 应用侧日志框架:优先使用 Logback/Log4j2/SLF4J,配置合理的 日志级别(生产建议 INFO/WARN) 与 结构化格式,便于检索与分析。
- 系统侧轮转:用 logrotate 管理日志生命周期,避免单文件过大(示例):
/path/to/your/java/logs/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0644 root root
}
- 集中式方案(ELK/EFK):
- 方案A:Filebeat → Logstash → Elasticsearch → Kibana(Filebeat 采集文件,Logstash 做 Grok 解析/丰富,ES 存储检索,Kibana 可视化与仪表盘);
- 方案B:应用日志(如 Logback)→ Logstash → ES → Kibana;
- 可选:用 Metricbeat 采集 系统/容器 指标,统一汇入 ES/Kibana。
- 告警:在 Kibana 或 ELK 告警插件 中配置规则(如 ERROR 突增、接口 P95 延迟异常),实现 邮件/企业微信/钉钉 通知。
四 常见问题与排查清单
- 后台运行无日志:使用 nohup java -jar app.jar > app.log 2>&1 & 将 stdout/stderr 重定向到文件;或改用 systemd 服务并配置 StandardOutput/StandardError 到文件。
- 配置文件未生效:确认 log4j/logback 配置路径在 classpath;检查 文件权限;验证 配置语法;必要时将日志级别临时调为 DEBUG 验证输出。
- 日志过大/磁盘告警:启用 logrotate 或 RollingFile(按 时间/大小 滚动并压缩),设置 保留天数/数量。
- GC/内存异常:用 jstat -gcutil 观察 YGC/YGCT/FGC/FGCT;用 jstack 检查线程是否 BLOCKED/DEADLOCK;必要时 jmap 导出堆转储分析。
五 最小落地方案示例
- 以 systemd 托管 Java 服务并输出到日志文件:
- 创建服务文件 /etc/systemd/system/myapp.service:
[Unit]
Description=My Java App
After=network.target
[Service]
User=appuser
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/java -Xms512m -Xmx1g -jar /opt/myapp/app.jar
StandardOutput=append:/var/log/myapp/stdout.log
StandardError=append:/var/log/myapp/stderr.log
Restart=on-failure
[Install]
WantedBy=multi-user.target
- 启用服务:
sudo systemctl daemon-reload && sudo systemctl enable --now myapp
- 实时查看:
journalctl -u myapp.service -f
tail -f /var/log/myapp/*.log
- 配置 logrotate(/etc/logrotate.d/myapp):
/var/log/myapp/*.log { daily rotate 7 compress missingok notifempty create 0644 appuser appuser }
- 集中化(可选):部署 Filebeat 采集 /var/log/myapp/,输出到 Logstash/ES/Kibana 做可视化与告警。