fix: 修复批量流水线执行时日志显示错乱的问题

v2-dev
xiaojunnuo 2025-09-01 18:10:32 +08:00
parent 8a0c2b9b13
commit 4372adc703
2 changed files with 78 additions and 48 deletions

View File

@ -1,22 +1,4 @@
import log4js, { LoggingEvent, Logger, Level, CallStack } from "log4js"; import log4js, { CallStack, Level, Logger } from "log4js";
const OutputAppender = {
configure: (config: any, layouts: any, findAppender: any, levels: any) => {
let layout = layouts.basicLayout;
if (config.layout) {
layout = layouts.layout(config.layout.type, config.layout);
}
function customAppender(layout: any, timezoneOffset: any) {
return (loggingEvent: LoggingEvent) => {
if (loggingEvent.context.outputHandler?.write) {
const text = `${layout(loggingEvent, timezoneOffset)}\n`;
loggingEvent.context.outputHandler.write(text);
}
};
}
return customAppender(layout, config.timezoneOffset);
},
};
let logFilePath = "./logs/app.log"; let logFilePath = "./logs/app.log";
export function resetLogConfigure() { export function resetLogConfigure() {
@ -24,7 +6,6 @@ export function resetLogConfigure() {
log4js.configure({ log4js.configure({
appenders: { appenders: {
std: { type: "stdout" }, std: { type: "stdout" },
output: { type: OutputAppender },
file: { file: {
type: "dateFile", type: "dateFile",
filename: logFilePath, filename: logFilePath,
@ -33,7 +14,7 @@ export function resetLogConfigure() {
numBackups: 3, numBackups: 3,
}, },
}, },
categories: { default: { appenders: ["std", "file"], level: "info" }, pipeline: { appenders: ["std", "file", "output"], level: "info" } }, categories: { default: { appenders: ["std", "file"], level: "info" }, pipeline: { appenders: ["std", "file"], level: "info" } },
}); });
} }
resetLogConfigure(); resetLogConfigure();
@ -44,15 +25,49 @@ export function resetLogFilePath(filePath: string) {
resetLogConfigure(); resetLogConfigure();
} }
export function buildLogger(write: (text: string) => void) { export function buildLogger(write: (text: string) => void) {
const logger = log4js.getLogger("pipeline"); return new PipelineLogger("pipeline", write);
const _secrets: string[] = []; }
//@ts-ignore
logger.addSecret = (secret: string) => { export type ILogger = Logger;
_secrets.push(secret);
}; const locale = Intl.DateTimeFormat().resolvedOptions().locale;
logger.addContext("outputHandler", { const formatter = new Intl.DateTimeFormat(locale, {
write: (text: string) => { year: "numeric",
for (const item of _secrets) { month: "2-digit",
day: "2-digit",
hour: "2-digit",
minute: "2-digit",
second: "2-digit",
hour12: false,
});
function formatDateIntl(date = new Date()) {
const milliseconds = date.getMilliseconds(); // 获取毫秒
const formattedMilliseconds = milliseconds.toString().padStart(3, "0");
return formatter.format(date) + "." + formattedMilliseconds;
}
// @ts-ignore
export class PipelineLogger implements ILogger {
callStackLinesToSkip: number = 3;
readonly category: string = "pipeline";
level: Level | string = "info";
_secrets: string[] = [];
logger: ILogger;
customWriter!: (text: string) => void;
constructor(name: string, write: (text: string) => void) {
this.customWriter = write;
this.logger = log4js.getLogger(name);
}
addSecret(secret: string) {
this._secrets.push(secret);
}
_doLog(level: string, ...args: any[]) {
let text = args.join(" ");
if (this.customWriter) {
for (const item of this._secrets) {
if (item == null) { if (item == null) {
continue; continue;
} }
@ -66,18 +81,12 @@ export function buildLogger(write: (text: string) => void) {
text = text.replaceAll(item, "*".repeat(item.length)); text = text.replaceAll(item, "*".repeat(item.length));
} }
} }
write(text); text = `[${formatDateIntl()}] [${level.toUpperCase()}] - ${text} \n`;
}, this.customWriter(text);
}); }
return logger; // @ts-ignore
} this.logger[level](...args);
}
export type ILogger = Logger;
export class PipelineLogger implements ILogger {
callStackLinesToSkip: number = 1;
readonly category: string = "pipeline";
level: Level | string = "info";
_log(level: Level, data: any): void {} _log(level: Level, data: any): void {}
@ -87,18 +96,39 @@ export class PipelineLogger implements ILogger {
debug(message: any, ...args: any[]): void { debug(message: any, ...args: any[]): void {
if (this.isDebugEnabled()) { if (this.isDebugEnabled()) {
this._doLog("debug", message, ...args);
} }
} }
error(message: any, ...args: any[]): void {} error(message: any, ...args: any[]): void {
if (this.isErrorEnabled()) {
this._doLog("error", message, ...args);
}
}
fatal(message: any, ...args: any[]): void {} fatal(message: any, ...args: any[]): void {
if (this.isFatalEnabled()) {
this._doLog("fatal", message, ...args);
}
}
info(message: any, ...args: any[]): void {} info(message: any, ...args: any[]): void {
if (this.isInfoEnabled()) {
this._doLog("info", message, ...args);
}
}
trace(message: any, ...args: any[]): void {} trace(message: any, ...args: any[]): void {
if (this.isTraceEnabled()) {
this._doLog("trace", message, ...args);
}
}
warn(message: any, ...args: any[]): void {} warn(message: any, ...args: any[]): void {
if (this.isWarnEnabled()) {
this._doLog("warn", message, ...args);
}
}
isDebugEnabled(): boolean { isDebugEnabled(): boolean {
return logger.isDebugEnabled(); return logger.isDebugEnabled();

View File

@ -758,7 +758,7 @@ export default defineComponent({
//stepid //stepid
let hasError = false; let hasError = false;
let errorMessages = []; let errorMessages: any = [];
let errorIndex = 1; let errorIndex = 1;
eachSteps(pp, (step: any, task: any, stage: any) => { eachSteps(pp, (step: any, task: any, stage: any) => {
if (step.disabled !== true) { if (step.disabled !== true) {