Winston 教程展示了如何使用 Winston.js 库在 JavaScript 中进行日志记录,并在几个代码示例中演示了日志记录。
记录
Logging 是将信息写入日志文件的过程。日志文件包含有关操作系统、软件或通信中发生的各种事件的信息。
记录的目的
记录是为了以下目的:
- 故障排除
- 信息收集
- 分析
- 审计
- 生成统计信息
日志记录不仅限于识别软件开发中的错误。它还用于检测安全事件、监控策略违规、在出现问题时提供信息、查找应用程序瓶颈或生成使用数据。
记录哪些事件
应记录的事件包括输入验证失败、身份验证和授权失败、应用程序错误、配置更改以及应用程序启动和关闭。
哪些事件不记录
不应记录的事件包括应用程序源代码、会话标识值、访问令牌、敏感的个人数据、密码、数据库连接字符串、加密密钥、银行账户和持卡人数据。
记录最佳实践
以下是进行日志记录的一些最佳实践:
- 日志记录应该有意义。
- 日志记录应该结构化并在不同级别完成。
- 日志记录应该包含上下文。
- 日志记录消息应该人类可以理解并且机器可以解析。
- 日志记录应该是平衡的;它不应包括太少或太多的信息。
- 日志记录应适应开发和生产。
- 在更复杂的应用程序中记录应分为几个日志文件。
李>
温斯顿
Winston 是一个流行的 JavaScript 日志库。它旨在简单和通用。每个 Winston 记录器都可以在不同级别配置多个传输。默认情况下,Winston 的日志使用 JSON 格式。
$ npm i winston
我们使用winston
工具安装npm
包。
温斯顿记录器
Winston 记录器将消息记录到日志文件中。 winston 记录器是使用 createLogger
函数创建的。此外,如果没有明确指定记录器,则有一个默认记录器。
createLogger
函数接受以下选项:
名称 | 默认值 | 描述 |
---|---|---|
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 带有预定义的日志记录级别集:npm
、syslog
和cli
。
以下是默认的 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 日志函数
我们可以使用自定义日志函数(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"}
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 模块直接访问。最初,默认记录器上没有传输设置。我们必须通过add
、remove
或configure
方法添加或删除传输。
const winston = require('winston'); const console = new winston.transports.Console(); winston.add(console); winston.info('Information message'); winston.remove(console);
该示例使用默认记录器来记录信息消息。
Winston 格式客户端
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 格式传递给控制台传输。我们选择蓝色。
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');
在示例中,我们组合了colorize
、timestamp
、align
和printf
格式。
$ 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');
mjson
logger以json格式写入,simple
logger以简单格式写入。记录器具有不同的日志级别。
$ 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 教程。