nodejs 封装方法将打印日志输出到指定文件
const path = require("node:path");
const fs = require("fs"); // node 内置模块
const util = require("util"); // node 内置模块
const {timestampToDate} = require("./dateFormat"); // 时间方法,返回指定格式的时间let appLogFile = path.join(__dirname, '../../app.log'); // 日志文件对当前文件的路径
if (!fs.existsSync(appLogFile)) {// 检测如果没有文件则创建fs.writeFileSync(appLogFile, '', 'utf8');
}// 创建可写流
const logFile = fs.createWriteStream(appLogFile, {flags: 'a'});// 保留原始的 logger.log
const originalConsoleLog = console.log;let log = function (...args) {try {// 获取调用栈信息const stack = new Error().stack.split('\n');// 通常第三个元素是调用log的地方(第一个是Error,第二个是log函数本身)const callerLine = stack[2] || '';// 提取文件路径和行号const match = callerLine.match(/\((.+):(\d+):(\d+)\)$/);let callerInfo = '';if (match) {const filePath = match[1];const lineNumber = match[2];// 只保留文件路径的最后两部分以减少长度const pathParts = filePath.split(path.sep);callerInfo = `[${pathParts.slice(-2).join('/')}:${lineNumber}] `;}// 格式化消息const message = args.map(arg => typeof arg === 'object' ? util.inspect(arg, {depth: null}) : arg).join('');// 写入文件,带时间和调用信息logFile.write(`[${timestampToDate(new Date(), "YYYY-MM-DD HH:mm:ss:SSS")}] ${callerInfo}${message}\n`);} catch (e) {originalConsoleLog('Error writing log file', e);}// 保持控制台输出originalConsoleLog.apply(logger, args);
}let logger = {log
}module.exports = logger;
输出的日志格式: