nomid2 commited on
Commit
8009cc9
·
verified ·
1 Parent(s): 86e09a1

Upload logger.js

Browse files
Files changed (1) hide show
  1. src/lib/logger.js +109 -82
src/lib/logger.js CHANGED
@@ -36,9 +36,25 @@ class Logger {
36
  logRequestStart(method, url, headers = {}, body = {}) {
37
  const requestId = this.generateRequestId()
38
  const timestamp = this.getTimestamp()
39
-
40
  // 提取关键信息,避免记录敏感数据
41
  const logData = {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  requestId,
43
  timestamp,
44
  method,
@@ -50,15 +66,9 @@ class Logger {
50
  messageCount: Array.isArray(body.messages) ? body.messages.length : 0,
51
  hasImages: this.detectImages(body.messages),
52
  isStream: body.stream === true
53
- }
54
-
55
- // 记录到活跃请求映射
56
- this.activeRequests.set(requestId, {
57
- startTime: Date.now(),
58
- ...logData
59
  })
60
 
61
- console.log(`[REQUEST_START] ${JSON.stringify(logData)}`)
62
  return requestId
63
  }
64
 
@@ -71,27 +81,27 @@ class Logger {
71
  logRequestEnd(requestId, statusCode, responseInfo = {}) {
72
  const timestamp = this.getTimestamp()
73
  const activeRequest = this.activeRequests.get(requestId)
74
-
75
  if (!activeRequest) {
76
- console.warn(`[REQUEST_END] 未找到请求ID: ${requestId}`)
77
  return
78
  }
79
 
80
  const duration = Date.now() - activeRequest.startTime
81
-
82
  const logData = {
83
- requestId,
84
- timestamp,
85
- duration: `${duration}ms`,
86
- statusCode,
87
- success: statusCode >= 200 && statusCode < 300,
88
- model: activeRequest.model,
89
- isStream: activeRequest.isStream,
90
  ...responseInfo
91
  }
92
 
93
- console.log(`[REQUEST_END] ${JSON.stringify(logData)}`)
94
-
95
  // 清理活跃请求
96
  this.activeRequests.delete(requestId)
97
  }
@@ -104,13 +114,13 @@ class Logger {
104
  logImageProcessingStart(requestId, imageCount) {
105
  const timestamp = this.getTimestamp()
106
  const logData = {
107
- requestId,
108
- timestamp,
109
- event: 'IMAGE_PROCESSING_START',
110
- imageCount
111
  }
112
-
113
- console.log(`[IMAGE_PROCESSING] ${JSON.stringify(logData)}`)
114
  }
115
 
116
  /**
@@ -122,16 +132,16 @@ class Logger {
122
  logLongImageDetection(requestId, imageIndex, detection) {
123
  const timestamp = this.getTimestamp()
124
  const logData = {
125
- requestId,
126
- timestamp,
127
- event: 'LONG_IMAGE_DETECTION',
128
- imageIndex,
129
- isLongImage: detection.isLongImage,
130
- dimensions: `${detection.width}x${detection.height}`,
131
- ratio: detection.ratio?.toFixed(2)
132
  }
133
-
134
- console.log(`[IMAGE_PROCESSING] ${JSON.stringify(logData)}`)
135
  }
136
 
137
  /**
@@ -143,18 +153,18 @@ class Logger {
143
  logImageCropping(requestId, imageIndex, cropResult) {
144
  const timestamp = this.getTimestamp()
145
  const stats = cropResult.stats || {}
146
-
147
  const logData = {
148
- requestId,
149
- timestamp,
150
- event: 'IMAGE_CROPPING',
151
- imageIndex,
152
- totalSegments: stats.totalSegments || 0,
153
- originalDimensions: stats.originalDimensions,
154
- segmentCount: cropResult.segments?.length || 0
155
  }
156
-
157
- console.log(`[IMAGE_PROCESSING] ${JSON.stringify(logData)}`)
158
  }
159
 
160
  /**
@@ -169,17 +179,17 @@ class Logger {
169
  logImageUpload(requestId, imageIndex, segmentIndex, success, url = null, error = null) {
170
  const timestamp = this.getTimestamp()
171
  const logData = {
172
- requestId,
173
- timestamp,
174
- event: 'IMAGE_UPLOAD',
175
- imageIndex,
176
- segmentIndex,
177
- success,
178
- url: success ? url : null,
179
- error: success ? null : error
180
  }
181
-
182
- console.log(`[IMAGE_PROCESSING] ${JSON.stringify(logData)}`)
183
  }
184
 
185
  /**
@@ -191,14 +201,14 @@ class Logger {
191
  logModelCallStart(requestId, model, mammouthModel) {
192
  const timestamp = this.getTimestamp()
193
  const logData = {
194
- requestId,
195
- timestamp,
196
- event: 'MODEL_CALL_START',
197
- requestedModel: model,
198
- mammouthModel,
199
  }
200
-
201
- console.log(`[MODEL_CALL] ${JSON.stringify(logData)}`)
202
  }
203
 
204
  /**
@@ -211,15 +221,15 @@ class Logger {
211
  logModelCallEnd(requestId, success, error = null, duration = null) {
212
  const timestamp = this.getTimestamp()
213
  const logData = {
214
- requestId,
215
- timestamp,
216
- event: 'MODEL_CALL_END',
217
- success,
218
- error: success ? null : error,
219
- duration: duration ? `${duration}ms` : null
220
  }
221
-
222
- console.log(`[MODEL_CALL] ${JSON.stringify(logData)}`)
223
  }
224
 
225
  /**
@@ -232,15 +242,15 @@ class Logger {
232
  logError(requestId, errorType, errorMessage, errorDetails = {}) {
233
  const timestamp = this.getTimestamp()
234
  const logData = {
235
- requestId,
236
- timestamp,
237
- event: 'ERROR',
238
- errorType,
239
- errorMessage,
240
  ...errorDetails
241
  }
242
-
243
- console.error(`[ERROR] ${JSON.stringify(logData)}`)
244
  }
245
 
246
  /**
@@ -266,14 +276,31 @@ class Logger {
266
  * @returns {boolean}
267
  */
268
  detectImages(messages) {
269
- if (!Array.isArray(messages)) return false
270
-
271
- return messages.some(message => {
 
 
 
 
 
 
272
  if (Array.isArray(message.content)) {
273
- return message.content.some(part => part.type === 'image_url')
 
 
 
 
 
 
 
 
 
274
  }
275
- return false
276
  })
 
 
 
277
  }
278
 
279
  /**
 
36
  logRequestStart(method, url, headers = {}, body = {}) {
37
  const requestId = this.generateRequestId()
38
  const timestamp = this.getTimestamp()
39
+
40
  // 提取关键信息,避免记录敏感数据
41
  const logData = {
42
+ 请求ID: requestId,
43
+ 时间: timestamp,
44
+ 方法: method,
45
+ 路径: url,
46
+ 用户代理: headers['user-agent'] || '未知',
47
+ 内容类型: headers['content-type'] || '未知',
48
+ 内容长度: headers['content-length'] || '未知',
49
+ 模型: body.model || '未知',
50
+ 消息数量: Array.isArray(body.messages) ? body.messages.length : 0,
51
+ 包含图片: this.detectImages(body.messages),
52
+ 流式请求: body.stream === true
53
+ }
54
+
55
+ // 记录到活跃请求映射
56
+ this.activeRequests.set(requestId, {
57
+ startTime: Date.now(),
58
  requestId,
59
  timestamp,
60
  method,
 
66
  messageCount: Array.isArray(body.messages) ? body.messages.length : 0,
67
  hasImages: this.detectImages(body.messages),
68
  isStream: body.stream === true
 
 
 
 
 
 
69
  })
70
 
71
+ console.log(`[请求开始] ${JSON.stringify(logData)}`)
72
  return requestId
73
  }
74
 
 
81
  logRequestEnd(requestId, statusCode, responseInfo = {}) {
82
  const timestamp = this.getTimestamp()
83
  const activeRequest = this.activeRequests.get(requestId)
84
+
85
  if (!activeRequest) {
86
+ console.warn(`[请求结束] 未找到请求ID: ${requestId}`)
87
  return
88
  }
89
 
90
  const duration = Date.now() - activeRequest.startTime
91
+
92
  const logData = {
93
+ 请求ID: requestId,
94
+ 时间: timestamp,
95
+ 耗时: `${duration}ms`,
96
+ 状态码: statusCode,
97
+ 成功: statusCode >= 200 && statusCode < 300,
98
+ 模型: activeRequest.model,
99
+ 流式请求: activeRequest.isStream,
100
  ...responseInfo
101
  }
102
 
103
+ console.log(`[请求结束] ${JSON.stringify(logData)}`)
104
+
105
  // 清理活跃请求
106
  this.activeRequests.delete(requestId)
107
  }
 
114
  logImageProcessingStart(requestId, imageCount) {
115
  const timestamp = this.getTimestamp()
116
  const logData = {
117
+ 请求ID: requestId,
118
+ 时间: timestamp,
119
+ 事件: '图片处理开始',
120
+ 图片数量: imageCount
121
  }
122
+
123
+ console.log(`[图片处理] ${JSON.stringify(logData)}`)
124
  }
125
 
126
  /**
 
132
  logLongImageDetection(requestId, imageIndex, detection) {
133
  const timestamp = this.getTimestamp()
134
  const logData = {
135
+ 请求ID: requestId,
136
+ 时间: timestamp,
137
+ 事件: '长图检测',
138
+ 图片索引: imageIndex,
139
+ 是否长图: detection.isLongImage ? '是' : '否',
140
+ 尺寸: `${detection.width}x${detection.height}`,
141
+ 高宽比: detection.ratio?.toFixed(2)
142
  }
143
+
144
+ console.log(`[图片处理] ${JSON.stringify(logData)}`)
145
  }
146
 
147
  /**
 
153
  logImageCropping(requestId, imageIndex, cropResult) {
154
  const timestamp = this.getTimestamp()
155
  const stats = cropResult.stats || {}
156
+
157
  const logData = {
158
+ 请求ID: requestId,
159
+ 时间: timestamp,
160
+ 事件: '图片切割',
161
+ 图片索引: imageIndex,
162
+ 切割片段数: stats.totalSegments || 0,
163
+ 原始尺寸: stats.originalDimensions,
164
+ 实际片段数: cropResult.segments?.length || 0
165
  }
166
+
167
+ console.log(`[图片处理] ${JSON.stringify(logData)}`)
168
  }
169
 
170
  /**
 
179
  logImageUpload(requestId, imageIndex, segmentIndex, success, url = null, error = null) {
180
  const timestamp = this.getTimestamp()
181
  const logData = {
182
+ 请求ID: requestId,
183
+ 时间: timestamp,
184
+ 事件: '图片上传',
185
+ 图片索引: imageIndex,
186
+ 片段索引: segmentIndex,
187
+ 成功: success ? '是' : '否',
188
+ 上传地址: success ? url : null,
189
+ 错误信息: success ? null : error
190
  }
191
+
192
+ console.log(`[图片处理] ${JSON.stringify(logData)}`)
193
  }
194
 
195
  /**
 
201
  logModelCallStart(requestId, model, mammouthModel) {
202
  const timestamp = this.getTimestamp()
203
  const logData = {
204
+ 请求ID: requestId,
205
+ 时间: timestamp,
206
+ 事件: '模型调用开始',
207
+ 请求模型: model,
208
+ 实际模型: mammouthModel,
209
  }
210
+
211
+ console.log(`[模型调用] ${JSON.stringify(logData)}`)
212
  }
213
 
214
  /**
 
221
  logModelCallEnd(requestId, success, error = null, duration = null) {
222
  const timestamp = this.getTimestamp()
223
  const logData = {
224
+ 请求ID: requestId,
225
+ 时间: timestamp,
226
+ 事件: '模型调用结束',
227
+ 成功: success ? '是' : '否',
228
+ 错误信息: success ? null : error,
229
+ 耗时: duration ? `${duration}ms` : null
230
  }
231
+
232
+ console.log(`[模型调用] ${JSON.stringify(logData)}`)
233
  }
234
 
235
  /**
 
242
  logError(requestId, errorType, errorMessage, errorDetails = {}) {
243
  const timestamp = this.getTimestamp()
244
  const logData = {
245
+ 请求ID: requestId,
246
+ 时间: timestamp,
247
+ 事件: '错误',
248
+ 错误类型: errorType,
249
+ 错误信息: errorMessage,
250
  ...errorDetails
251
  }
252
+
253
+ console.error(`[错误] ${JSON.stringify(logData)}`)
254
  }
255
 
256
  /**
 
276
  * @returns {boolean}
277
  */
278
  detectImages(messages) {
279
+ if (!Array.isArray(messages)) {
280
+ console.log(`[图片检测] 消息不是数组: ${typeof messages}`)
281
+ return false
282
+ }
283
+
284
+ let hasImages = false
285
+ let imageCount = 0
286
+
287
+ messages.forEach((message, index) => {
288
  if (Array.isArray(message.content)) {
289
+ const imagePartsCount = message.content.filter(part => part.type === 'image_url').length
290
+ if (imagePartsCount > 0) {
291
+ hasImages = true
292
+ imageCount += imagePartsCount
293
+ console.log(`[图片检测] 消息${index}包含${imagePartsCount}张图片`)
294
+ }
295
+ } else if (typeof message.content === 'string') {
296
+ console.log(`[图片检测] 消息${index}是纯文本`)
297
+ } else {
298
+ console.log(`[图片检测] 消息${index}内容类型: ${typeof message.content}`)
299
  }
 
300
  })
301
+
302
+ console.log(`[图片检测] 总计检测到${imageCount}张图片`)
303
+ return hasImages
304
  }
305
 
306
  /**