|
|
@@ -115,15 +115,15 @@ function isProxyTlsHandshakeReset(err) {
|
|
|
async function logSchoolOutbound(logger, phase, url, axiosMerge, opts = {}) {
|
|
|
if (!logger?.info) return
|
|
|
const path = briefUrlPath(url)
|
|
|
- const mqPart = opts.mqTaskId ? ` mq_task_id=${opts.mqTaskId}` : ''
|
|
|
+ const taskPrefix = opts.mqTaskId ? ` [${opts.mqTaskId}]` : ''
|
|
|
if (!axiosMerge || axiosMerge.proxy === false || !axiosMerge.proxy) {
|
|
|
- logger.info(`[lepaoSchoolHttp] ${phase} POST 出站=直连${mqPart} path=${path}`)
|
|
|
+ logger.info(`[lepaoSchoolHttp]${taskPrefix} ${phase} POST 出站=直连 path=${path}`)
|
|
|
return
|
|
|
}
|
|
|
const conn = `${axiosMerge.proxy.host}:${axiosMerge.proxy.port}`
|
|
|
if (opts.skipQgSnapshot) {
|
|
|
logger.info(
|
|
|
- `[lepaoSchoolHttp] ${phase} POST 出站=调试HTTP代理(非青果)${mqPart} 连接=${conn} path=${path}`
|
|
|
+ `[lepaoSchoolHttp]${taskPrefix} ${phase} POST 出站=调试HTTP代理(非青果) 连接=${conn} path=${path}`
|
|
|
)
|
|
|
return
|
|
|
}
|
|
|
@@ -132,7 +132,7 @@ async function logSchoolOutbound(logger, phase, url, axiosMerge, opts = {}) {
|
|
|
const egress = snap?.proxyIp ?? '(暂无 proxy_ip)'
|
|
|
const dl = snap?.deadline ?? '—'
|
|
|
logger.info(
|
|
|
- `[lepaoSchoolHttp] ${phase} POST 出站=HTTP代理${mqPart} 节点server=${serverRecord} 连接${conn} 出口IP(proxy_ip)=${egress} deadline=${dl} path=${path}`
|
|
|
+ `[lepaoSchoolHttp]${taskPrefix} ${phase} POST 出站=HTTP代理 节点server=${serverRecord} 连接${conn} 出口IP(proxy_ip)=${egress} deadline=${dl} path=${path}`
|
|
|
)
|
|
|
}
|
|
|
|
|
|
@@ -141,6 +141,7 @@ async function logSchoolOutbound(logger, phase, url, axiosMerge, opts = {}) {
|
|
|
*/
|
|
|
async function postLepaoSchool(url, data, options = {}) {
|
|
|
const { headers = {}, timeout = 15000, logger = null, outboundMode = 'auto', mqTaskId = null } = options
|
|
|
+ const taskPrefix = mqTaskId ? `[${mqTaskId}] ` : ''
|
|
|
|
|
|
const doPost = async (qgProxyFragment, requestTimeout = timeout) => {
|
|
|
const outbound = buildAxiosOutboundConfig(qgProxyFragment)
|
|
|
@@ -180,7 +181,7 @@ async function postLepaoSchool(url, data, options = {}) {
|
|
|
err.retryable = true
|
|
|
throw err
|
|
|
}
|
|
|
- logger?.error?.(`[lepaoSchoolHttp] 青果提取多次重试仍失败,改直连: ${e0.message || e0}`)
|
|
|
+ logger?.error?.(`[lepaoSchoolHttp] ${taskPrefix}青果提取多次重试仍失败,改直连: ${e0.message || e0}`)
|
|
|
await logSchoolOutbound(logger, '(青果提取异常→直连)', url, { proxy: false })
|
|
|
await QgProxyManager.recordFallbackDirect({
|
|
|
reason: 'qg_extract_error',
|
|
|
@@ -200,7 +201,7 @@ async function postLepaoSchool(url, data, options = {}) {
|
|
|
}
|
|
|
|
|
|
if (frag.proxy === false) {
|
|
|
- logger?.warn?.('[lepaoSchoolHttp] 无可用青果节点,对学校 POST 将直连')
|
|
|
+ logger?.warn?.(`[lepaoSchoolHttp] ${taskPrefix}无可用青果节点,对学校 POST 将直连`)
|
|
|
if (outboundMode === 'proxy') {
|
|
|
const err = new Error('代理模式无可用节点')
|
|
|
err.code = 'PROXY_REQUIRED_NO_NODE'
|
|
|
@@ -225,7 +226,7 @@ async function postLepaoSchool(url, data, options = {}) {
|
|
|
}
|
|
|
if (!isQgProxyEligibleFailure(e1)) throw e1
|
|
|
logger?.warn?.(
|
|
|
- `[lepaoSchoolHttp] 经代理首次请求失败,将直接回退直连。err=${e1.message || e1} ${JSON.stringify(
|
|
|
+ `[lepaoSchoolHttp] ${taskPrefix}经代理首次请求失败,将直接回退直连。err=${e1.message || e1} ${JSON.stringify(
|
|
|
summarizeAxiosError(e1)
|
|
|
)}`
|
|
|
)
|
|
|
@@ -233,7 +234,7 @@ async function postLepaoSchool(url, data, options = {}) {
|
|
|
const tls1 = isProxyTlsHandshakeReset(e1)
|
|
|
if (tls1) {
|
|
|
logger?.warn?.(
|
|
|
- '[lepaoSchoolHttp] TLS 握手前经代理断开,隧道池模式直接直连(由服务商后台自动切换出口)'
|
|
|
+ `[lepaoSchoolHttp] ${taskPrefix}TLS 握手前经代理断开,隧道池模式直接直连(由服务商后台自动切换出口)`
|
|
|
)
|
|
|
await logSchoolOutbound(logger, '(TLS隧道异常→直连)', url, { proxy: false }, { mqTaskId })
|
|
|
await QgProxyManager.recordFallbackDirect({
|