logger.js 3.3 KB
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createLogger = void 0;
const debug_1 = require("debug");
const fs_1 = require("fs");
const os_1 = require("os");
const util_1 = require("util");
// 配置解析
const parseEnvBool = (envVar) => {
    const value = process.env[envVar] || '';
    return /^(yes|on|true|enable|enabled|1)$/i.test(value);
};
const getEnvValue = (envVar, defaultValue) => {
    return process.env[envVar] !== undefined ? process.env[envVar] : defaultValue;
};
// 默认配置
const DEFAULT_LOG_LEVELS = 'info:*,warn:*,error:*,debug:*,trace:*';
const WRITE_STREAM_OPTIONS = {
    flags: 'a',
    encoding: 'utf8',
    autoClose: true,
    emitClose: true
};
// 空日志函数
const noop = (..._args) => { };
const noopLogger = {
    error: noop,
    info: noop,
    warn: noop,
    debug: noop,
    trace: noop,
    close: noop
};
// 创建基础日志函数
const createBaseLoggers = (namespace) => {
    return {
        error: (0, debug_1.default)('error').extend(namespace),
        info: (0, debug_1.default)('info').extend(namespace),
        warn: (0, debug_1.default)('warn').extend(namespace),
        debug: (0, debug_1.default)('debug').extend(namespace),
        trace: (0, debug_1.default)('trace').extend(namespace)
    };
};
// 配置日志级别
const configureLogLevels = (logger, enabledLevels) => {
    Object.entries(logger).forEach(([level]) => {
        logger[level].enabled = enabledLevels.includes(level);
    });
};
// 创建文件日志写入器
const createFileLogger = (logFilePath, logger, enabledLevels) => {
    const writeStream = fs_1.default.createWriteStream(logFilePath, WRITE_STREAM_OPTIONS);
    const logToFile = (...args) => {
        writeStream.write(`${util_1.default.format(...args)}${os_1.default.EOL}`);
    };
    const logToConsoleAndFile = (...args) => {
        const message = util_1.default.format(...args);
        console.error(message);
        writeStream.write(`${message}${os_1.default.EOL}`);
    };
    // 配置日志输出方式
    Object.entries(logger).forEach(([level, logFn]) => {
        logFn.log = enabledLevels.includes(level) ? logToConsoleAndFile : logToFile;
    });
    // 返回完整logger对象
    return {
        ...logger,
        close: () => {
            writeStream.end();
            // 切换回仅控制台日志
            Object.values(logger).forEach((logFn) => {
                logFn.log = console.error;
            });
        }
    };
};
// 主导出函数
const createLogger = (options) => {
    // 处理参数重载
    const normalizedOptions = typeof options === 'string'
        ? { namespace: options }
        : options;
    const { namespace, logFilePath, enabledLevels = getEnvValue('DEBUG', DEFAULT_LOG_LEVELS), debugEnabled = parseEnvBool('XXL_JOB_DEBUG_LOG') } = normalizedOptions;
    if (!debugEnabled && !logFilePath) {
        return noopLogger;
    }
    const logger = createBaseLoggers(namespace);
    // 配置日志级别
    configureLogLevels(logger, enabledLevels);
    if (!logFilePath) {
        return {
            ...logger,
            close: noop
        };
    }
    // 文件日志配置
    return createFileLogger(logFilePath, logger, enabledLevels);
};
exports.createLogger = createLogger;
// 默认导出
exports.default = exports.createLogger;
//# sourceMappingURL=logger.js.map