"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;