mirror of https://github.com/certd/certd
fix: 修复批量流水线执行时日志显示错乱的问题
parent
8a0c2b9b13
commit
4372adc703
|
@ -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();
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue