108 lines
2.9 KiB
Plaintext
108 lines
2.9 KiB
Plaintext
import format from "date-manip/dist/format.mjs";
|
|
import { isFunction } from "is-what-type";
|
|
import compilePattern from "./compilePattern.mjs";
|
|
import formatMessage from "./formatMessage.mjs";
|
|
import pad from "./pad.mjs";
|
|
function literalConverter(text) {
|
|
return () => text;
|
|
}
|
|
function dateConverter(dateFormat = "ISO") {
|
|
return (event) => {
|
|
return format(event.timestamp, dateFormat);
|
|
};
|
|
}
|
|
function levelConverter(minWidth = 0, alignLeft = true) {
|
|
return (event) => {
|
|
return pad(event.levelName, minWidth, alignLeft);
|
|
};
|
|
}
|
|
function loggerConverter(minWidth = 0, alignLeft = true) {
|
|
return (event) => {
|
|
const { loggerName } = event;
|
|
return pad(loggerName, minWidth, alignLeft);
|
|
};
|
|
}
|
|
function messageConverter(minWidth = 0, maxLength = 0, alignLeft = true) {
|
|
return (event) => {
|
|
return formatMessage(event.message, (msg) => {
|
|
if (maxLength > 0 && msg.length > maxLength) {
|
|
msg = `${msg.substring(0, maxLength)}...`;
|
|
}
|
|
return pad(msg, minWidth, alignLeft);
|
|
});
|
|
};
|
|
}
|
|
function threadConverter() {
|
|
return () => {
|
|
return `PID:${process.pid}`;
|
|
};
|
|
}
|
|
function mdcConverter(key, minWidth = 0, alignLeft = true) {
|
|
return (event) => {
|
|
const value = event.context[key] || "";
|
|
return pad(String(value), minWidth, alignLeft);
|
|
};
|
|
}
|
|
class PatternLayout {
|
|
/**
|
|
* Constructor (构造函数)
|
|
* @param pattern Pattern string (模版字符串)
|
|
*/
|
|
constructor(pattern = "[%d{YYYY-MM-DD HH:mm:ss.SSSZ}] %p %c - %m", createConverter) {
|
|
this.converters = compilePattern(
|
|
pattern,
|
|
(specifier, alignLeft, minWidth, maxLength, format2) => {
|
|
if (isFunction(createConverter)) {
|
|
const converter = createConverter(
|
|
specifier,
|
|
alignLeft,
|
|
minWidth,
|
|
maxLength,
|
|
format2
|
|
);
|
|
if (isFunction(converter)) {
|
|
return converter;
|
|
}
|
|
}
|
|
switch (specifier.toLowerCase()) {
|
|
case "%":
|
|
return literalConverter("%");
|
|
case "d":
|
|
return dateConverter(format2);
|
|
case "p":
|
|
return levelConverter(minWidth, alignLeft);
|
|
case "c":
|
|
return loggerConverter(minWidth, alignLeft);
|
|
case "m":
|
|
return messageConverter(minWidth, maxLength, alignLeft);
|
|
case "t":
|
|
return threadConverter();
|
|
case "x":
|
|
return mdcConverter(format2 || "", minWidth, alignLeft);
|
|
default:
|
|
return literalConverter(`%${specifier}`);
|
|
}
|
|
},
|
|
literalConverter
|
|
);
|
|
}
|
|
/**
|
|
* Add a converter (添加转换器)
|
|
* @param fn Converter function (转换器函数)
|
|
*/
|
|
use(fn) {
|
|
this.converters.push(fn);
|
|
return this;
|
|
}
|
|
/**
|
|
* Format a log event (格式化日志事件)
|
|
* @param event Log event (日志事件)
|
|
*/
|
|
format(event) {
|
|
return this.converters.map((converter) => converter(event)).join("");
|
|
}
|
|
}
|
|
export {
|
|
PatternLayout as default
|
|
};
|