Playwright+Winston Logger:如何实现每次执行前清空日志文件?
解决Winston Logger在Playwright自动化中只保留最后一个脚本日志的问题
问题根源
你的代码存在两个关键问题:
- 拼写错误:
level: "infor"应为level: "info" - Winston File transport的
flags配置写法错误:该参数是transport的顶层配置项,不需要嵌套在options中;直接使用flags: 'w'会导致每个脚本实例化Logger时都清空文件,最终仅保留最后一个脚本的日志。
正确解决方案
要实现「每次测试执行前清空日志文件,所有脚本的日志都追加到这个清空后的文件」,可以采用单例模式+初始化时清空文件的方式:
- 确保整个测试过程中只有一个Logger实例,避免重复清空文件
- 在Logger初始化前,先清空目标日志文件
- 修正Winston的配置参数
修正后的代码示例:
import winston from 'winston'; import fs from 'fs'; import path from 'path'; export default class Loggerutility { static instance; logger; constructor() { // 单例模式:已有实例则直接返回 if (Loggerutility.instance) { return Loggerutility.instance; } // 定义日志文件路径 const logFilePath = path.join(process.cwd(), 'logs/performance.log'); // 初始化前清空日志文件 try { fs.writeFileSync(logFilePath, ''); } catch (err) { console.error('清空日志文件失败:', err); } // 正确的Winston配置 const options = { level: "info", // 修正拼写错误 transports: [ new winston.transports.Console({ level: "info", }), new winston.transports.File({ filename: logFilePath, flags: 'a', // 清空后使用追加模式 level: 'info', maxsize: 5242880, maxFiles: 5, }) ] }; this.logger = winston.createLogger(options); Loggerutility.instance = this; } // 封装日志调用方法 info(message) { this.logger.info(message); } error(message) { this.logger.error(message); } }
方案说明
- 单例模式保证测试执行周期内仅存在一个Logger实例,避免多脚本重复初始化时清空文件
- 初始化时用
fs.writeFileSync清空日志文件,确保每次测试从全新日志开始 - 后续使用
flags: 'a'追加日志,所有脚本的日志都会写入同一个文件
另一种简化方案(无需单例)
如果你的测试框架支持全局前置操作(比如Playwright的global-setup.js),可以在全局初始化阶段清空日志文件,之后所有脚本的Logger直接使用追加模式:
- 在
global-setup.js中添加清空逻辑:
import fs from 'fs'; import path from 'path'; export default async () => { const logFilePath = path.join(process.cwd(), 'logs/performance.log'); try { fs.writeFileSync(logFilePath, ''); } catch (err) { console.error('清空日志文件失败:', err); } };
- 修改Loggerutility类,去掉单例和清空逻辑:
import winston from 'winston'; export default class Loggerutility { options = { level: "info", transports: [ new winston.transports.Console({ level: "info", }), new winston.transports.File({ filename: 'logs/performance.log', flags: 'a', level: 'info', maxsize: 5242880, maxFiles: 5, }) ] }; logger = winston.createLogger(this.options); }
内容的提问来源于stack exchange,提问作者Prasad
相关产品推荐
相关产品推荐

