mirror of
https://github.com/portainer/portainer.git
synced 2025-07-22 14:59:41 +02:00
56 lines
1.4 KiB
TypeScript
56 lines
1.4 KiB
TypeScript
|
import { without } from 'lodash';
|
||
|
|
||
|
import { FormattedLine, Span, JSONLogs, TIMESTAMP_LENGTH } from './types';
|
||
|
import {
|
||
|
formatCaller,
|
||
|
formatKeyValuePair,
|
||
|
formatLevel,
|
||
|
formatMessage,
|
||
|
formatStackTrace,
|
||
|
formatTime,
|
||
|
} from './formatters';
|
||
|
|
||
|
function removeKnownKeys(keys: string[]) {
|
||
|
return without(keys, 'time', 'level', 'caller', 'message', 'stack_trace');
|
||
|
}
|
||
|
|
||
|
export function formatJSONLine(
|
||
|
rawText: string,
|
||
|
withTimestamps?: boolean
|
||
|
): FormattedLine[] {
|
||
|
const spans: Span[] = [];
|
||
|
const lines: FormattedLine[] = [];
|
||
|
let line = '';
|
||
|
|
||
|
const text = withTimestamps ? rawText.substring(TIMESTAMP_LENGTH) : rawText;
|
||
|
|
||
|
const json: JSONLogs = JSON.parse(text);
|
||
|
const { time, level, caller, message, stack_trace: stackTrace } = json;
|
||
|
const keys = removeKnownKeys(Object.keys(json));
|
||
|
|
||
|
if (withTimestamps) {
|
||
|
const timestamp = rawText.substring(0, TIMESTAMP_LENGTH);
|
||
|
spans.push({ text: timestamp });
|
||
|
line += `${timestamp}`;
|
||
|
}
|
||
|
line += formatTime(time, spans, line);
|
||
|
line += formatLevel(level, spans, line);
|
||
|
line += formatCaller(caller, spans, line);
|
||
|
line += formatMessage(message, spans, line, !!keys.length);
|
||
|
|
||
|
keys.forEach((key, idx) => {
|
||
|
line += formatKeyValuePair(
|
||
|
key,
|
||
|
json[key],
|
||
|
spans,
|
||
|
line,
|
||
|
idx === keys.length - 1
|
||
|
);
|
||
|
});
|
||
|
|
||
|
lines.push({ line, spans });
|
||
|
formatStackTrace(stackTrace, lines);
|
||
|
|
||
|
return lines;
|
||
|
}
|