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

Linux与MacOS下TypeScript无法捕获Cypress控制台日志问题

Cypress控制台日志跨平台捕获问题

需求与执行代码

我通过以下代码执行Cypress测试用例,期望捕获Cypress生成的控制台日志:

注:result包含测试数据,但我明确需要捕获控制台日志。

consoleLogger.bind({ 'xyz': 'abc' })
const result = await cypress.run({
    spec: '/../test.cy.js',
    project: ProjectConfiguration.projectDir,
})
consoleLogger.unbind()

日志捕获实现代码

我使用如下代码实现日志捕获,该代码在Windows系统可正常运行:

class ConsoleLogger {
  private originalStdoutWrite: any
  private originalStderrWrite: any
  private logger: any

  constructor(testLogger: any) {
    this.logger = testLogger
    this.originalStdoutWrite = process.stdout.write.bind(process.stdout)
    this.originalStderrWrite = process.stderr.write.bind(process.stderr)
  }

  public bind(extra: {}) {
    // Override stdout to capture Cypress console logs
    process.stdout.write = (
      chunk: string | Uint8Array,
      ...args: any[]
    ): boolean => {
      const output = chunk.toString().trim()
      if (output) {
        try {
          this.logger.info(output, {
            ...extra,
            source: 'stdout',
          })
        } catch (err) {
          this.logger.error(err)
        }
      }
      return true
    }

    process.stderr.write = (
      chunk: string | Uint8Array,
      ...args: any[]
    ): boolean => {
      const output = chunk.toString().trim()
      if (output) {
        try {
          this.logger.error(output, {
            ...extra,
            source: 'stderr',
          })
        } catch (err) {
          this.logger.error(err)
        }
      }
      return true
    }
  }

  public unbind() {
    process.stdout.write = this.originalStdoutWrite
    process.stderr.write = this.originalStderrWrite
  }
}

export default ConsoleLogger

Winston日志写入配置

同时我使用Winston将控制台日志写入文件,配置代码如下:

import { createLogger, format, transports } from 'winston'
import ProjectConfiguration from '../projectConfiguration'

const { combine, timestamp } = format

const TestLoggerFactory = () => {
  const logger = createLogger({
    format: combine(timestamp(), format.json()),
    transports: [
      new transports.File({
        filename: ProjectConfiguration.getLogFilePath(), // Specify log file location
        options: { flags: 'w' },
      }),
    ],
  })
  return logger
}
export default TestLoggerFactory

问题现象

  • 该日志捕获代码在Windows系统正常工作,但在Linux和MacOS中存在异常
  • Linux和MacOS下日志仅打印在控制台,未写入指定文件
  • Linux和MacOS下仅错误日志(stderr)可写入文件,*标准输出(stdout)*日志无法正常捕获写入

内容的提问来源于stack exchange,提问作者Vicky Thakor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:26:12