导言

  • 本文已参加「开源摘星打算」,欢送正在浏览的你退出。流动链接:https://github.com/weopenproj...
  • 日志是追踪谬误和事件流的首选形式,对于serverless利用,云平台会为咱们收集日志,如果应用云平台部署能够跳过本文章。然而,如果你想部署到传统平台或者自定义收集日志请持续...
  • 在java开发咱们通常应用Log4j,在前端开发中咱们通常应用console.log和debugger。然而,生产环境中咱们为了控制台的洁净等起因咱们不可能console.log来追踪谬误。好在大前端有很多大牛开源了弱小好用的日志库,在node中做日志就像java中Log4j一样简略。
  • npm上风行日志库
    Winston :灵便的通用日志库
    Morgan : HTTP申请记录器中间件
    Pino:超快(非常低的开销),纯原生 JSON 记录器
    Loglevel:JavaScript最小的轻量级简略日志记录,malagu默认集成
    log4js :没有运行时依赖的日志框架

对于winston

winston是弱小灵便的node日志库之一,反对多种传输通道,自定义日志格局,日志切割,多实例等。winston反对六种级别{error: 0, warn: 1, info: 2, http: 3, verbose: 4, debug: 5, silly: 6},内置error/warn/info能够间接应用levels属性办法写入日志

logger.info("this is a info")logger.warn("this is a warn")logger.error("this is a error")

winston 默认有 4 种传输通道:
Console:打印到控制台
File:记录到文件中
Http:通过 http 传输
Stream:通过流传输

在malagu上应用,以File传输通道为例

malagu集成有winston组件,使得winston在malagu上应用更加简便

  • 1.引入依赖
    winston:日志库外围
    winston-daily-rotate-file:依据日期、大小限度轮换日志
    malagu-winston:malagu Winston组件

    yarn add winston,winston-daily-rotate-file,malagu-winston或者npm install winston --savenpm install winston-daily-rotate-file --savenpm install malagu-winston --save
  • 2.配置malagu-*.yml

    malagu:  logger:      winstonConfig:          level: 'info' //日志级别      dailyRotateConfig:          frequency: '24h'          filename: '%DATE%.log' //日志文件名          dirname: './logs' //日志文件目录
  • 3.重写WinstonConfig组件

    import { Component, LOGGER_CONFIG, Value } from "@malagu/core";import { WinstonConfig } from "malagu-winston";import { format, transports } from 'winston';import * as Transport from 'winston-transport';const DailyRotateFile = require('winston-daily-rotate-file');@Component(WinstonConfig)export class WinstonConfigImpl implements WinstonConfig{  transports: Transport[];  constructor(      // 引入malagu-*.yml中logger配置信息      @Value(LOGGER_CONFIG)      protected readonly config: any,      @Value('mode')      protected readonly mode: string    ) {      const { dailyRotateConfig } = this.config;      this.transports = [        new DailyRotateFile({          ...dailyRotateConfig,          // 定义日志格局          format: format.combine(            format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss,SSS'}),            format.simple(),            format.printf(msg =>              `${msg.timestamp} - ${msg.level}: ${msg.message}`            )          ),        })      ];      if (this.mode.includes('test')) {        // 测试环境减少输入控制台通道        this.transports.push(new transports.Console({          format: format.combine(            format.colorize(),            format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss,SSS'}),            format.simple(),            format.printf(msg =>              `${msg.timestamp} - ${msg.level}: ${msg.message}`            )          ),        }));      };    }  }
  • 4.在module.ts中援用WinstonConfigImpl
  • 5.在文件中应用

    import { Autowired, Logger } from "@malagu/core";import { Controller, Get, Json, Param } from "@malagu/mvc/lib/node";import { UserInfoService } from "../service";@Controller("user")export class UserController {  @Autowired(Logger)  protected logger: Logger;  @Autowired(UserInfoService)  protected userInfoService: UserInfoService;  @Get("/:userId")  @Json()  @Authenticated()  async getUserInfo(@Param("userId") userId: number){      this.logger.info(`获取用户信息:${userId}`)      const result = await this.userInfoService.getUserInfo(userId);           return result    }}

    日志输入地位

    日志内容

    2022-08-10 13:42:42,802 - info: GET /api/user/100000 ( 53092 on LAPTOP-EU7RHVSK) starting GET /api/user/100000 with traceId[08bfe038-47b4-4357-b8fe-a51b7618b8c2]2022-08-10 13:42:42,864 - info: GET /api/user/100000 ( 53092 on LAPTOP-EU7RHVSK) with 08bfe038-47b4-4357-b8fe-a51b7618b8c2 获取用户信息:1000002022-08-10 13:42:42,966 - info: GET /api/user/100000 ( 53092 on LAPTOP-EU7RHVSK) with 08bfe038-47b4-4357-b8fe-a51b7618b8c2 ending GET /api/user/100000 with traceId[08bfe038-47b4-4357-b8fe-a51b7618b8c2], cost 162ms

结语

winston在malagu中的利用还是比拟容易上手的,更多winston的应用请参考的乔珂力的《Node.js日志神器(winston)》

思考

  • 实现多级别日志输入在yml中怎么配置?
  • 如果不应用malagu-winston组件,该如何实现?

本文为学习类文章,如有谬误欢送斧正!思考内容欢送各位大佬答疑解惑。