@logtape/adaptor-winston
Version:
winston adapter for LogTape logging library
123 lines (121 loc) • 4.49 kB
JavaScript
import { configureSync } from "@logtape/logtape";
import winston from "winston";
import { inspect } from "node:util";
//#region mod.ts
const DEFAULT_LEVELS_MAP = {
"trace": "silly",
"debug": "debug",
"info": "info",
"warning": "warn",
"error": "error",
"fatal": "error"
};
/**
* Creates a LogTape sink that forwards log records to a winston logger.
*
* This function creates a sink function that can be used with LogTape's
* configuration system. The sink will format LogTape log records and
* forward them to the provided winston logger instance.
*
* @example Basic usage
* ```typescript
* import winston from "winston";
* import { configure } from "@logtape/logtape";
* import { getWinstonSink } from "@logtape/adaptor-winston";
*
* const winstonLogger = winston.createLogger({
* level: "info",
* format: winston.format.combine(
* winston.format.timestamp(),
* winston.format.json()
* ),
* transports: [new winston.transports.Console()]
* });
*
* await configure({
* sinks: {
* winston: getWinstonSink(winstonLogger)
* },
* loggers: [
* { category: ["myapp"], sinks: ["winston"] }
* ]
* });
* ```
*
* @example With custom options
* ```typescript
* const sink = getWinstonSink(winstonLogger, {
* category: {
* separator: ".",
* position: "start",
* decorator: "[]"
* },
* levelsMap: {
* "trace": "debug", // Map trace to debug instead of silly
* "debug": "debug",
* "info": "info",
* "warning": "warn",
* "error": "error",
* "fatal": "error"
* }
* });
* ```
*
* @param logger The winston logger instance to forward logs to. Must implement
* the Logger interface with error, warn, info, http, verbose,
* debug, and silly methods.
* @param options Configuration options for the sink behavior.
* @returns A sink function that can be used with LogTape's configure() function.
* @since 1.0.0
*/
function getWinstonSink(logger, options = {}) {
const { levelsMap = DEFAULT_LEVELS_MAP, valueFormatter = inspect } = options;
const categoryOptions = !options.category ? void 0 : typeof options.category === "object" ? options.category : {};
const category = categoryOptions == null ? void 0 : {
separator: categoryOptions.separator ?? "·",
position: categoryOptions.position ?? "start",
decorator: categoryOptions.decorator ?? ":"
};
return (record) => {
const level = levelsMap[record.level];
let message = "";
if (category?.position === "start" && record.category.length > 0) {
const joinedCategory = record.category.join(category.separator);
message += category.decorator === "[]" ? `[${joinedCategory}] ` : category.decorator === "()" ? `(${joinedCategory}) ` : category.decorator === "<>" ? `<${joinedCategory}> ` : category.decorator === "{}" ? `{${joinedCategory}} ` : category.decorator === ":" ? `${joinedCategory}: ` : category.decorator === "-" ? `${joinedCategory} - ` : category.decorator === "|" ? `${joinedCategory} | ` : category.decorator === "/" ? `${joinedCategory} / ` : `${joinedCategory} `;
}
for (let i = 0; i < record.message.length; i += 2) {
message += record.message[i];
if (i + 1 < record.message.length) message += valueFormatter(record.message[i + 1]);
}
if (category?.position === "end" && record.category.length > 0) {
const joinedCategory = record.category.join(category.separator);
message += category.decorator === "[]" ? ` [${joinedCategory}]` : category.decorator === "()" ? ` (${joinedCategory})` : category.decorator === "<>" ? ` <${joinedCategory}>` : category.decorator === "{}" ? ` {${joinedCategory}}` : category.decorator === ":" ? `: ${joinedCategory}` : category.decorator === "-" ? ` - ${joinedCategory}` : category.decorator === "|" ? ` | ${joinedCategory}` : category.decorator === "/" ? ` / ${joinedCategory}` : ` ${joinedCategory}`;
}
logger[level](message, record.properties);
};
}
function install(loggerOrOptions, options = {}) {
let logger;
let sinkOptions;
if (loggerOrOptions && ("error" in loggerOrOptions || "info" in loggerOrOptions)) {
logger = loggerOrOptions;
sinkOptions = options;
} else {
logger = winston;
sinkOptions = loggerOrOptions || {};
}
configureSync({
sinks: { winston: getWinstonSink(logger, sinkOptions) },
loggers: [{
category: ["logtape", "meta"],
sinks: ["winston"],
lowestLevel: "warning"
}, {
category: [],
sinks: ["winston"]
}]
});
}
//#endregion
export { getWinstonSink, install };
//# sourceMappingURL=mod.js.map