Winston tutorial

Winston 教程展示了如何使用 Winston.js 库在 JavaScript 中进行日志记录,并在几个代码示例中演示了日志记录。

记录

Logging 是将信息写入日志文件的过程。日志文件包含有关操作系统、软件或通信中发生的各种事件的信息。

记录的目的

记录是为了以下目的:

  • 故障排除
  • 信息收集
  • 分析
  • 审计
  • 生成统计信息

日志记录不仅限于识别软件开发中的错误。它还用于检测安全事件、监控策略违规、在出现问题时提供信息、查找应用程序瓶颈或生成使用数据。

记录哪些事件

应记录的事件包括输入验证失败、身份验证和授权失败、应用程序错误、配置更改以及应用程序启动和关闭。

哪些事件不记录

不应记录的事件包括应用程序源代码、会话标识值、访问令牌、敏感的个人数据、密码、数据库连接字符串、加密密钥、银行账户和持卡人数据。

记录最佳实践

以下是进行日志记录的一些最佳实践:

  • 日志记录应该有意义。
  • 日志记录应该结构化并在不同级别完成。
  • 日志记录应该包含上下文。
  • 日志记录消息应该人类可以理解并且机器可以解析。
  • 日志记录应该是平衡的;它不应包括太少或太多的信息。
  • 日志记录应适应开发和生产。
  • 在更复杂的应用程序中记录应分为几个日志文件。
  • 李>

温斯顿

Winston 是一个流行的 JavaScript 日志库。它旨在简单和通用。每个 Winston 记录器都可以在不同级别配置多个传输。默认情况下,Winston 的日志使用 JSON 格式。

$ npm i winston

我们使用winston 工具安装npm 包。

温斯顿记录器

Winston 记录器将消息记录到日志文件中。 winston 记录器是使用 createLogger 函数创建的。此外,如果没有明确指定记录器,则有一个默认记录器。

createLogger 函数接受以下选项:

td>false

名称 默认值 描述
level info 要记录的日志消息的最大级别
levels winston.config.npm .levels 选择的关卡消息类型集合
format winston.format.json 日志消息的格式
transports no transports log messages logging destinations的集合
exitOnError true 处理的异常是否导致process.exit
silent 如果为true,则所有日志都被抑制

温斯顿运输

传输是我们日志的存储设备或输出机制。每个 Winstonlogger 都可以在不同级别配置多个传输。 Winston 带有三个核心传输:控制台、文件和 HTTP。必须创建传输并将其添加到记录器。

传输具有以下设置:

  • level – 设置要记录的消息级别。
  • filename – 这是要写入日志数据的文件名。
  • handleExceptions – 确定是否捕获和记录未处理的异常。
  • json – 以 JSON 格式记录日志数据。
  • maxsize – 在创建新文件之前设置日志文件的最大大小(以字节为单位)。
  • maxFiles – 限制超过日志文件大小时创建的文件数。
  • colorize – 为输出着色;在查看控制台日志时很有帮助。

Winston 日志级别

日志记录级别表示消息优先级并用整数表示。它们被指定用于运输。 Winston 带有预定义的日志记录级别集:npmsyslogcli

以下是默认的 npm 日志记录级别:

  • 0:错误
  • 1:警告
  • 2:信息
  • 3:http
  • 4:详细
  • 5:调试
  • 6:傻

任何特定级别或更高级别的内容都将被记录。例如,通过指定信息级别,将记录错误、警告或信息级别的任何内容。调用记录器时指定日志级别。

logger.info('Information message').

我们使用 info 函数记录一条信息消息。

logger.log('info', Information message').

这是记录信息消息的另一种方式。

温斯顿格式

日志消息采用 Winston 格式。 Winston 包含多种内置格式,包括:

  • 简单
  • json
  • cli
  • padlevels
  • colorize
  • splat
  • 对齐

默认格式为json。可以使用combine 组合格式,也可以使用printf 创建自定义格式。

温斯顿简单例子

以下是一个简单的 Winston 示例。

const winston = require('winston');


const logger = winston.createLogger({
    transports: [
        new winston.transports.Console()
    ]
});

logger.info('Information message');
logger.warn('Warning message');
logger.error('Error message');

我们创建一个控制台记录器并记录三个消息。由于默认日志记录级别是 info,所有三个消息都会被记录。

$ node simple.js 
{"message":"Information message","level":"info"}
{"message":"Warning message","level":"warn"}
{"message":"Error message","level":"error"}

在输出中,我们可以看到 JSON 格式的三条消息。

Winston 日志函数

我们可以使用自定义日志函数(infowarn)或使用通用log 函数并指定日志级别作为第一个选项来记录消息。

const winston = require('winston');


const logger = winston.createLogger({
    transports: [
        new winston.transports.Console()
    ]
});

logger.info('Information message');
logger.warn('Warning message');

logger.log('info', 'Information message')
logger.log('warn', 'Warning message')

在示例中,我们以两种方式记录消息。

$ node log_funs.js 
{"message":"Information message","level":"info"}
{"message":"Warning message","level":"warn"}
{"level":"info","message":"Information message"}
{"level":"warn","message":"Warning message"}

Winston 配置记录器

使用configure函数,我们可以配置和创建记录器。

const winston = require('winston');


const logger = winston.createLogger({
    transports: [
        new winston.transports.Console()
    ]
});

logger.info('Information message');
logger.warn('Warning message');
logger.error('Error message');

logger.configure({
    level: 'error',
    transports: [
        new winston.transports.Console()
    ]
});

logger.info('Information message 2');
logger.warn('Warning message 2');
logger.error('Error message 2');

在示例中,我们将日志记录级别更改为'error' 并调用另外三个日志函数。仅从附加消息中输出第二个错误消息。

$ node configure_logger.js 
{"message":"Information message","level":"info"}
{"message":"Warning message","level":"warn"}
{"message":"Error message","level":"error"}
{"message":"Error message 2","level":"error"}

Winston 默认记录器

默认记录器可通过 winston 模块直接访问。最初,默认记录器上没有传输设置。我们必须通过addremoveconfigure 方法添加或删除传输。

const winston = require('winston');


const console = new winston.transports.Console();

winston.add(console);
winston.info('Information message');
winston.remove(console);

该示例使用默认记录器来记录信息消息。

Winston 格式客户端

cli 格式是colorizepadLevels 格式的组合。

const winston = require('winston');
 

const myformat = winston.format.cli({ colors: { info: 'blue' }});


const logger = winston.createLogger({
    transports: [
        new winston.transports.Console({
            format: myformat
        })
    ]
});

logger.info('Information message');

在示例中,我们将 cli 格式传递给控制台传输。我们选择蓝色。

Winston 组合格式

格式可以与combine组合。

const winston = require('winston');
 

const myformat = winston.format.combine(
  winston.format.colorize(),
  winston.format.timestamp(),
  winston.format.align(),
  winston.format.printf(info => `${info.timestamp} ${info.level}: ${info.message}`)
);

const logger = winston.createLogger({
    transports: [
        new winston.transports.Console({
            format: myformat
        })
    ]
});

logger.info('Information message');

在示例中,我们组合了colorizetimestampalignprintf 格式。

$ node format_combine.js 
2020-04-04T17:17:48.882Z info:  Information message

Winston 传输最大尺寸

传输的maxsize 属性设置日志文件的最大大小(以字节为单位),然后才会创建新文件。

const path = require('path');
const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.printf(info => `${info.message}`),
  transports: [
    new winston.transports.File({
      filename: path.join(__dirname, 'error.log'),
      level: 'info',
      maxsize: 500
    })
  ]
});

logger.info(`${'a'.repeat(200)}`);
logger.info(`${'b'.repeat(200)}`);
logger.info(`${'c'.repeat(200)}`);


setTimeout(() => {
  logger.info(`${'d'.repeat(200)}`);
  logger.info(`${'e'.repeat(200)}`);
}, 1500);

我们使用文件传输并将maxsize 设置为500 字节。后来我们在文件中写入了 500 多个字符。前 600 个字符写入 error.log 文件,其余 400 个字符写入 error1.log 文件。

Winston 多个记录器

在下一个示例中,我们创建两个写入文件的记录器。

const winston = require('winston');

const loggers = {
  mjson: winston.createLogger({
    level: 'info',
    format: winston.format.json(),
    transports: [new winston.transports.File({ filename: 'app-info.log'})],
  }),

  simple: winston.createLogger({
    level: 'error',
    format: winston.format.simple(),
    transports: [new winston.transports.File({ filename: 'app-error.log'}),],
  })
};


loggers.mjson.info('Information message');
loggers.mjson.error('Error message');
loggers.mjson.debug('Some message');

loggers.simple.error('Error message');
loggers.simple.info('Information message');
loggers.simple.warn('Warning message');
loggers.simple.debug('Some message');

mjsonlogger以json格式写入,simplelogger以简单格式写入。记录器具有不同的日志级别。

$ node loggers.js
$ cat app-error.log 
error: Error message
$ cat app-info.log 
{"message":"Information message","level":"info"}
{"message":"Error message","level":"error"}

我们运行程序并显示文件内容。

在本文中,我们使用了 Winston 日志记录库。

列出所有 JavaScript 教程。

赞(0) 打赏

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏