V2Ray Logs Explained: Common Errors and How to Troubleshoot

Learn how to read Xray and V2Fly core logs, understand common errors like connection refused, i/o timeout, and TLS handshake failures, and trace issues through the logs.

At a glance

For users who have imported a config but are having trouble connecting or seeing intermittent failures. First identify whether the log comes from the client or the core, then check the local listener, DNS resolution, remote connection, TLS, and protocol settings in sequence. This guide includes an error reference, Windows commands, and repeatable troubleshooting steps. The goal is to find which layer is failing—not to change every setting at the first red error.

Distinguish client, access, and error logs

v2rayN is a desktop client that manages configurations, starts the core, and handles system proxy settings. The selected core is what actually handles connections. On Android, v2rayNG primarily uses the Xray core, while v2flyNG uses the V2Fly core. Client-side warnings and core connection errors are not the same thing: a failed subscription update does not necessarily mean proxy traffic is failing, and changing browser DNS will not help if the core never started.

Before troubleshooting, note the client version, the core name, and its version. Error formats and supported config options vary between core versions, so don't paste an entire config for one core into another. The explanations below focus on what the log messages mean. Addresses, ports, and snippets are illustrative and do not represent the complete output for any particular version.

Log sourceWhat it recordsCheck first
Client logsSubscription updates, process startup, config generationRuntime environment, file permissions, subscription requests
Core access logsDestination requests received, inbound and outbound detailsWhether app requests reach the core and which routing rules apply
Core error logsParsing, dialing, handshakes, and config errorsThe underlying cause and destination address

An accepted entry in the access log usually means the local inbound accepted the request. It does not mean the remote connection was established, much less that the webpage received a complete response. Conversely, if there is no access log entry, access logging may simply be disabled—it doesn't necessarily mean the app bypassed the proxy.

Choosing a log level: start with warning, then enable debug briefly

Common Xray/V2Fly log levels are debug, info, warning, error, and none. The warning level typically includes warnings and errors; debug adds diagnostic detail, while none disables error log output. Access logging has its own setting and should not be confused with the error log level.

  1. Check the core

    In the v2rayN startup information, note the core name, version, and startup result. Confirm that the expected core is running instead of relying on whether the node uses VMess or VLESS.

  2. Change the log level

    In v2rayN, the usual path is “Settings” → “Parameter Settings” → “Core: Basic Settings” → “Log Level.” Labels or menu groups may vary by version, so follow the options in your current interface. Select debug temporarily, save, and restart the core.

  3. Reproduce the issue once

    Note the system time and open just one test address. Collect the continuous logs from about 10 seconds before and after the failure. Don't run a speed test, update subscriptions, and open several pages at the same time.

  4. Restore the setting

    After reproducing the issue, switch back to warning and disable access logging if needed. Before sharing logs, redact subscription URLs, user identifiers, credentials, and private domain names while retaining the error type and relevant ports.

If you use a custom core config, the log section can look like this. This is only a top-level log config snippet, not a complete, runnable config. A config generated by the client may be overwritten the next time it starts, so make changes through the client interface when possible.

{
  "log": {
    "loglevel": "debug"
  }
}

Follow the connection path: find the failed request, then the underlying cause

Local inboundRouting matchAddress resolutionRemote connectionSecurity handshakeProtocol exchange

This illustrates a troubleshooting sequence; not every request follows these steps in precisely this order. Routing may trigger DNS lookups earlier, and direct outbound connections may not go through a proxy server. When reading logs, check the request destination, selected outbound, and actual dial address together. This helps avoid mistaking “destination site unreachable” for “proxy server port unreachable.”

Here is a simplified error chain. The outer message says the proxy request did not complete; the inner dial tcp identifies the TCP connection failure. 203.0.113.10 is a documentation-only example address, and 443 is an example remote port. Neither should be copied as a real node setting.

proxy: failed to process outbound traffic
transport/internet: failed to open connection
dial tcp 203.0.113.10:443: i/o timeout

Diagnosis: verify the failing layer before changing protocols

If the lowest-level error is still a remote TCP connection timeout, test the address and port first. Changing a VMess user ID or VLESS settings usually won't help before a TCP connection is established.

Common errors explained: refused connections, timeouts, DNS failures, and port conflicts

The same keyword can appear at different layers. Take connection refused: a refusal when connecting to local 127.0.0.1:10808 calls for a very different fix than a refusal from remote server port 443. Here are common log snippets; prefixes and OS-specific error details may vary.

Error: connection refused

Cause: The connection was explicitly refused. This commonly means no service is listening on the destination port, though a firewall may also actively reject it.

What to do: Check the destination IP and port in the log. For a local address, confirm the core is running. For a remote address, verify the node port and whether the server is listening.

Error: i/o timeout

Cause: A network read or write exceeded its time limit. This can happen while establishing TCP, during a handshake, or later during data transfer. The message alone does not prove the node is down.

What to do: Check the preceding operation and address. If the timeout occurred during dialing, check the network path and port. If the connection was already established, check the handshake settings and remote response.

Error: no such host

Cause: The current resolution path could not find a usable DNS result for the domain. Possible causes include a typo, a missing DNS record, or resolver behavior.

What to do: Check the node domain for typos, then verify the result with the system's DNS tools. If the core uses its own DNS, also check that its DNS servers are reachable and that the rules are correct.

Error: address already in use

Cause: Another process is using the local listening address and port, or the same program has been started more than once.

What to do: Identify the process using the port and close any duplicate instance. If you change the inbound port, update the app's proxy settings too; changing it only in the core is not enough.

Error: failed to find an available destination

Cause: The core could not find a usable connection destination. This is a general error that may accompany DNS failures, unreachable addresses, or repeated dialing failures.

What to do: Read the nested error that follows and troubleshoot the specific resolution or dialing issue. Don't assume this line alone means there is a DNS problem.

TLS handshake failures: check the certificate name, system time, and transport settings

A TLS error usually means the connection reached the security handshake stage, but it doesn't guarantee that the client reached the right service. A wrong port, mismatched forwarding config, or interference from an intermediary can all cause unexpected data to reach the client. If the config uses a different security mechanism, the usual TLS certificate troubleshooting steps may not apply.

Error snippetMeaningWhat to check
x509: certificate has expired or is not yet validCertificate validity period does not match the local system timeCorrect the system date, time, and time zone, then check the server certificate's validity period
x509: certificate is valid forThe certificate does not cover the expected nameCheck that serverName/SNI matches the certificate domain
tls: first record does not look like a TLS handshakeThe received data does not look like an expected TLS recordCheck whether the remote port serves TLS and inspect the reverse proxy entry point
EOF or connection reset by peerThe stream ended or the connection was reset; there can be several causesUse the failure stage to check the transport type, path, Host, and server logs

The server address and serverName are not always the same: the former determines where to connect, while the latter is used for TLS name verification and SNI. With WebSocket, the path and HTTP Host also serve distinct purposes. Connecting to the right IP does not mean these fields match. VMess and VLESS identity settings must also match the server; an EOF alone cannot tell you which field, if any, is wrong.

Windows troubleshooting: test local port 10808 and remote port 443 separately

The examples below assume the client uses local port 10808 for its HTTP or mixed inbound and remote port 443 on the server. These are specific troubleshooting examples and may not match your default settings. Before running them, replace the ports and domain with your actual config values. example.net is a documentation-only domain, not a usable node.

# PowerShell: check whether the local port is listening
Get-NetTCPConnection -LocalPort 10808 -State Listen

# Check the system DNS resolution result
Resolve-DnsName example.net

# Check the specified remote TCP port
Test-NetConnection -ComputerName example.net -Port 443

# Only for a local inbound confirmed to provide an HTTP proxy
curl.exe --proxy http://127.0.0.1:10808 --connect-timeout 10 --max-time 20 https://example.com/

If the local port only offers a SOCKS inbound, use curl.exe --proxy socks5h://127.0.0.1:10808 https://example.com/ instead. socks5h sends the destination domain to be resolved by the proxy, which helps distinguish that path from local DNS resolution. It does not mean all DNS requests are automatically handled the same way. Match the command's test time with the logs so you don't mistake a background app's connection for the test result.

Bottom line: change one variable at a time

Keep the node, destination, and proxy endpoint fixed, then test each part in turn. Change just one setting per attempt and repeat the same request. That way, you can tell whether the result came from the port, DNS, or handshake settings—not an accidental change in network path.

Log troubleshooting FAQs and what to include when asking for help

The logs keep filling with warnings. Does that mean every connection is failing?

Not necessarily. Background app retries and canceled probes can also produce warnings. Pause batch speed tests, visit a single destination, note the time, then use the destination address or connection ID to find the context for that request.

System proxy is on, but there are no browser requests in the logs?

First confirm that access logging is enabled, then check that the system proxy points to the same port as the client's inbound. Compare with a curl command that explicitly specifies the proxy. Some programs don't use the system proxy, so the toggle alone doesn't show which traffic is being routed.

Subscription update timed out, but the selected node can still load webpages?

Troubleshoot subscription fetching as a separate HTTP request. Check whether the update uses a direct connection or the proxy, whether the subscription service is reachable, and whether the subscription URL is valid. Don't delete a working node config just to troubleshoot a failed update.

Why does Android show no Windows-style port information when a connection times out?

v2rayNG and v2flyNG use a VPN traffic-routing path, unlike the system proxy on desktop. Start by checking the in-app logs and noting the core version, network type, and time of failure. Check the node domain, port, and security settings; don't reuse desktop local inbound port values.

When preparing information for help, continuous context around the error is more useful than a single cropped line. Use the checklist below, save a redacted copy locally, and share only what's needed. Subscription URLs often contain access tokens, even if they don't look like passwords, so don't post them publicly.

The goal isn't to make every log disappear; it's to get a verifiable result at each layer of the same request. For more on DNS, inbound settings, and routing fields, see the Complete Configuration Guide. If startup or runtime issues remain, check the basics in the Troubleshooting FAQ before continuing with network analysis.

Download the client