Skip to content

Commit 04df27e

Browse files
committed
refactor(log): 日志分级+组件标签,静默嵌套自调用降噪
- common.sh: log() 引入 DEBUG/INFO/WARN/ERROR 级别与 LOG_LEVEL 阈值过滤,日志行加 [组件] 标签 (LOG_TAG) - service.sh/switch.sh: 折叠成对横幅为单行里程碑;内部嵌套调用 (重启同步、跨订阅回退重启) 加 LOG_LEVEL=WARN 静默,消除重复 的切换/启停日志 - api.sh: 非 GET 请求失败 ERROR→DEBUG,避免预期内 400 回退误报 - service.sh(core): 启动概要 4 行合 1,过程提示降 DEBUG - service.sh(boot): 环境信息细节降 DEBUG,版本保留单行 INFO - 各脚本设 LOG_TAG (service/switch/sub/ipset/gms/boot/post-fs/action) - 排错时 LOG_LEVEL=DEBUG 可调出全部中间步骤
1 parent b346175 commit 04df27e

10 files changed

Lines changed: 92 additions & 78 deletions

File tree

src/module/action.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ readonly MODDIR="${0%/*}" # 模块根目录 (
1212
readonly SERVICE_SCRIPT="$MODDIR/scripts/core/service.sh" # 服务管理脚本
1313
readonly LOG_FILE="$MODDIR/logs/service.log" # 服务日志
1414
readonly SING_BOX_BIN="$MODDIR/bin/sing-box" # sing-box 二进制
15+
readonly LOG_TAG="action" # 日志组件标签
1516

1617
. "$MODDIR/scripts/utils/common.sh"
1718

src/module/post-fs-data.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@ set -e # 命令失败立即退出
1212
readonly MODDIR="${0%/*}" # 模块根目录 (脚本所在目录)
1313
readonly MODULE_CONF="$MODDIR/config/module.conf" # 模块配置
1414
readonly LOG_FILE="$MODDIR/logs/service.log" # 服务日志
15+
readonly LOG_TAG="post-fs" # 日志组件标签
1516

1617
. "$MODDIR/scripts/utils/common.sh"
1718

18-
log "INFO" "post-fs-data阶段"
19+
log "INFO" "post-fs-data 阶段"
1920

2021
# 加载集成的 IPSET 内核驱动
2122
sh "$MODDIR/scripts/utils/ipset.sh" load

src/module/scripts/core/service.sh

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ readonly RUNTIME_DIR="$SINGBOX_DIR/runtime" # 运行时生成目录
2323
readonly SWITCH_SCRIPT="$MODDIR/scripts/core/switch.sh" # 模式/节点切换脚本
2424
readonly TPROXY_SCRIPT="$MODDIR/scripts/network/tproxy.sh" # 透明代理脚本
2525
readonly KILL_TIMEOUT=5 # 等待进程退出的秒数上限
26+
readonly LOG_TAG="service" # 日志组件标签
2627

2728
. "$MODDIR/scripts/utils/common.sh"
2829
. "$MODDIR/scripts/utils/config.sh"
@@ -77,9 +78,9 @@ do_start() {
7778
local node_path
7879

7980
if [ "$skip_tproxy" = "1" ]; then
80-
log "INFO" "========== 开始启动 sing-box 核心服务 (跳过 tproxy) =========="
81+
log "DEBUG" "启动 sing-box 核心服务 (跳过 tproxy)"
8182
else
82-
log "INFO" "========== 开始启动 sing-box 服务 =========="
83+
log "INFO" "启动 sing-box 服务"
8384
fi
8485
verify_environment
8586

@@ -98,10 +99,8 @@ do_start() {
9899

99100
[ "$RUNTIME_NODE_COUNT" -gt 0 ] || die "当前节点目录没有可加载的节点配置: $CUR_OUTBOUND_DIR"
100101

101-
log "INFO" "当前节点目录: $CUR_OUTBOUND_DIR"
102-
log "INFO" "路由模式: $CUR_OUTBOUND_MODE"
103-
log "INFO" "选择模式: $CUR_SELECTOR_MODE"
104-
log "INFO" "已加载节点: $RUNTIME_NODE_COUNT,跳过无效节点: $RUNTIME_SKIPPED_COUNT"
102+
# 节点与模式概要 (单行)
103+
log "INFO" "节点目录=$CUR_OUTBOUND_DIR 模式=$CUR_OUTBOUND_MODE 选择=$CUR_SELECTOR_MODE 已加载=$RUNTIME_NODE_COUNT 跳过=$RUNTIME_SKIPPED_COUNT"
105104

106105
# 构造启动参数:先基础参数,再逐个追加节点配置,最后追加运行时出站
107106
set -- run -C "$CONFDIR"
@@ -114,7 +113,7 @@ EOF
114113
set -- "$@" -c "$runtime_outbounds"
115114

116115
# 以 root:net_admin 身份后台启动进程
117-
log "INFO" "正在启动 sing-box 进程..."
116+
log "DEBUG" "正在启动 sing-box 进程..."
118117
cd "$SINGBOX_DIR" || die "无法进入配置目录: $SINGBOX_DIR"
119118
nohup "$BUSYBOX" setuidgid root:net_admin "$SING_BOX_BIN" "$@" > "$SINGBOX_LOG_FILE" 2>&1 &
120119

@@ -128,21 +127,21 @@ EOF
128127
die "sing-box 启动失败,请检查日志: $SINGBOX_LOG_FILE"
129128
fi
130129

131-
# 等待控制接口就绪后同步运行模式
130+
# 等待控制接口就绪后同步运行模式 (内部同步步骤静默)
132131
api_wait_available 60 1 || die "控制接口不可用,启动失败"
133-
LOG_STDERR=0 SWITCH_ALLOW_RESTART=0 sh "$SWITCH_SCRIPT" mode "$CUR_OUTBOUND_MODE" || die "运行模式同步失败,启动中止"
132+
LOG_STDERR=0 LOG_LEVEL=WARN SWITCH_ALLOW_RESTART=0 sh "$SWITCH_SCRIPT" mode "$CUR_OUTBOUND_MODE" || die "运行模式同步失败,启动中止"
134133
# 手动选择模式下额外同步当前节点
135134
if [ "$CUR_SELECTOR_MODE" = "manual" ] || [ "$CUR_SELECTOR_MODE" = "selector" ] || [ "$CUR_SELECTOR_MODE" = "手动选择" ] || [ "$CUR_SELECTOR_MODE" = "手动" ]; then
136-
LOG_STDERR=0 SWITCH_ALLOW_RESTART=0 sh "$SWITCH_SCRIPT" config "$CUR_OUTBOUND_CONFIG" || die "节点配置同步失败,启动中止"
135+
LOG_STDERR=0 LOG_LEVEL=WARN SWITCH_ALLOW_RESTART=0 sh "$SWITCH_SCRIPT" config "$CUR_OUTBOUND_CONFIG" || die "节点配置同步失败,启动中止"
137136
fi
138137

139138
# 非跳过模式下加载透明代理规则
140139
if [ "$skip_tproxy" != "1" ]; then
141-
log "INFO" "正在加载透明代理规则..."
140+
log "DEBUG" "正在加载透明代理规则..."
142141
"$TPROXY_SCRIPT" start -d "$TPROXY_CONF_DIR" >> "$LOG_FILE" 2>&1 || die "透明代理规则加载失败"
143142
fi
144143

145-
log "INFO" "========== sing-box 服务启动完成 =========="
144+
log "INFO" "sing-box 服务启动完成"
146145
}
147146

148147
#######################################
@@ -156,28 +155,27 @@ do_stop() {
156155
local pid count
157156

158157
if [ "$skip_tproxy" = "1" ]; then
159-
log "INFO" "========== 开始停止 sing-box 核心服务 (跳过 tproxy) =========="
158+
log "DEBUG" "停止 sing-box 核心服务 (跳过 tproxy)"
160159
else
161-
log "INFO" "========== 开始停止 sing-box 服务 =========="
160+
log "INFO" "停止 sing-box 服务"
162161
fi
163162
verify_environment
164163

165164
# 先清理透明代理规则 (非跳过模式)
166165
if [ "$skip_tproxy" != "1" ]; then
167-
log "INFO" "正在清理透明代理规则..."
166+
log "DEBUG" "正在清理透明代理规则..."
168167
"$TPROXY_SCRIPT" stop -d "$TPROXY_CONF_DIR" >> "$LOG_FILE" 2>&1 || true
169168
fi
170169

171170
# 进程不存在则清理运行时文件后返回,保证幂等
172171
pid="$(get_pid "$SING_BOX_BIN")"
173172
if [ -z "$pid" ]; then
174-
log "INFO" "未发现运行中的 sing-box 进程"
173+
log "DEBUG" "未发现运行中的 sing-box 进程"
175174
cleanup_runtime_files
176-
log "INFO" "========== sing-box 服务停止完成 =========="
177175
return 0
178176
fi
179177

180-
log "INFO" "正在停止 sing-box 进程 (PID: $pid)..."
178+
log "DEBUG" "正在停止 sing-box 进程 (PID: $pid)..."
181179

182180
# 先发送 SIGTERM,超时未退出再强制 SIGKILL
183181
if kill "$pid" 2> /dev/null; then
@@ -198,13 +196,11 @@ do_stop() {
198196
# 最终确认进程是否已退出,未退出则视为停止失败
199197
if kill -0 "$pid" 2> /dev/null; then
200198
log "ERROR" "sing-box 进程仍在运行 (PID: $pid),停止失败"
201-
log "INFO" "========== sing-box 服务停止完成 =========="
202199
return 1
203200
fi
204201

205202
cleanup_runtime_files
206-
log "INFO" "sing-box 进程已停止"
207-
log "INFO" "========== sing-box 服务停止完成 =========="
203+
log "INFO" "sing-box 服务已停止"
208204
}
209205

210206
#######################################
@@ -220,9 +216,9 @@ do_restart() {
220216
# core 模式仅重启核心进程
221217
if [ "$target" = "core" ]; then
222218
skip_tproxy=1
223-
log "INFO" "========== 开始重启 sing-box 核心服务 (跳过 tproxy) =========="
219+
log "DEBUG" "重启 sing-box 核心服务 (跳过 tproxy)"
224220
else
225-
log "INFO" "========== 开始重启 sing-box 服务 =========="
221+
log "INFO" "重启 sing-box 服务"
226222
fi
227223

228224
do_stop "$skip_tproxy"

src/module/scripts/core/subscription.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ readonly OUTBOUNDS_DIR="$MODDIR/config/singbox/outbounds" # 出站节点根目
1616
readonly DEFAULT_DIR="$OUTBOUNDS_DIR/default" # 默认节点目录
1717
readonly PROXYLINK_BIN="$MODDIR/bin/proxylink" # proxylink 二进制
1818
readonly LOG_FILE="$MODDIR/logs/subscription.log" # 订阅日志文件
19+
readonly LOG_TAG="sub" # 日志组件标签
1920

2021
. "$MODDIR/scripts/utils/common.sh"
2122
. "$MODDIR/scripts/utils/nodes.sh"

src/module/scripts/core/switch.sh

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ readonly MODULE_CONF="$MODDIR/config/module.conf" # 模块配置
1717
readonly SERVICE_SCRIPT="$MODDIR/scripts/core/service.sh" # 服务管理脚本
1818
readonly SING_BOX_BIN="$MODDIR/bin/sing-box" # sing-box 二进制
1919
readonly LOG_FILE="$MODDIR/logs/service.log" # 服务日志
20+
readonly LOG_TAG="switch" # 日志组件标签
2021
# 是否允许通过重启服务来应用配置 (启动阶段会置 0,防止递归重启)
2122
readonly SWITCH_ALLOW_RESTART="${SWITCH_ALLOW_RESTART:-1}"
2223

@@ -42,8 +43,8 @@ is_service_running() {
4243
#######################################
4344
restart_service_if_allowed() {
4445
if [ "$SWITCH_ALLOW_RESTART" = "1" ]; then
45-
log "INFO" "正在重启 sing-box 核心服务以应用配置..."
46-
LOG_STDERR=0 sh "$SERVICE_SCRIPT" restart core || die "重启 sing-box 服务失败"
46+
log "DEBUG" "回退方式:重启核心服务以应用配置"
47+
LOG_STDERR=0 LOG_LEVEL=WARN sh "$SERVICE_SCRIPT" restart core || die "重启 sing-box 服务失败"
4748
else
4849
log "WARN" "当前阶段不允许通过重启应用配置"
4950
return 1
@@ -59,44 +60,42 @@ restart_service_if_allowed() {
5960
#######################################
6061
switch_config() {
6162
local config_file="$1"
62-
local target_tag
63+
local target_tag node_name
6364

6465
require_file "$MODULE_CONF" "模块配置文件不存在: $MODULE_CONF"
6566
require_file "$config_file" "节点配置文件不存在: $config_file"
6667

67-
log "INFO" "========== 开始切换 sing-box 节点配置 =========="
68-
log "INFO" "目标节点文件: $config_file"
68+
node_name="${config_file##*/}"
69+
log "INFO" "切换节点: $node_name"
6970

7071
# 持久化当前节点路径并读取其出站标签
7172
set_conf "$MODULE_CONF" "CURRENT_CONFIG" "$(quote_conf "$config_file")"
7273
target_tag="$(detect_outbound_tag "$config_file" || true)"
7374

7475
# 服务未运行时仅持久化,下次启动生效
7576
if ! is_service_running; then
76-
log "INFO" "sing-box 未运行,新的节点配置将在下次启动时生效"
77-
log "INFO" "========== 节点配置切换完成 =========="
77+
log "INFO" "服务未运行,节点将在下次启动时生效"
7878
return 0
7979
fi
8080

8181
# 有标签时优先通过控制接口热切换
8282
if [ -n "$target_tag" ]; then
8383
if api_select_proxy "$target_tag"; then
84-
log "INFO" "已通过控制接口切换到节点: $target_tag"
85-
log "INFO" "========== 节点配置切换完成 =========="
84+
log "INFO" "节点切换完成: $target_tag"
8685
return 0
8786
fi
88-
log "INFO" "当前运行实例未加载目标节点或控制接口切换失败,准备重启服务"
87+
log "WARN" "运行实例未加载该节点,回退重启服务"
8988
else
90-
log "INFO" "无法读取目标节点标签,准备重启服务"
89+
log "WARN" "无法读取目标节点标签,回退重启服务"
9190
fi
9291

9392
# 热切换失败则回退为重启服务
9493
restart_service_if_allowed || {
95-
log "WARN" "本次仅完成配置持久化,等待下次服务重启生效"
94+
log "WARN" "仅完成配置持久化,等待下次重启生效"
9695
return 1
9796
}
9897

99-
log "INFO" "========== 节点配置切换完成 =========="
98+
log "INFO" "节点切换完成: $node_name"
10099
}
101100

102101
#######################################
@@ -119,32 +118,30 @@ switch_mode() {
119118

120119
require_file "$MODULE_CONF" "模块配置文件不存在: $MODULE_CONF"
121120

122-
log "INFO" "========== 开始切换 sing-box 出站模式: $target_mode =========="
121+
log "INFO" "切换出站模式: $target_mode"
123122
# 持久化目标模式
124123
set_conf "$MODULE_CONF" "OUTBOUND_MODE" "$target_mode"
125124

126125
# 服务未运行时仅持久化,下次启动生效
127126
if ! is_service_running; then
128-
log "INFO" "sing-box 未运行,新的出站模式将在下次启动时生效"
129-
log "INFO" "========== 出站模式切换完成 =========="
127+
log "INFO" "服务未运行,模式将在下次启动时生效"
130128
return 0
131129
fi
132130

133131
# 优先通过控制接口切换
134132
if api_set_mode "$target_mode"; then
135-
log "INFO" "已通过控制接口切换出站模式"
136-
log "INFO" "========== 出站模式切换完成 =========="
133+
log "INFO" "出站模式切换完成: $target_mode"
137134
return 0
138135
fi
139136

140137
# 接口切换失败则回退为重启服务
141-
log "WARN" "控制接口切换模式失败,准备重启服务"
138+
log "WARN" "控制接口切换模式失败,回退重启服务"
142139
restart_service_if_allowed || {
143-
log "WARN" "本次仅完成模式持久化,等待下次服务重启生效"
140+
log "WARN" "仅完成模式持久化,等待下次重启生效"
144141
return 1
145142
}
146143

147-
log "INFO" "========== 出站模式切换完成 =========="
144+
log "INFO" "出站模式切换完成: $target_mode"
148145
}
149146

150147
#######################################

src/module/scripts/utils/api.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,9 @@ api_request() {
118118
fi
119119
return 0
120120
else
121-
# 非 GET:仅校验状态码,失败时记录日志
121+
# 非 GET:仅校验状态码;失败记 DEBUG (是否严重由调用方判定)
122122
if [ $status -ne 0 ] || ! printf "%s" "$status_line" | grep -q -E '^HTTP/[0-9.]+ 2[0-9][0-9]'; then
123-
log "ERROR" "[控制接口错误] 请求失败: $method $path,状态行: $status_line"
123+
log "DEBUG" "[控制接口] 请求失败: $method $path,状态行: $status_line"
124124
return 1
125125
fi
126126
return 0

src/module/scripts/utils/common.sh

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,22 @@ NL='
1212
TAB="$(printf '\t')" # 制表符
1313
CR="$(printf '\r')" # 回车符
1414

15+
#######################################
16+
# 将日志级别名映射为数字 severity
17+
# 参数:
18+
# $1 级别名 (DEBUG/INFO/WARN/ERROR)
19+
# 返回: 标准输出打印对应数字 (未知级别按 INFO=20 处理)
20+
#######################################
21+
log_level_value() {
22+
case "$1" in
23+
DEBUG) printf "10" ;;
24+
INFO) printf "20" ;;
25+
WARN) printf "30" ;;
26+
ERROR) printf "40" ;;
27+
*) printf "20" ;;
28+
esac
29+
}
30+
1531
#######################################
1632
# 写入标准日志
1733
# 参数:
@@ -20,22 +36,28 @@ CR="$(printf '\r')" # 回车符
2036
# 全局:
2137
# LOG_FILE 日志文件路径 (存在时追加写入)
2238
# LOG_STDERR 是否输出到 stderr (0=否,默认输出)
39+
# LOG_LEVEL 输出阈值级别 (默认 INFO),低于该级别的消息被丢弃
40+
# LOG_TAG 来源组件标签 (缺省取脚本名)
2341
# 返回: 无
2442
#######################################
2543
log() {
2644
local level="INFO"
2745
local message="$1"
28-
local timestamp log_content
46+
local timestamp tag
2947

3048
# 传入两个参数时,第一个作为日志级别
3149
if [ $# -ge 2 ]; then
3250
level="$1"
3351
message="$2"
3452
fi
3553

36-
# 组装带时间戳的日志行
54+
# 低于阈值的消息直接丢弃 (文件与 stderr 均不写)
55+
[ "$(log_level_value "$level")" -ge "$(log_level_value "${LOG_LEVEL:-INFO}")" ] || return 0
56+
57+
# 组装带时间戳与组件标签的日志行
3758
timestamp="$(date '+%Y-%m-%d %H:%M:%S')"
38-
log_content="[$timestamp] [$level] $message"
59+
tag="${LOG_TAG:-${0##*/}}"
60+
local log_content="[$timestamp] [$level] [$tag] $message"
3961

4062
# 写入日志文件 (若已配置)
4163
[ -n "${LOG_FILE:-}" ] && printf "%s\n" "$log_content" >> "$LOG_FILE"

src/module/scripts/utils/gms_fix.sh

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ set -u # 引用未定义变量报错
1212
# 模块根目录与日志文件
1313
readonly MODDIR="$(cd "$(dirname "$0")/../.." && pwd)"
1414
readonly LOG_FILE="$MODDIR/logs/service.log"
15+
readonly LOG_TAG="gms" # 日志组件标签
1516

1617
. "$MODDIR/scripts/utils/common.sh"
1718

@@ -128,9 +129,9 @@ EOF
128129
main() {
129130
case "${1:-run}" in
130131
run)
131-
log "INFO" "========== 开始执行设备兼容性修复 =========="
132+
log "INFO" "执行设备兼容性修复"
132133
fix_by_device
133-
log "INFO" "========== 设备兼容性修复完成 =========="
134+
log "INFO" "设备兼容性修复完成"
134135
;;
135136
-h | --help | help)
136137
show_usage

src/module/scripts/utils/ipset.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ readonly MODDIR="$(cd "$(dirname "$0")/../.." && pwd)"
1414
readonly LOG_FILE="$MODDIR/logs/service.log" # 服务日志
1515
readonly NETFILTER_DIR="/data/adb/netfilter" # 驱动 .ko 存放目录
1616
readonly KO_LOADER="$MODDIR/bin/IPSET-LKM/ko-loader" # 内核模块加载器
17+
readonly LOG_TAG="ipset" # 日志组件标签
1718

1819
. "$MODDIR/scripts/utils/common.sh"
1920

0 commit comments

Comments
 (0)