远程调试,以及Debug与info的区别
远程调试
远程调试:核心目的是将本地 IDE 连接到运行在远程服务器(或其他环境)上的 Java 进程,实时检查代码执行状态(如变量、调用栈、线程等)。
其中:
-
IDEA 新增「Remote JVM Debug」配置
在 IDEA 中创建一个调试配置,用于连接到远程 ,使本地 IDE 能控制远程代码的执行流程(如设置断点、单步调试)。
-
Host:远程服务器地址(
xx.com
)。 -
Port:远程 JVM 的调试端口(如 10000,需与远程服务启动参数一致)。
-
远程连接
将本地 IDEA 调试器附加到远程 JVM,建立双向通信通道。
-
确保远程服务已启动 Debug 模式
-
在 IDEA 中启动调试
-
Debug 模式改为「线程级别」
默认情况下,断点会挂起所有线程(All 模式)。
改为 线程级别(Thread) 后,仅挂起触发断点的线程,其他线程继续运行,避免阻塞整个应用。
如果本地代码与远程运行的代码版本不一致,调试时可能会出现:
-
断点无法触发(行号不对应)。
-
变量值显示错误(代码逻辑差异)。
断点模式:
全局断点(All):暂停所有线程(整个JVM卡住)
线程级断点(Thread):仅暂停当前触发断点的线程,其他线程正常执行
核心逻辑:
-
代码一致性
-
本地代码必须与远程服务运行的代码完全一致(相同分支、Commit ID、依赖版本)。
-
否则断点位置或变量状态可能对不上,导致调试失效。
-
-
运行状态分离
-
远程服务:实际运行的Java进程(承载真实流量或测试流量)。
-
本地IDE:仅作为调试控制器,通过Socket连接远程JVM,自身不运行服务。
-
-
调试能力
-
连接成功后,可以在本地IDE中:
-
✅ 设置断点(远程代码执行到对应位置时会暂停)。
✅ 查看远程服务的变量、调用栈、线程状态。
✅ 单步执行(Step Over/Into)、修改变量值(部分环境支持)。
-
DEBUG(调试日志)
-
用途:
-
开发、测试阶段使用,用于详细追踪程序运行状态(如变量值、方法调用链、流程分支等)。
-
帮助开发者快速定位问题。
-
-
线上环境:
-
通常关闭(不输出),因为会记录大量细节,影响性能且占用存储。
-
只有在排查疑难问题时才会临时开启。
-
-
示例:
logger.debug();
-
INFO(信息日志)
-
用途:
-
记录程序关键运行节点(如服务启动、接口请求、业务操作完成等)。
-
提供足够的信息用于监控和审计,但不会过于详细。
-
-
线上环境:
-
默认开启,长期保留,用于运维监控和问题回溯。
-
-
示例:
logger.info("Order created, ID: {}", orderId); // 记录关键业务事件
区别
-
关键区别总结
特性 | DEBUG | INFO |
目的 | 开发调试细节 | 线上运维监控 |
日志量 | 多(高频、详细) | 少(关键节点) |
性能影响 | 高(不推荐线上开启) | 低(适合线上) |
保留策略 | 非线上环境保留 | 线上长期保留 |
-
实际开发中的建议
-
遵循团队的日志规范,例如:
-
开发时用
DEBUG
打印细节,但提交代码前检查是否误提交了敏感的DEBUG
日志。 -
线上环境通过日志框架(如 Logback、Log4j)配置只输出
INFO
及以上级别(如WARN
,ERROR
)。
-
-
避免滥用
INFO
:-
不要将调试信息打印到
INFO
(如循环内的详细数据),否则会污染线上日志。
-
-
日志级别常见顺序
从低到高(详细 → 严重): DEBUG
→ INFO
→ WARN
→ ERROR
→ FATAL
线上环境一般设置 INFO
或 WARN
作为最低级别,过滤掉 DEBUG
。
近日总结:
哦,杭州,感觉这个城市有点克我,刚来第一天,两年没碎过的手机屏幕多了条缝。
本来还挺期待,杭州的饭菜应该得是偏清淡的,毕竟离嘉兴这么近,没想到,清淡不了一点。
口腹之欲大大降低......
这里的物价也挺高。
房东也挺坑,房价也高,还有这梅雨季,到底是谁在喜欢梅雨季啊,哦,是学长,应该只是来旅游摄影的,所以颇为喜爱吧。
但真的住在这里之后,喜欢不了一点,不喜欢这发霉的天气。