关键词搜索

源码搜索 ×
×

日志库 winston 的学习笔记 - 创建一个使用 winston 的 Node.js 应用

发布2021-10-21浏览510次

详情内容

winston 被设计为一个简单且通用的日志库,支持多种传输。 传输本质上是日志的存储设备。 每个 winston 记录器都可以在不同级别配置多个存储渠道。例如,人们可能希望将错误日志存储在持久的远程位置(如数据库),但所有调试日志都输出到控制台或本地文件。

使用 winston 的推荐方法是创建您自己的记录器。 最简单的方法是使用 winston.createLogger:

const winston = require('winston');
 
const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  defaultMeta: { service: 'user-service' },
  transports: [
    //
    // - Write all logs with level `error` and below to `error.log`
    // - Write all logs with level `info` and below to `combined.log`
    //
    new winston.transports.File({ filename: 'error.log', level: 'error' }),
    new winston.transports.File({ filename: 'combined.log' }),
  ],
});
 
//
// If we're not in production then log to the `console` with the format:
// `${info.level}: ${info.message} JSON.stringify({ ...rest }) `
//
if (process.env.NODE_ENV !== 'production') {
  logger.add(new winston.transports.Console({
    format: winston.format.simple(),
  }));
}

    winston 的日志等级

    const levels = { 
      error: 0,
      warn: 1,
      info: 2,
      http: 3,
      verbose: 4,
      debug: 5,
      silly: 6
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    如何创建 logger

    const logger = winston.createLogger({
      transports: [
        new winston.transports.Console(),
        new winston.transports.File({ filename: 'combined.log' })
      ]
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    即使 logger 实例创建之后,也能容易地删除或者增添新的 transport:

    const files = new winston.transports.File({ filename: 'combined.log' });
    const console = new winston.transports.Console();
     
    logger
      .clear()          // Remove all transports
      .add(console)     // Add console transport
      .add(files)       // Add file transport
      .remove(console); // Remove console transport
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    也能使用 logger 的 configure 方法,重新配置新的 transport:

    const logger = winston.createLogger({
      level: 'info',
      transports: [
        new winston.transports.Console(),
        new winston.transports.File({ filename: 'combined.log' })
      ]
    });
     
    //
    // Replaces the previous transports with those in the
    // new configuration wholesale.
    //
    const DailyRotateFile = require('winston-daily-rotate-file');
    logger.configure({
      level: 'verbose',
      transports: [
        new DailyRotateFile(opts)
      ]
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在 winston 中,Logger 和 Transport 实例都被视为接受 info 对象的 objectMode 流。

    提供给给定格式的 info 参数表示单个日志消息。 对象本身是可变的。 每个信息必须至少具有 level 和 message 属性:

    const info = {
      level: 'info',                 // Level of the logging message  
      message: 'Hey! Log something?' // Descriptive message being logged.
    };
    
    • 1
    • 2
    • 3
    • 4

    除了级别和消息之外的属性被视为“元属性”:

    const { level, message, ...meta } = info;
    
    • 1

    我们来动手写一个实际的例子。

    主程序:

    // @ts-nocheck
    var express = require('express');
    var app = express();
    var DEFAULTPORT = 3003;
    var port = process.env.PORT || DEFAULTPORT;
    var winstonTest = require("./winstonTest");
    
    app.get('/', function(_req, res){
       res.send("Hello world");
       winstonTest.logMessage('234');
    });
    
    app.listen(port, function(){
         console.log("App listens on port: " + port);
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    winstonTest 的实现:

    const winston = require('winston');
     
    const logger = winston.createLogger({
      level: 'info',
      format: winston.format.json(),
      defaultMeta: { service: 'user-service' },
      transports: [
        //
        // - Write all logs with level `error` and below to `error.log`
        // - Write all logs with level `info` and below to `combined.log`
        //
        new winston.transports.File({ filename: 'data/error.log', level: 'error' }),
        new winston.transports.File({ filename: 'data/combined.log' }),
      ]
    });
    
    if (process.env.NODE_ENV !== 'production') {
        logger.add(new winston.transports.Console({
          format: winston.format.simple(),
        }));
    }
    
    console.log('Logger initialized successfully!');
    
    function log(content){
        logger.info('hello', { message: content });
    }
    
    module.exports = {
        logMessage: log
    };
    
      26
    • 27
    • 28
    • 29
    • 30
    • 31

    浏览器里输入如下 url:
    http://localhost:3003/
    在 combined.log 里生成了如下 log 文件:

    这就是 winston 最基本的使用方法。

    相关技术文章

    点击QQ咨询
    开通会员
    返回顶部
    ×
    微信扫码支付
    微信扫码支付
    确定支付下载
    请使用微信描二维码支付
    ×

    提示信息

    ×

    选择支付方式

    • 微信支付
    • 支付宝付款
    确定支付下载