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');
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 教程。
