node脚本添加通用日志记录方法

132 阅读1分钟

背景

在调试数据处理脚本时发现单纯的console.log()日志不是很准确的定位问题所在,依赖于日志信息的完善程度,需要一个新的日志记录方式,同时满足文件记录、控制台打印,并且能输出调用者的文件名称、代码行号。

实现

选择插件

"winston": "^3.16.0",
"winston-daily-rotate-file": "^5.0.0"

安装依赖

npm install winston
npm install winston-daily-rotate-file

代码实现

const {createLogger, transports, format} = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');

let LOG_PATH = require('../package.json').config.LOG_PATH || "/home/roof/rooflogs";

/**
 * 获取调用者文件的路径、代码行数、列数等数据
 */
const getCallerFile = () => {
    const originalPrepareStackTrace = Error.prepareStackTrace;
    Error.prepareStackTrace = (_, stack) => stack;
    const err = new Error();
    Error.captureStackTrace(err, getCallerFile);
    const stack = err.stack;
    Error.prepareStackTrace = originalPrepareStackTrace;
    const caller = stack[1];
    const fileName = caller.getFileName().replace(process.cwd(), '.');
    const line = caller.getLineNumber();
    const column = caller.getColumnNumber();

    return `[${fileName}:${line}:${column}]`;
};

class Logger {
    log = createLogger({
        format: format.combine(
            format.timestamp({format: 'YYYY-MM-DD HH:mm:ss'}),
            format.printf(({level, message, timestamp}) => {
                return `${timestamp}-[${level}]-${message}`;
            })
        ),
        transports: [
            new transports.Console(),
            new DailyRotateFile({
                filename: LOG_PATH + '/cobase_mpp_data-%DATE%.log',
                datePattern: 'YYYY-MM-DD',
                zippedArchive: true,
                maxSize: '200m', // 每个文件最大20MB
                maxFiles: '7d' // 最多保留14天的日志
            })
        ]
    });

    info(msg) {
        this.log.info(getCallerFile() + " :" + msg)
    }

    error(msg) {
        this.log.error(getCallerFile() + " :" + msg)
    }
}

module.exports = Logger

引用日志

const Logger = require('./lib/logger');
const logger = new Logger()

logger.error("当前地市:" + company_name + " 不在支持的范围内,请检查输入参数是否正确")
logger.info("当前处理地市:" + company_name + "(" + company_ids + ")");

日志效果

2024-11-06 14:47:21-[info]-[.\collect_oms_data.js:11:8] :当前处理地市:laiwu(25)
2024-11-06 14:47:51-[error]-[.\collect_oms_data.js:8:12] :当前地市:zibo 不在支持的范围内,请检查输入参数是否正确