Winston 教程展示了如何使用 Winston.js 库在 JavaScript 中进行日志记录,并在几个代码示例中演示了日志记录。
记录是将信息写入日志文件的过程。日志文件包含有关操作系统、软件或通信中发生的各种事件的信息。
日志记录用于以下目的:
日志记录不仅限于识别软件开发中的错误。它还用于检测安全事件、监视策略违规、在出现问题时提供信息、查找应用程序瓶颈或生成使用数据。
应记录的事件包括输入验证失败、身份验证和授权失败、应用程序错误、配置更改以及应用程序启动和关闭。
不应记录的事件包括应用程序源代码、会话标识值、访问令牌、敏感个人数据、密码、数据库连接字符串、加密密钥、银行账户和持卡人数据。
以下是进行日志记录的一些最佳实践:
温斯敦 是一个流行的 JavaScript 日志库。它被设计成简单和通用的。每个 Winston 记录器都可以在不同级别配置多个传输。默认情况下,Winston 的日志使用 JSON 格式。
$ npm i winston
我们使用 npm
工具安装 winston
包。
Winston 记录器将消息记录到日志文件中。使用 createLogger
函数创建一个 winston 记录器。此外,如果没有明确指定记录器,则有一个默认记录器。
createLogger
函数接受以下选项:
姓名 | 默认 | 描述 |
---|---|---|
等级 | 信息 | 要记录的日志消息的最大级别 |
等级 | winston.config.npm.levels | 选择的级别消息类型集 |
格式 | winston.format.json文件 | 日志消息的格式 |
运输 | 没有交通工具 | 日志消息的日志记录目的地集 |
错误退出 | 真的 | 处理的异常是否导致 process.exit |
沉默的 | 错误的 | 如果为真,所有日志都被抑制 |
传输是我们日志的存储设备或输出机制。每个 Winston 记录器都可以在不同级别配置多个传输。 Winston 带有三个核心传输:控制台、文件和 HTTP。必须创建传输并将其添加到记录器中。
传输具有以下设置:
日志记录级别指示消息优先级并用整数表示。它们被指定用于传输。 Winston 带有预定义的日志记录级别集:npm
、syslog
和 cli
。
以下是默认的 npm 日志记录级别:
将记录特定级别或更高级别的任何内容。例如,通过指定信息级别,将记录级别为错误、警告或信息的任何内容。调用记录器时指定日志级别。
logger.info('Information message').
我们使用 info
函数记录一条信息消息。
logger.log('info', Information message').
这是记录信息消息的另一种方法。
日志消息采用 Winston 格式。 Winston 包含多种内置格式,包括:
默认格式为 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 格式的三条消息。
我们可以使用自定义日志函数(info
、warn
)或使用通用的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"}
使用 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 模块访问默认记录器。最初,默认记录器上没有设置传输。我们必须通过 add
、remove
或 configure
方法添加或删除传输。
const winston = require('winston'); const console = new winston.transports.Console(); winston.add(console); winston.info('Information message'); winston.remove(console);
该示例使用默认记录器来记录信息消息。
cli
格式是 colorize
和 padLevels
格式的组合。
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 格式传递给控制台传输。我们选择蓝色。
可以使用 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');
在示例中,我们结合了 colorize
、timestamp
、align
和 printf
格式。
$ node format_combine.js 2020-04-04T17:17:48.882Z info: Information message
传输的 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
文件。
在下一个示例中,我们创建两个写入文件的记录器。
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');
mjson
记录器以 json 格式写入,simple
记录器以简单格式写入。记录器具有不同的日志级别。
$ 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 日志记录库。
地址:https://www.cundage.com/article/javascript-winston.html