Build NapCat Artifacts / Windows Loader Test (push) Canceled after 0s
Build NapCat Artifacts / Type Check & Test (push) Canceled after 0s
Build NapCat Artifacts / Build NapCat.Framework (push) Canceled after 0s
Build NapCat Artifacts / Build NapCat.Shell (push) Canceled after 0s
107 lines
3.0 KiB
Plaintext
107 lines
3.0 KiB
Plaintext
"use strict";
|
|
const format = require("date-manip/dist/format");
|
|
const isWhatType = require("is-what-type");
|
|
const compilePattern = require("./compilePattern.js");
|
|
const formatMessage = require("./formatMessage.js");
|
|
const pad = require("./pad.js");
|
|
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 (isWhatType.isFunction(createConverter)) {
|
|
const converter = createConverter(
|
|
specifier,
|
|
alignLeft,
|
|
minWidth,
|
|
maxLength,
|
|
format2
|
|
);
|
|
if (isWhatType.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("");
|
|
}
|
|
}
|
|
module.exports = PatternLayout;
|