1. 内核日志级别(log-level)设计与选用策略
在配置文件顶层,通过 `log-level` 字段可以精确控制输出日志的详尽程度:
- **`silent`**:全静音模式,完全不打印任何日志。仅适合在极端追求极致性能、内存受限的低配嵌入式设备上运行;
- **`error`**:仅输出导致服务无法运行的严重致命错误;
- **`warning`**:输出网络异常告警(如节点测速失败、规则集更新异常等);
- **`info`**:**【推荐标准级别】** 记录基本连接建立信息、DNS 查询事件与策略组切换记录,性能损耗适中;
- **`debug`**:**【仅限排障时临时开启】** 打印每一个 TCP/UDP 数据包的嗅探过程、规则逐行匹配细节与 TLS 握手特征。日志量极大,常驻开启会增加磁盘 I/O 写入负担。
yaml
# 配置文件中定义日志级别
mode: rule
log-level: info # 可选: silent, error, warning, info, debug 2. 经典报错日志逐条拆解与系统根因分析
以下是日常运维中最常见的五大日志报错模式与对策:
### 报错 1:`[TCP] dial proxy error: context deadline exceeded`
- **现象**:连接特定节点时持续超时;
- **根因**:当前物理节点服务器离线、宿主机防火墙阻断、或者跨境公网线路遭遇严重丢包;
- **对策**:更换备用节点,或检查机场后台该节点是否处于维护状态。
### 报错 2:`[TLS] handshake failed: tls: certificate required` 或 `bad certificate`
- **现象**:HTTPS 站点或 Trojan / Reality 节点连接失败;
- **根因**:客户端本地系统时钟不同步(与标准北京时间偏差超过 90 秒),或者节点配置中的 `skip-cert-verify: false` 遇到了自签名证书;
- **对策**:校准本机时间,必要时在节点配置中临时设置 `skip-cert-verify: true`。
### 报错 3:`[DNS] resolve error: dial udp 223.5.5.5:53: i/o timeout`
- **现象**:网页间歇性无法解析;
- **根因**:本地运营商对 UDP 53 端口进行了强行 QoS 丢包或劫持;
- **对策**:在 DNS 模块中改用 DoH(如 `https://dns.alidns.com/dns-query`)替代纯 UDP 解析。
bash
# Linux 终端使用 journalctl 实时过滤特定错误关键字
sudo journalctl -u mihomo -f | grep -E "(error|timeout|handshake)" 3. 通过 RESTful API 动态监控实时连接(Connections)
Mihomo 提供了极其强大的 RESTful 接口,允许外部探针实时拉取当前所有存活的 TCP/UDP 会话:
调用 `GET /connections` 接口可以获取包含以下元数据的 JSON 数据结构:
- **`id`**:会话唯一 UUID;
- **`metadata`**:源 IP、源端口、目标域名、目标真实 IP、协议类型(TCP/UDP);
- **`rule`**:命中的具体规则字符串及匹配方式(如 DOMAIN-SUFFIX, youtube.com);
- **`chains`**:数据包流经的策略组路径(如 `[Proxy, 香港专线, 节点01]`);
- **`upload` / `download`**:该会话当前消耗的上下行字节数。
bash
# 通过 curl 快速查询当前活动连接总数与活跃会话
curl -s -H "Authorization: Bearer 你的Secret密钥" http://127.0.0.1:9090/connections | jq '.connections | length' 4. 高并发场景下的日志 I/O 调优与日志轮转(Logrotate)
在长时间运行的服务器上,若将日志级别设为 `info` 或 `debug`,日志文件可能会迅速膨胀至数十 GB,导致服务器根分区磁盘打满。
### 生产环境配置 logrotate 轮转策略:
在 `/etc/logrotate.d/mihomo` 中添加:
text
/var/log/mihomo/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 root root
postrotate
systemctl reload mihomo > /dev/null 2>/dev/null || true
endscript
} ❓ 常见疑问与排查步骤
日常使用推荐开启哪种日志级别?
强烈推荐保持 `info` 级别。它能在出现网络异常时提供清晰的上下文,同时对 CPU 运算与磁盘 I/O 的消耗几乎为零。
日志中频繁出现 [Sniffer] sniff error 是正常的吗?
完全正常。部分非 TLS/HTTP 的自定义协议连接(如某些游戏私有 UDP 协议)无法提取 SNI 域名,嗅探器会安全回退并放行流量。
如何关闭 Web UI 中的日志刷屏?
在 Web UI(如 Yacd / Metacubexd)的左侧或右上角设置中,可以单独将前端日志显示级别调至 Error 或直接暂停日志流监听。