使用log4js搭建多日志文件系统遇控制台自动关闭无法查看错误
解决log4js多日志文件配置问题及控制台自动关闭的排查方法
首先,咱们先搞定最紧急的控制台自动关闭看不到错误的问题:
- 别双击运行你的Node.js脚本!打开CMD或者PowerShell,导航到脚本所在文件夹,用
node your-script-name.js命令启动,这样控制台会一直保持打开,所有错误信息都会清晰显示出来。 - 要是怕程序跑完立刻退出,也可以在脚本末尾加段代码让它挂一会儿,方便你看日志:
// 等待用户输入再退出 process.stdout.write('按任意键退出...'); process.stdin.on('data', () => process.exit()); - 另外,临时给日志器加上控制台输出,哪怕文件配置有问题,也能在控制台看到错误提示。
接下来看你的log4js配置里的核心错误:
你给logs appender设置了type: ['file','console'],这不符合log4js的规则——每个appender只能对应一种类型(要么是file,要么是console)。如果想同时输出到文件和控制台,得分别创建两个独立的appender,然后在category里把它们都包含进去。
还有个容易踩坑的细节:log4js不会自动创建logs目录,如果这个目录不存在,写入文件日志会直接报错。所以最好在配置前先手动创建目录,或者在脚本里加一段自动创建的代码:
const fs = require('fs'); const logDir = path.join(__dirname, 'logs'); if (!fs.existsSync(logDir)) { fs.mkdirSync(logDir, { recursive: true }); // recursive: true会自动创建嵌套的父目录 }
下面是修正后的完整配置示例:
const log4js = require('log4js'); const path = require('path'); const fs = require('fs'); // 确保日志目录存在 const logDir = path.join(__dirname, 'logs'); if (!fs.existsSync(logDir)) { fs.mkdirSync(logDir, { recursive: true }); } log4js.configure({ appenders: { // 控制台输出的appender consoleOut: { type: 'console' }, // 普通日志文件 mainLogs: { type: 'file', filename: path.join(logDir, 'bot_logs.log') }, // 异常日志文件 exceptionLogs: { type: 'file', filename: path.join(logDir, 'bot_exceptions.log') }, // 警告日志文件 warningLogs: { type: 'file', filename: path.join(logDir, 'bot_warnings.log') }, // Promise拒绝日志文件 rejectionLogs: { type: 'file', filename: path.join(logDir, 'bot_rejections.log') } }, categories: { // 默认日志器:同时输出到控制台和主日志文件 default: { appenders: ['consoleOut', 'mainLogs'], level: 'debug' }, // 异常日志器:输出到控制台和异常文件 exception: { appenders: ['consoleOut', 'exceptionLogs'], level: 'error' }, // 警告日志器:输出到控制台和警告文件 warning: { appenders: ['consoleOut', 'warningLogs'], level: 'warn' }, // 拒绝日志器:输出到控制台和拒绝文件 rejection: { appenders: ['consoleOut', 'rejectionLogs'], level: 'fatal' } }, // 自动捕获未处理的异常和Promise拒绝,自动对应到你的日志器 exceptionHandlers: [log4js.getLogger('exception')], rejectionHandlers: [log4js.getLogger('rejection')] }); // 获取日志器 const logger = log4js.getLogger(); // 使用default分类 const excep = log4js.getLogger('exception'); const warni = log4js.getLogger('warning'); const rejec = log4js.getLogger('rejection'); // 测试调用 logger.debug('这是一条调试信息'); logger.info('这是一条普通信息'); excep.error('这是一条异常错误信息'); warni.warn('这是一条警告信息'); rejec.fatal('这是一条致命错误信息');
最后再分享几个排查小技巧:
- 先简化配置,只保留console appender,确认log4js能正常输出,再逐步添加file appender。
- 检查日志文件路径是否正确,用
console.log(path.join(__dirname, 'logs/bot_logs.log'))打印出来看看路径是否符合预期。 - 如果用PM2运行,记得把配置里的
pm2设为true,否则日志可能会出现异常。
内容的提问来源于stack exchange,提问作者Zorono
相关产品推荐
相关产品推荐

