You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Playwright+Winston Logger:如何实现每次执行前清空日志文件?

解决Winston Logger在Playwright自动化中只保留最后一个脚本日志的问题

问题根源

你的代码存在两个关键问题:

  • 拼写错误:level: "infor" 应为 level: "info"
  • Winston File transport的flags配置写法错误:该参数是transport的顶层配置项,不需要嵌套在options中;直接使用flags: 'w'会导致每个脚本实例化Logger时都清空文件,最终仅保留最后一个脚本的日志。

正确解决方案

要实现「每次测试执行前清空日志文件,所有脚本的日志都追加到这个清空后的文件」,可以采用单例模式+初始化时清空文件的方式:

  1. 确保整个测试过程中只有一个Logger实例,避免重复清空文件
  2. 在Logger初始化前,先清空目标日志文件
  3. 修正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直接使用追加模式:

  1. 在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);
    }
};
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:13:12