背景
在调试数据处理脚本时发现单纯的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 不在支持的范围内,请检查输入参数是否正确