























@@ -202,6 +202,37 @@ function extractTraceContext(value: unknown): DiagnosticTraceContext | undefined
202202return normalizeTraceContext((value as { trace?: unknown }).trace);
203203}
204204205+function getSortedNumericLogArgs(logObj: TsLogRecord): unknown[] {
206+return Object.entries(logObj)
207+.filter(([key]) => /^\d+$/.test(key))
208+.toSorted((a, b) => Number(a[0]) - Number(b[0]))
209+.map(([, value]) => value);
210+}
211+212+function extractLogBindingPrefix(numericArgs: unknown[]): {
213+bindings?: Record<string, unknown>;
214+args: unknown[];
215+} {
216+if (
217+typeof numericArgs[0] === "string" &&
218+numericArgs[0].length <= MAX_DIAGNOSTIC_LOG_BINDINGS_JSON_CHARS &&
219+numericArgs[0].trim().startsWith("{")
220+) {
221+try {
222+const parsed = JSON.parse(numericArgs[0]);
223+if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
224+return {
225+bindings: parsed as Record<string, unknown>,
226+args: numericArgs.slice(1),
227+};
228+}
229+} catch {
230+// ignore malformed json bindings
231+}
232+}
233+return { args: numericArgs };
234+}
235+205236function findLogTraceContext(
206237bindings: Record<string, unknown> | undefined,
207238numericArgs: readonly unknown[],
@@ -219,6 +250,20 @@ function findLogTraceContext(
219250return undefined;
220251}
221252253+function buildTraceFileLogFields(logObj: TsLogRecord): Record<string, string> | undefined {
254+const { bindings, args } = extractLogBindingPrefix(getSortedNumericLogArgs(logObj));
255+const trace = findLogTraceContext(bindings, args);
256+if (!trace) {
257+return undefined;
258+}
259+return {
260+traceId: trace.traceId,
261+ ...(trace.spanId ? { spanId: trace.spanId } : {}),
262+ ...(trace.parentSpanId ? { parentSpanId: trace.parentSpanId } : {}),
263+ ...(trace.traceFlags ? { traceFlags: trace.traceFlags } : {}),
264+};
265+}
266+222267function buildDiagnosticLogRecord(logObj: TsLogRecord) {
223268const meta = logObj._meta as
224269| {
@@ -235,27 +280,7 @@ function buildDiagnosticLogRecord(logObj: TsLogRecord) {
235280};
236281}
237282| undefined;
238-const numericArgs = Object.entries(logObj)
239-.filter(([key]) => /^\d+$/.test(key))
240-.toSorted((a, b) => Number(a[0]) - Number(b[0]))
241-.map(([, value]) => value);
242-243-let bindings: Record<string, unknown> | undefined;
244-if (
245-typeof numericArgs[0] === "string" &&
246-numericArgs[0].length <= MAX_DIAGNOSTIC_LOG_BINDINGS_JSON_CHARS &&
247-numericArgs[0].trim().startsWith("{")
248-) {
249-try {
250-const parsed = JSON.parse(numericArgs[0]);
251-if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
252-bindings = parsed as Record<string, unknown>;
253-numericArgs.shift();
254-}
255-} catch {
256-// ignore malformed json bindings
257-}
258-}
283+const { bindings, args: numericArgs } = extractLogBindingPrefix(getSortedNumericLogArgs(logObj));
259284260285const trace = findLogTraceContext(bindings, numericArgs);
261286const structuredArg = numericArgs[0];
@@ -420,7 +445,8 @@ function buildLogger(settings: ResolvedSettings): TsLogger<LogObj> {
420445currentFileBytes = getCurrentLogFileBytes(activeFile);
421446}
422447const time = formatTimestamp(logObj.date ?? new Date(), { style: "long" });
423-const line = redactSensitiveText(JSON.stringify({ ...logObj, time }));
448+const traceFields = buildTraceFileLogFields(logObj as TsLogRecord);
449+const line = redactSensitiveText(JSON.stringify({ ...logObj, time, ...traceFields }));
424450const payload = `${line}\n`;
425451const payloadBytes = Buffer.byteLength(payload, "utf8");
426452const nextBytes = currentFileBytes + payloadBytes;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。