手把手教你用ts实现一个logger

1,074 阅读5分钟

介绍什么是@myorg/logger以及其作用

@myorg/logger是一个Node.js日志库,旨在提供一个轻量级、易于使用的日志解决方案,用于记录应用程序在运行时的事件和状态。它可以记录不同级别的日志信息,例如debug、info、warn和error。@myorg/logger通过向控制台打印彩色输出和使用emoji表情符号增强输出来使日志更具可读性和易用性。

该库可用于各种Node.js项目,包括CLI应用程序、Web应用程序和API服务等。日志可以帮助开发人员更好地了解应用程序的运行情况,便于调试和优化代码,同时也可用于监控和诊断应用程序在生产环境中的运行情况。

在项目中使用@myorg/logger非常简单,只需安装该库并将其实例化,即可开始记录日志。该库还提供了许多可配置的选项,例如日志级别、输出格式和emoji表情符号等,可以根据具体需求进行定制。

总之,@myorg/logger是一个高效、易用和可定制的Node.js日志库,可帮助开发人员更好地了解应用程序的运行情况,并提供有价值的信息和帮助进行问题排查和优化。

为什么要使用@myorg/logger,它有哪些优势

@myorg/logger 有以下几个优势:

  • 易于使用:使用 @myorg/logger 可以很方便地在应用程序中输出日志,不需要复杂的配置。
  • 可定制性强:可以根据自己的需求,通过传递配置项来定制日志输出格式、日志级别等。
  • 功能齐全:支持多种日志级别,如 DEBUG、INFO、WARN 和 ERROR,还可以自定义日志级别。同时支持输出带有 emoji 的日志信息,增加了代码的可读性。
  • 易于扩展:@myorg/logger 是一个独立的包,可以轻松地在不同的项目中复用,而且可以方便地与其他第三方库进行集成。
  • 健壮性:@myorg/logger 使用了一些优秀的第三方库,如 node-emoji 等,保证了日志输出的稳定性和可靠性。

@myorg/logger的设计和实现

  • LogLevel枚举类型和LoggerOptions接口
  • Logger类及其成员函数
  • createLogMessage方法和log、debug、info等函数的实现

LogLevel枚举类型和LoggerOptions接口

enum LogLevel {
  DEBUG,
  INFO,
  WARN,
  ERROR,
}

interface LoggerOptions {
  level?: LogLevel;
}

Logger类及其成员函数

Logger类是一个用于输出日志的工具类,通过它可以方便地输出不同级别的日志信息,包括logdebuginfo等级别。其中,log方法用于输出普通的日志信息,debug方法用于输出调试信息,info方法用于输出一些提示性的信息。同时,Logger类还提供了一些设置,如设置日志级别、设置是否开启调试模式等。

Logger类的实现使用了一些现代化的JavaScript技术,如使用lodash-es库来按需引入函数,使用node-emoji库来输出日志信息中的表情符号等。在实现上,Logger类还充分利用了面向对象的思想,通过类的封装实现了对日志输出的控制,使得使用起来更加方便和灵活。

createLogMessage方法和log、debug、info等函数的实现

class Logger {
  firstLog = true;
  /**
   * @type {CodeGenConfig}
   */
  config;

  private level: LogLevel;

  constructor(options?: LoggerOptions) {
    this.config = options;
    this.level = options?.level ?? LogLevel.INFO;
  }

  createLogMessage = ({ type, emojiName, messages, raw, level }: ILogMessage) => {
    if (this.config.silent) return;

    const emoji = emojify(emojiName);

    if (this.firstLog) {
      this.firstLog = false;
      if (level && level >= this.level) {
        console.log(`[${LogLevel[level]}] ${messages}`);
      }
      this.log(
        `@myorg(${this.config.version}),${
          process.env.npm_config_user_agent || `nodejs(${process.version})`
        }`,
      );
    }

    if (raw) {
      console.log(...raw);
      return;
    }

    console[type](
      emoji,
      ' ',
      ...map(messages, (message) =>
        startsWith(message, '\n') ? `\n${emoji}   ${message.replace(/\n/, '')}` : message,
      ),
    );
  };

  /**
   *
   * @param messages {any[]}
   */
  log = (...messages) =>
    this.createLogMessage({
      type: 'log',
      emojiName: ':sparkles:',
      messages,
    });

  /**
   *
   * @param messages {any[]}
   * @return {void}
   */
  event = (...messages) =>
    this.createLogMessage({
      type: 'log',
      emojiName: ':comet: ',
      messages,
    });

  /**
   *
   * @param messages {any[]}
   * @return {void}
   */
  success = (...messages) =>
    this.createLogMessage({
      type: 'log',
      emojiName: ':white_check_mark:',
      messages,
    });

  /**
   *
   * @param messages {any[]}
   * @return {void}
   */
  warn = (...messages) =>
    this.createLogMessage({
      type: 'warn',
      emojiName: ':warning: ',
      messages,
    });

  /**
   *
   * @param messages {any[]}
   * @return {void}
   */
  error = (...messages) =>
    this.createLogMessage({
      type: 'error',
      emojiName: ':exclamation:',
      messages,
      level: LogLevel.ERROR,
    });

  /**
   *
   * @param messages {any[]}
   * @return {void}
   */
  debug = (...messages) => {
    if (!this.config.debug) return;

    this.createLogMessage({
      type: 'debug',
      emojiName: '',
      raw: messages,
      level: LogLevel.DEBUG,
    });
  };

  info = (...messages) =>
    this.createLogMessage({
      type: 'info',
      emojiName: ':exclamation:',
      messages,
      level: LogLevel.INFO,
    });

}

export default Logger;

如何在项目中使用@myorg/logger

  • 安装@myorg/logger包
  • 创建Logger实例并使用log、debug、info等函数输出日志

在项目中使用 @myorg/logger,需要先安装 @myorg/logger 包。可以使用 npm 或者 yarn 安装,具体命令如下:

使用 npm 安装:

npm install @myorg/logger --save

使用 yarn 安装:

yarn add @myorg/logger

创建实例

安装完成后,在需要输出日志的地方引入 Logger 类并创建 Logger 实例,然后使用 log、debug、info 等函数输出日志。具体使用方式如下:

import Logger from '@myorg/logger';

// 创建 Logger 实例
const logger = new Logger();

// 输出普通日志
logger.log('This is a log message.');

// 输出调试日志
logger.debug('This is a debug message.');

// 输出信息日志
logger.info('This is an info message.');

在创建 Logger 实例时,还可以传入配置对象来配置 Logger 的行为。例如,可以通过传入 level 属性来设置输出日志的级别,只有高于该级别的日志才会被输出。可以通过传入 debug 属性来控制是否输出调试日志,通过传入 silent 属性来控制是否禁止输出所有日志。具体使用方式如下:

import Logger, { LogLevel } from '@myorg/logger';

// 创建 Logger 实例,并设置输出日志级别为 WARN,禁止输出调试日志
const logger = new Logger({ level: LogLevel.WARN, debug: false });

// 输出普通日志
logger.log('This is a log message.'); // 不会输出

// 输出调试日志
logger.debug('This is a debug message.'); // 不会输出

// 输出信息日志
logger.info('This is an info message.'); // 不会输出

以上就是如何在项目中使用 @myorg/logger 的详细步骤。

如何在测试中使用@myorg/logger

  • Jest测试框架介绍
  • 如何安装和配置Jest
  • 如何编写测试用例测试@myorg/logger的功能

Jest是一个流行的JavaScript测试框架,用于编写测试用例并执行测试。在测试中使用@myorg/logger需要使用Jest框架来编写测试用例并执行测试。

Jest测试框架介绍

Jest是一个由Facebook开发的流行的JavaScript测试框架,它具有以下优点:

  • 简单易用:使用Jest可以快速编写测试用例并执行测试。
  • 快速:Jest具有优秀的性能和快速的测试执行速度。
  • 自动化:Jest具有自动化的测试执行功能,可以通过配置自动化执行测试。

如何安装和配置Jest

要使用Jest进行测试,需要先安装Jest并配置测试环境。

1. 安装Jest

可以使用npm包管理器安装Jest:

npm install jest --save-dev

2. 配置测试环境

在项目根目录下创建一个jest.config.js文件,并添加以下内容:

module.exports = {
  // Jest配置选项
  preset: 'ts-jest',
  testEnvironment: 'node',
  testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$',
  moduleNameMapper: {
    '^lodash-es$': 'lodash',
  },

  globals: {
    'ts-jest': {
      useESM: true,
    },
  },
  moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
  transform: {
    "^.+\\.(ts|tsx)$": "ts-jest",
    "^.+\\.(js)$": "babel-jest",
  },
};

在Jest配置选项中,可以配置需要测试的文件、测试用例匹配规则、测试报告生成等。

如何编写测试用例测试@myorg/logger的功能

在项目中使用@myorg/logger时,需要编写测试用例来测试其功能是否正确。可以使用Jest框架来编写测试用例。

以下是一个使用Jest框架测试@myorg/logger的示例:

import Logger from '@myorg/logger';

describe('Logger', () => {
  test('log', () => {
    const logger = new Logger();
    const consoleSpy = jest.spyOn(console, 'log').mockImplementation();

    logger.log('Hello, world!');

    expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Hello, world!'));
    consoleSpy.mockRestore();
  });

  test('debug', () => {
    const logger = new Logger({ debug: true });
    const consoleSpy = jest.spyOn(console, 'debug').mockImplementation();

    logger.debug('Debug message');

    expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Debug message'));
    consoleSpy.mockRestore();
  });

  test('info', () => {
    const logger = new Logger();
    const consoleSpy = jest.spyOn(console, 'info').mockImplementation();

    logger.info('Info message');

    expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Info message'));
    consoleSpy.mockRestore();
  });
});

在这个示例中,我们使用了Jest的describetest函数来编写测试用例。describe函数用于定义测试套件,test函数用于定义测试用例。

在每个测试用例中,我们创建了一个Logger实例并调用其相应的函数。使用Jest的jest.spyOn函数来创建一个console的mock实例,以便可以捕获log输出。然后使用expect语句来测试输出结果是否符合预期。

使用Jest可以方便地测试@myorg/logger的功能是否正确,确保代码的质量和可靠性。

总结

  1. 首先我们了解了日志记录的概念,以及为什么需要进行日志记录,还介绍了常见的日志级别。
  2. 然后我们讨论了日志记录的实现方式,以及如何使用log4j来实现日志记录。
  3. 接下来我们介绍了@myorg/logger这个npm包,它是一个用TypeScript编写的日志记录工具库,具有易用性和高可定制性的特点。
  4. 我们了解了@myorg/logger的安装和使用方法,包括创建Logger实例并使用log、debug、info等函数输出日志。
  5. 最后,我们介绍了如何在测试中使用@myorg/logger,包括Jest测试框架的介绍、安装和配置,以及如何编写测试用例测试@myorg/logger的功能。