日志排查先确认运行内核,再区分访问记录与诊断信息。本文适合遇到 v2rayN 网页打不开、v2rayNG 连接超时或 v2flyNG 解析失败的用户:从一次可复现请求出发,按本地入站、路由出站、DNS、TCP 与 TLS 分层定位,避免看到一条 error 就反复更换整份订阅。
1. access 与 error 日志分别记录什么
v2rayN 是客户端界面,V2Ray 与 Xray 是处理连接的内核;日志的格式取决于实际启动的内核及版本。v2rayNG 使用 Xray 内核,v2flyNG 使用 v2fly 内核。开始排查前,先从启动输出记录内核名称与版本,不要只记录客户端名称。
| 记录类型 | 主要内容 | 不能据此证明的事情 |
|---|---|---|
| access | 连接来源、目标地址,以及部分格式中的入站与出站标签。 | 出现 accepted 不等于目标网页已成功返回。 |
| error | 内核启动、连接建立、解析和传输过程中的诊断信息。 | 文件名叫 error,不代表里面每一行都是错误级别。 |
| 客户端运行输出 | 可能合并内核标准输出、客户端事件与订阅请求信息。 | 订阅更新失败不一定是代理出站连接失败。 |
例如访问日志出现 accepted tcp:example.com:443,通常说明本地入站已经接收了这条请求。后续仍可能发生节点拨号超时、TLS 验证失败或远端关闭连接。日志中若带有 [入站标签 -> 出站标签],可以用来核对路由分流,但标签名称由当前配置决定。
2. loglevel 选什么:日常 warning,复现时临时 debug
V2Ray 与 Xray 常见日志等级为 debug、info、warning、error、none。从 debug 到 error,输出范围逐步收窄;none 用于关闭这类诊断输出。访问日志有独立的输出配置,不能仅凭 loglevel 判断 access 是否启用。
- debug:包含更细的处理过程,适合短时间复现;不保证每个内核、每个版本都输出相同字段。
- info:适合观察连接与路由行为,噪声通常少于 debug。
- warning:适合作为日常起点,保留警告及更严重信息。
- error:只关注错误,但可能遗漏定位前因所需的上下文。
- none:排障时不宜使用,否则容易把“没有记录”误判成“没有请求”。
在 v2rayN 的「设置」→「参数设置」中查找当前版本提供的日志级别选项,保存后重启内核。不同界面的分组名称可能变化,应以当前界面为准。使用 v2rayNG 或 v2flyNG 时,同样先在设置中查找日志相关选项,再打开日志查看界面;不要把订阅列表当作内核运行日志。
下面是内核配置中的 log 字段示例,不是可直接启动的完整配置。仅用于说明字段关系;客户端管理的配置应优先通过界面修改,手工改动生成文件可能在下次启动时被覆盖。
{
"log": {
"access": "C:/Temp/v2ray-logs/access.log",
"error": "C:/Temp/v2ray-logs/error.log",
"loglevel": "debug"
}
}
示例使用 Windows 绝对路径。先创建 C:\Temp\v2ray-logs,确认启动内核的账户有写入权限。启用文件输出后,部分内容可能不再显示在原来的控制台窗口,应同时检查目标文件。完成一次复现后恢复 warning,避免日志持续增长。
3. 连接超时与连接被拒绝:先确认失败的地址
下面各卡列出的是常见日志中的错误片段,不是固定的完整日志模板。模块前缀、包路径与包装层数会随内核版本变化。读取时先找最内层原因,再向外确认它对应的是节点服务器、DNS 服务器,还是目标网站。
报错:dial tcp …: i/o timeout
原因:向日志中指定的地址建立 TCP 连接时,未在期限内完成。
解法:先核对失败地址是否为节点端点,再检查节点端口、当前网络和服务端入站;若地址属于目标网站,应转查远端出口到目标的连通性。
报错:connect: connection refused
原因:连接收到明确拒绝,常见于目标端口没有服务监听,或网络设备主动拒绝。
解法:核对错误中的 IP 与端口;若是 127.0.0.1:10808,先确认本地内核已启动且监听端口一致,而不是先换远端节点。
报错:context deadline exceeded
原因:某个操作超过了截止时间,单凭这一句不能确定是 DNS、拨号还是握手阶段。
解法:保留前后相关日志,查找同一连接的模块名称与更内层错误,再定位具体阶段。
Windows 可能把拒绝连接显示成包含 connectex 的系统错误,而不是上面的英文短句;排查原则相同。超时说明等待没有完成,拒绝说明收到否定响应,两者都不能直接推导出 VMess 或 VLESS 配置一定有问题。
判断:错误地址比“超时”两个字更有用
先把错误地址归类为本地监听、节点端点或目标服务,再只检查这一段链路。节点使用其他端口时,应以订阅配置为准,不要统一改成 443。
4. TLS 握手失败:证书、域名与系统时间分别检查
TLS 握手发生在建立底层连接之后,但握手失败的原因不止证书。把 TCP 通了理解成节点完全可用,会漏掉 SNI、传输路径和服务端参数不一致的问题。使用 VLESS 的节点也不必然使用同一种安全层,必须先确认配置实际采用的是 TLS、REALITY 还是其他组合。
报错:x509: certificate has expired or is not yet valid
原因:证书有效期与当前系统时间不匹配,可能是本机时间错误,也可能是服务端证书到期。
解法:先校准系统日期、时区和时间同步;时间正常后,交由服务提供方检查证书续期与完整证书链。
报错:x509: certificate signed by unknown authority
原因:当前环境无法建立可信的证书链,可能涉及缺失的中间证书、本地信任库或网络中的证书替换。
解法:核对服务端证书链与本机信任环境,不要把关闭证书验证作为常规修复。
报错:tls: handshake failure
原因:TLS 协商被拒绝,仅凭这一片段不能确定具体参数。
解法:按服务提供方配置核对服务器名称、TLS 设置和传输方式,再对照同一时刻的服务端日志。
- 服务器地址与 serverName:地址用于连接,服务器名称用于 TLS 等环节,两者可能不同,但不能任意互换。
- WebSocket 等传输:核对 Host 与路径。HTTP 404、403 等响应可能来自反向代理或错误路径,不能直接归类为证书错误。
- REALITY 配置:按实际配置核对公钥、shortId 和服务器名称,不要套用普通证书续期的处理方式。
- EOF:表示读到流结束,本身不证明认证失败;需要结合它发生在握手前、握手中还是正常传输结束时判断。
5. DNS 解析失败:区分节点域名与目标域名
“DNS 有问题”仍然太宽泛。客户端首先可能需要解析节点服务器域名;代理连接建立后,目标网站域名又可能在本地或远端被解析。路由中的 domainStrategy 还可能为了匹配 IP 规则触发解析,它不等同于出站的域名解析策略。
| 日志片段 | 含义边界 | 下一步 |
|---|---|---|
lookup …: no such host | 这次解析未得到可用名称结果,可能涉及不存在的域名或否定响应。 | 核对报错域名拼写,确认它是节点还是网站,再查实际使用的解析器。 |
failed to lookup ip | 上层报告 IP 查询失败,具体原因通常在后续或内层信息。 | 继续找超时、空结果或解析器连接错误,不要停在这句概括上。 |
read udp …: i/o timeout | 若对应地址是 DNS 服务器,可能是 DNS 响应未及时返回。 | 检查到解析器的网络路径、UDP 可达性和相关路由。 |
Windows 可用以下命令观察系统解析结果。这里的 example.com 只用于演示命令;实际排查时换成日志里的域名。系统命令成功只说明系统解析器可用,不能证明内核内置 DNS、加密 DNS 或经代理查询的路径也正常。
Resolve-DnsName example.com
6. 用一次请求串起日志:本地监听 → 路由 → 远端
复现前暂时关闭产生大量后台连接的应用,固定一个节点与一种代理接入方式。以下以 Windows、HTTP 或混合入站 127.0.0.1:10808 为例;如果当前端口仅接受 SOCKS,请使用对应的 SOCKS 测试命令,不要把协议不匹配当成节点故障。
- 检查监听:在 PowerShell 查询本地端口。没有监听时先解决内核启动或端口设置,暂不检查远端证书。
- 启用短时详细日志:记录开始时间,只发起一次测试请求,再查看这一时间段的 access 与 error 输出。
- 检查入站:没有访问记录时,确认 access 已启用且查看位置正确,再核对应用是否真正使用代理。
- 检查路由:若输出带出站标签,确认请求进入预期代理出站;直连、阻断和代理出站需要分开判断。
- 追到最内层错误:按 DNS、TCP、TLS、协议认证与目标服务的顺序定位,每次只改变一个相关设置,然后重复同一请求。
Get-NetTCPConnection -LocalPort 10808 -State Listen
curl.exe --proxy http://127.0.0.1:10808 --connect-timeout 10 --max-time 20 -I https://example.com/
这条 curl 命令显式指定代理,不依赖浏览器或系统代理开关;10 秒是连接阶段超时上限,20 秒是整个命令的时间上限,均为本次测试参数,不是内核性能指标。HTTP 代理输出中的隧道建立成功也不等于后续 TLS 与网页响应成功,应继续看完整结果。
curl.exe --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 --max-time 20 -I https://example.com/
第二条仅用于实际支持 SOCKS 的入站。socks5h 把目标域名交给 SOCKS 代理处理;普通 socks5 通常由 curl 在本地解析目标域名。比较两种方式时,应明确解析位置已经改变,不能把结果差异全部归因于节点速度。
判断:显式代理能通,浏览器不能通,先查流量入口
在同一节点与同一目标下,若显式代理请求成功,而浏览器没有对应 access 记录,优先检查系统代理、浏览器扩展和绕过列表;此时反复修改 VMess 或 VLESS 参数通常偏离问题所在。
7. 日志排查常见问答与反馈材料
为什么日志一直刷 warning,但网页能打开?
先按时间和目标定位 warning 属于哪个请求。后台应用、取消的连接或不可达的附属资源都可能产生记录。单条警告不能代表全部流量失败,应使用固定目标复现,并检查对应请求是否真正失败。
打开 debug 以后,日志窗口还是空白怎么办?
先确认保存设置后已重启内核,再检查是否配置了文件输出。若日志写入文件,核对绝对路径和目录权限;同时确认当前查看的是内核输出,而不是订阅更新记录。
看到 accepted,是不是说明节点已经连上?
不是。它通常只说明请求被入站接受。继续沿同一连接查找出站拨号与握手信息,并用 curl 的最终响应验证目标访问结果,不能仅截取 accepted 一行下结论。
订阅更新超时,也要按节点连接超时处理吗?
先区分订阅地址请求和代理数据连接。检查订阅更新是否走代理、当前代理是否可用,以及订阅服务本身是否可达。反馈时隐藏订阅地址中的令牌,不要公开完整订阅链接。
需要进一步求助时,提供能串起同一次失败的最小材料,比整屏截图更有效。日志可能包含访问域名、服务器地址与本地路径;分享前检查内容,保留错误类型和关联关系,同时移除账号标识、UUID、密码、私钥及订阅令牌。
- 环境:操作系统、客户端版本、实际内核名称与版本;版本信息从本机界面或启动输出读取。
- 接入方式:系统代理、显式 HTTP/SOCKS 代理或 TUN;注明实际本地监听端口。
- 复现条件:目标类型、发生时间、是否所有节点都失败,以及更换网络后是否仍能复现。
- 日志片段:保留同一请求前后的上下文、错误链和出站标签,敏感地址使用一致的文字标记替换。
- 已做操作:逐条记录改过的设置及结果,排查结束后恢复日常日志等级。