unjs / consola

🐨 Elegant Console Logger for Node.js and Browser

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Please expose the builtin reporter

liuweiGL opened this issue · comments

commented

Describe the feature

Before version 3.0, I could easily implement my own reporter by inheriting from BasicReporter or FancyReporter

Just like:

export type FileReporterProps = BasicReporterOptions & {
  outDir?: string
}

const DEFAULT_OUT_DIR = path.resolve(WORKSPACE, 'logs')

export class FileReporter extends BasicReporter {
  private outDir: string
  constructor({
    outDir = DEFAULT_OUT_DIR,
    dateFormat = 'YYYY-MM-DD HH:mm:ss.SSS',
    ...basicProps
  }: FileReporterProps = {}) {
    super({ dateFormat, ...basicProps })

    this.outDir = outDir
  }

  private getStream(name: string, flags = 'a+') {
    const file = path.resolve(this.outDir, `${snakeCase(name)}.log`)
    ensureExists(file)
    return createWriteStream(file, { flags, autoClose: true })
  }

  protected override formatLogObj(logObj: ConsolaReporterLogObject): string {
    return `[${this.formatDate(new Date())}] ${super.formatLogObj(logObj)}\n`
  }

  public override log(
    logObj: ConsolaReporterLogObject,
    { stderr }: ConsolaReporterArgs
  ): void {
    if ((logObj as any).persistent !== true) {
      return
    }

    const line = this.formatLogObj(logObj)
    const stream = this.getStream(logObj.tag || 'default')

    stream.write(line, err => {
      if (err) {
        stderr.write(err.message)
      }
    })
  }
}

or

const LEVEL_COLOR_MAP: Record<LogLevel, Chalk> = {
  0: chalk.bgRed,
  1: chalk.bgYellow,
  2: chalk.bgBlue,
  3: chalk.bgGreen,
  4: chalk.bgWhite,
  5: chalk.bgGray,
  [LogLevel.Silent]: chalk.bgGray,
  [LogLevel.Verbose]: chalk.bgGray
}

export class PrettyReporter extends FancyReporter {
  constructor(props: FancyReporterOptions) {
    super(props)
  }

  protected override formatType(logObj: ConsolaReporterLogObject) {
    return LEVEL_COLOR_MAP[logObj.level].black(` ${logObj.type.toUpperCase()} `)
  }

  protected override formatLogObj(
    logObj: ConsolaReporterLogObject,
    options?: any
  ) {
    (logObj as any).badge = true
    if (logObj.level === LogLevel.Success) {
      logObj.args[0] = chalk.green(logObj.args[0])
    } else if (logObj.level === LogLevel.Error) {
      logObj.args[0] = chalk.red(logObj.args[0])
    } else if (logObj.level === LogLevel.Warn) {
      logObj.args[0] = chalk.yellow(logObj.args[0])
    } else if (logObj.level === LogLevel.Log) {
      logObj.args[0] = chalk.blue(logObj.args[0])
    }
    // @ts-ignore
    return super.formatLogObj(logObj, options)
  }
}

Additional information

  • Would you be willing to help implement this feature?

Hi dear @liuweiGL. I undrestand that you need same customization possibilities as you had with v2 for fancy reporter. To make it easier for future improvements and internal refactors and also making customization easier, reporters are not exported anymore but you have the ability to use global consola options to modify their behavior (such as colors, stream, etc). What are the things you need to customize and not possible with v3?

commented

Just for the convenience of upgrading to v3

commented

I respect the author's design, and I plan to refactor it some time later

Hi dear @liuweiGL. I undrestand that you need same customization possibilities as you had with v2 for fancy reporter. To make it easier for future improvements and internal refactors and also making customization easier, reporters are not exported anymore but you have the ability to use global consola options to modify their behavior (such as colors, stream, etc). What are the things you need to customize and not possible with v3?

In my condition, I need to hide the full stack trace info in consola.warn, but seems it's inconvenient to override the formatStack method

The comment above is about #194.