几乎所有内容的记录器。
请参阅升级指南了解更多信息。欢迎 Bug 报告和 PR!
[email protected]
文档?请注意,以下文档适用于winston@3
。阅读[email protected]
文档。
winston
被设计为一个简单且通用的日志库,支持多种传输。传输本质上是日志的存储设备。每个winston
记录器可以在不同级别(请参阅:日志记录级别)配置多个传输(请参阅:传输)。例如,人们可能希望将错误日志存储在持久的远程位置(如数据库),但所有日志都输出到控制台或本地文件。
winston
目标是解耦日志记录过程的各个部分,使其更加灵活和可扩展。注意支持日志格式的灵活性(请参阅:格式)和级别(请参阅:使用自定义日志记录级别),并确保这些 API 与传输日志记录的实现分离(即如何存储/索引日志,请参阅:添加自定义日志记录)传输)到他们向程序员公开的 API。
长话;博士?查看./examples/
中的快速入门示例。 ./examples/*.js
中还有许多其他示例。没有看到您认为应该存在的示例?提交拉取请求来添加它!
使用winston
推荐方法是创建您自己的记录器。最简单的方法是使用winston.createLogger
:
const winston = require('winston');const logger = winston.createLogger({ level: 'info', format: winston.format.json(), defaultMeta: { service: 'user-service' }, Transports: [ / // - 将所有重要性级别为 `error` 或更高的日志写入 `error.log` // (即错误、致命,但不是其他级别) // new winston.transports.File({ filename: 'error.log', level: 'error' }), // // - 将重要性级别为 `info` 或更高级别的所有日志写入 `combined.log` // (即 fatal、error、warn 和 info ,但不是 Trace) // new winston.transports.File({ filename: 'combined.log' }), ],});//// 如果我们不在生产中,则使用以下命令登录到 `console`格式:// `${info.level}: ${info.message} JSON.stringify({ ...rest }) `//if (process.env.NODE_ENV !== '生产') { logger.add(new Winston. Transports.Console({ 格式:winston.format.simple(), }));}
您还可以通过require('winston')
公开的默认记录器直接进行记录,但这只是为了成为一个方便的共享记录器,以便在您选择的情况下在整个应用程序中使用。请注意,默认记录器默认没有任何传输。您需要自己添加传输,并且不使用任何传输的默认记录器可能会产生高内存使用问题。
动机
快速入门
用法
目录
记录
创建你的记录器
Streams、 objectMode
和info
对象
格式
组合格式
字符串插值
过滤info
对象
创建自定义格式
记录级别
使用日志记录级别
使用自定义日志记录级别
交通
同一类型的多个传输
添加自定义传输
常见的交通选择
例外情况
使用温斯顿处理未捕获的异常
退出或不退出
拒绝
使用温斯顿处理未捕获的承诺拒绝
分析
流式日志
查询日志
进一步阅读
使用默认记录器
等待在winston
中写入日志
在winston
使用多个记录器
路由控制台将消息传输到控制台而不是 stdout 和 stderr
安装
运行测试
winston
中的日志记录级别符合 RFC5424 指定的严重性排序:假定所有级别的严重性按数字顺序从最重要到最不重要升序。
const 级别 = { 错误:0、警告:1、信息:2、http:3、详细:4、调试:5、愚蠢:6};
您可以通过使用winston.createLogger
创建记录器开始:
const logger = winston.createLogger({ Transports: [ new winston.transports.Console(), new winston.transports.File({ filename: 'combined.log' }) ]});
记录器接受以下参数:
姓名 | 默认 | 描述 |
---|---|---|
level | 'info' | 仅当info.level 小于或等于该级别时才记录 |
levels | winston.config.npm.levels | 代表日志优先级的级别(和颜色) |
format | winston.format.json | info 消息的格式(请参阅:格式) |
transports | [] (无传输) | info 消息的日志记录目标集 |
exitOnError | true | 如果为 false,则处理的异常不会导致process.exit |
silent | false | 如果为 true,则所有日志都会被抑制 |
提供给createLogger
的级别将被定义为返回的logger
上的便捷方法。
//// 日志记录 //logger.log({ level: 'info', message: '分布式日志文件您好!'});logger.info('分布式日志再次您好');
一旦从winston.createLogger
向您提供了记录器,您就可以添加或删除logger
中的传输:
const files = new winston.transports.File({ filename: 'combined.log' });const console = new winston.transports.Console();logger .clear() // 删除所有传输 .add(console) //添加控制台传输 .add(files) // 添加文件传输 .remove(console); // 删除控制台传输
您还可以使用configure
方法批量重新配置winston.Logger
实例:
const logger = winston.createLogger({ level: 'info', Transports: [ new winston.transports.Console(), new winston.transports.File({ filename: 'combined.log' }) ]});/// / 将以前的传输替换为 // 新配置批发中的传输。//const DailyRotateFile = require('winston-daily-rotate-file');logger.configure({ level: 'verbose', Transports: [ new DailyRotateFile(opts) ]});
您可以从现有记录器创建子记录器以传递元数据覆盖:
const logger = winston.createLogger({ Transports: [ new winston.transports.Console(), ]});const childLogger = logger.child({ requestId: '451' });
如果您还扩展
Logger
类,则.child
可能会出现问题,因为某些实现细节使this
关键字指向意外的内容。谨慎使用。
objectMode
和info
对象在winston
中, Logger
和Transport
实例都被视为接受info
对象的objectMode
流。
提供给给定格式的info
参数表示单个日志消息。对象本身是可变的。每个info
必须至少具有level
和message
属性:
const info = { level: 'info', // 日志消息的级别 message: '嘿!记录一些东西? // 正在记录的描述性消息。};
除了级别和消息之外的属性被视为“ meta
”。 IE:
const { 级别、消息、...元 } = 信息;
logform
本身的一些格式添加了额外的属性:
财产 | 格式添加者 | 描述 |
---|---|---|
splat | splat() | %d %s 样式消息的字符串插值 splat。 |
timestamp | timestamp() | 收到消息的时间戳。 |
label | label() | 与每条消息关联的自定义标签。 |
ms | ms() | 自上一条日志消息以来的毫秒数。 |
作为消费者,您可以添加任何您想要的属性 -内部状态由Symbol
属性维护:
Symbol.for('level')
(只读) :等于level
属性。所有代码都将其视为不可变。
Symbol.for('message'):
通过“最终格式”设置的完整字符串消息:
json
logstash
printf
prettyPrint
simple
Symbol.for('splat')
:附加字符串插值参数。专门由splat()
格式使用。
这些符号存储在另一个包中: triple-beam
,以便logform
的所有使用者都可以拥有相同的符号引用。 IE:
const { LEVEL, MESSAGE, SPLAT } = require('三重光束');console.log(LEVEL === Symbol.for('level'));// trueconsole.log(MESSAGE === Symbol.for( 'message'));// trueconsole.log(SPLAT === Symbol.for('splat'));// true
注意:提供的
meta
对象中的任何{ message }
属性都将自动连接到已提供的任何msg
:例如,下面的代码会将 'world' 连接到 'hello':logger.log('error', 'hello', { message: 'world' });logger.info('hello', { message: 'world' });
可以从winston.format
访问winston
中的格式。它们是在logform
中实现的,logform 是一个独立于winston
模块。如果您希望在传输中包含默认格式,这可以在编写您自己的传输时提供灵活性。
在现代版本的node
模板字符串中,性能非常好,并且是大多数最终用户格式化的推荐方法。如果您想定制日志格式, winston.format.printf
适合您:
const { createLogger, 格式, 传输 } = require('winston');const { 组合, 时间戳, 标签, printf } = 格式;const myFormat = printf(({ 级别, 消息, 标签, 时间戳 }) => { return ` ${timestamp} [${label}] ${level}: ${message}`;});const logger = createLogger({ format: merge( label({ label: '对了喵!' }), 时间戳(), myFormat ), 传输: [new Transports.Console()]});
要查看可用的内置格式并了解有关创建自己的自定义日志记录格式的更多信息,请参阅logform
。
可以使用format.combine
将任意数量的格式组合成单个格式。由于format.combine
不采用opts
,为了方便起见,它返回组合格式的预先创建的实例。
const { createLogger, 格式, 传输 } = require('winston');const { 组合, 时间戳, 标签, PrettyPrint } = 格式;const logger = createLogger({ 格式: 组合( 标签({ 标签: '对了喵!' } ), timestamp(), PrettyPrint() ), Transports: [new Transports.Console()]})logger.log({ level: 'info', message: '测试时间是几点at?'});// Outputs:// { level: 'info',// message: '测试时间是几点?',// label: 'right meow!',// timestamp: '2017- 09-30T03:57:26.875Z'}
log
方法使用 util.format 提供字符串插值。必须使用format.splat()
启用它。
下面是一个示例,它使用format.splat
定义带有消息字符串插值的格式,然后使用format.simple
序列化整个info
消息。
const { createLogger, format, Transports } = require('winston');const logger = createLogger({ format: format.combine( format.splat(), format.simple() ), Transports: [new Transports.Console() ]});// 信息:测试消息 my string {}logger.log('info', '测试消息 %s', 'my string');// 信息:测试消息 123 {}logger.log('info', '测试消息 %d', 123);// info: 测试消息第一第二条 {number: 123}logger.log('info', '测试消息 %s, %s' , '第一', '第二', { 数字: 123 });
info
对象如果您希望在记录时完全过滤掉给定的info
对象,则只需返回一个 false 值即可。
const { createLogger, format, Transports } = require('winston');// 如果日志消息有 { private: true }constignorePrivate = format((info, opts) => { if (info.private) { return 则忽略日志消息false; } 返回信息;});const logger = createLogger({ format: format.combine(ignorePrivate(), format.json() ), Transports: [new Transports.Console()]});// 输出: {"level":"error","message":"要共享的公共错误"}logger.log({ level: 'error', message: '要共享的公共错误share'});//logged 时不会写入带有 { private: true } 的消息。logger.log({ private: true, level: 'error', message: '这是超级秘密 - 隐藏它。'}) ;
使用format.combine
将尊重任何错误值返回并停止评估该系列中的后续格式。例如:
const { format } = require('winston');const {combine, timestamp, label } = format;const willNeverThrow = format.combine( format(info => { return false })(), // 忽略所有内容 format(info => { throw new Error('从未达到') })());
格式是定义单个方法的原型对象(即类实例): transform(info, opts)
并返回变异的info
:
info
:表示日志消息的对象。
opts
:特定于当前格式实例的设置。
他们预计会返回以下两件事之一:
表示修改后的info
参数的info
对象。如果首选不变性,则不需要保留对象引用。当前所有内置格式都认为info
是可变的,但未来版本正在考虑 [immutablejs]。
一个 false 值,指示调用者应忽略info
参数。 (请参阅:过滤info
对象)如下。
winston.format
设计得尽可能简单。要定义新格式,只需向其传递一个transform(info, opts)
函数即可获取新Format
。
返回的命名Format
可用于根据需要创建给定Format
的任意多个副本:
const { format } = require('winston');const volume = format((info, opts) => { if (opts.yell) { info.message = info.message.toUpperCase(); } else if (opts. Whisper) { info.message = info.message.toLowerCase(); } return info;});// `volume` 现在是一个返回实例的函数format.const Scream = Volume({ yell: true });console.dir(scream.transform({ level: 'info', message: `抱歉让你在脑子里大喊大叫!`},尖叫.options)); // {// level: 'info'// message: '抱歉让你在脑子里大喊大叫!'// }// `volume` 可以多次使用来创建不同的格式。const耳语 = 音量({ 耳语: true });console.dir(whisper.transform({ level: 'info', message: `为什么他们让我们大喊大叫!`}, 耳语.options));// { // level: 'info'// message: '为什么他们让我们大喊大叫!'// }
winston
中的日志记录级别符合 RFC5424 指定的严重性排序:假定所有级别的严重性按数字顺序从最重要到最不重要升序。
每个level
都被赋予特定的整数优先级。优先级越高,消息被认为越重要,相应的整数优先级越低。 例如,按照 RFC5424 中的具体规定, syslog
级别的优先级从 0 到 7(从最高到最低)。
{ 紧急:0,警报:1,暴击:2,错误:3,警告:4,通知:5,信息:6,调试:7}
同样, npm
日志记录级别的优先级从 0 到 6(从最高到最低):
{ 错误:0,警告:1,信息:2,http:3,详细:4,调试:5,愚蠢:6}
如果您没有明确定义winston
应使用的级别,则将使用上面的npm
级别。
设置日志消息的级别可以通过两种方式之一完成。您可以将表示日志记录级别的字符串传递给 log() 方法,或使用每个 Winston Logger 上定义的级别指定方法。
//// 任何记录器实例//logger.log('silly', "127.0.0.1 - 没有像家一样的地方");logger.log('debug', "127.0.0.1 - 没有像家一样的地方") ;logger.log('verbose', "127.0.0.1 - 没有像家一样的地方");logger.log('info', "127.0.0.1 - 没有像家一样的地方");logger.log('warn', "127.0.0.1 - 没有像家一样的地方");logger.log('error', "127.0.0.1 - 没有像家一样的地方") ;logger.info("127.0.0.1 - 没有像家这样的地方");logger.warn("127.0.0.1 - 没有像家这样的地方home");logger.error("127.0.0.1 - 没有像家一样的地方");//// 默认记录器//winston.log('info', "127.0.0.1 - 没有像家一样的地方"); winston.info("127.0.0.1 - 没有比家更好的地方了");
winston
允许您在每个传输上定义level
属性,该属性指定传输应记录的消息的最大级别。例如,使用syslog
级别,您可以仅将error
消息记录到控制台,并将所有info
及以下内容记录到文件(包括error
消息):
const logger =winston.createLogger({levels:winston.config.syslog.levels,transports:[newwinston.transports.Console({level:'error'}),newwinston.transports.File({filename:'combined.日志',级别:'信息' }) ]});
您还可以动态更改传输的日志级别:
const Transports = { console: new winston.transports.Console({ level: 'warn' }), file: new winston.transports.File({ filename: 'combined.log', level: 'error' })};const logger = winston.createLogger({ Transports: [ Transports.console, Transports.file ]});logger.info('也不会被登录Transport!');transports.console.level = 'info';transports.file.level = 'info';logger.info('将在两种传输中记录!');
winston
支持可自定义的日志记录级别,默认为 npm 样式的日志记录级别。必须在创建记录器时指定级别。
除了winston
中提供的预定义npm
、 syslog
和cli
级别之外,您还可以选择定义自己的级别:
const myCustomLevels = { level: { foo: 0, bar: 1, baz: 2, foobar: 3 }, colors: { foo: 'blue', bar: 'green', baz: 'yellow', foobar: 'red' }};const customLevelLogger = winston.createLogger({ level: myCustomLevels.levels});customLevelLogger.foobar('一些 foobar分级消息');
虽然这个数据结构有轻微的重复,但如果您不想有颜色,它可以实现简单的封装。如果您确实希望有颜色,除了将级别传递给记录器本身之外,您还必须让温斯顿了解它们:
温斯顿.addColors(myCustomLevels.colors);
这使得记录器可以使用colorize
格式化程序对自定义级别的输出进行适当的颜色和样式设置。
此外,您还可以更改背景颜色和字体样式。例如,
baz: '斜体黄色',foobar: '粗体红青色BG'
可能的选项如下。
字体样式: bold
、 dim
、 italic
、 underline
、 inverse
、 hidden
、 strikethrough
。
字体前景色: black
、 red
、 green
、 yellow
、 blue
、 magenta
、 cyan
、 white
、 gray
、 grey
。
背景颜色: blackBG
、 redBG
、 greenBG
、 yellowBG
、 blueBG
magentaBG
、 cyanBG
、 whiteBG
要对标准日志记录级别进行着色,请添加
温斯顿.format.combine( 温斯顿.format.colorize(), 温斯顿.format.simple());
其中winston.format.simple()
是您要使用的任何其他格式化程序。 colorize
格式化程序必须出现在添加您想要着色的文本的任何格式化程序之前。
要使用 json 格式化程序对完整日志行进行着色,您可以应用以下命令
温斯顿.format.combine( 温斯顿.format.json(), 温斯顿.format.colorize({ all: true }));
winston
中包含多个核心传输,它们利用 Node.js 核心提供的内置网络和文件 I/O。此外,还有社区成员编写的其他传输。
构建传输时可以使用相同类型的多个传输,例如winston.transports.File
。
const logger = winston.createLogger({ Transports: [ new winston.transports.File({ filename: 'combined.log', level: 'info' }), new winston.transports.File({ filename: 'errors.log' ,级别:'错误' }) ]});
如果您稍后想要删除其中一种传输方式,可以使用该传输方式本身来实现。例如:
const组合Logs = logger.transports.find(transport => { return Transport.filename === 'combined.log'});logger.remove(combinedLogs);
添加自定义传输很容易。您需要做的就是接受您需要的任何选项,实现 log() 方法,并使用winston
来使用它。
const Transport = require('winston-transport');const util = require('util');//// 继承自 `winston-transport`,以便您可以利用 // 基本功能和 `.exceptions.handle ()`.//module.exports = class YourCustomTransport extends Transport { 构造函数(opts) { super(opts); // // 在此处使用任何自定义选项。例如: // - 数据库的连接信息 // - API 的身份验证信息(例如 loggly、papertrail、 // logentries 等)。 // } log(info, callback) { setImmediate(() => { this.emit('logged', info); }); // 执行对远程服务的写入回调(); }};
由于每个传输都继承自winston-transport,因此可以在每个传输上分别设置自定义格式和自定义日志级别:
const logger = winston.createLogger({ Transports: [ new winston.transports.File({ filename: 'error.log', level: 'error', format: winston.format.json() }), new winston.transports. Http({ level: 'warn', format: winston.format.json() }), new winston.transports.Console({ level: 'info', format:温斯顿.format.combine( 温斯顿.format.colorize(), 温斯顿.format.simple() ) }) ]});
使用winston
,可以捕获并记录进程中的uncaughtException
事件。使用您自己的记录器实例,您可以在创建该实例时或稍后在应用程序生命周期中启用此行为:
const { createLogger, Transports } = require('winston');// 创建 logger 时启用异常处理。const logger = createLogger({ Transports: [ new Transports.File({ filename: 'combined.log' }) ] , exceptionHandlers: [ new Transports.File({ filename: 'exceptions.log' }) ]});// 或者稍后通过添加传输或使用来启用它`.exceptions.handle`const logger = createLogger({ Transports: [ new Transports.File({ filename: 'combined.log' }) ]});// 使用 Transport 调用 excepts.handle 来处理异常 Logger.Exceptions.handle ( new Transports.File({ filename: 'exceptions.log' }));
如果您想在默认记录器中使用此功能,只需使用传输实例调用.exceptions.handle()
即可。
//// 您可以通过将其传递给 `.exceptions.handle` 来添加单独的异常记录器 //winston.exceptions.handle( new winston.transports.File({ filename: 'path/to/exceptions.log' }) );//// 或者,您可以在向 Winston 添加 Transports// 时将 `handleExceptions` 设置为 true。//winston.add(new winston.transports.File({ filename: 'path/to/combined.log', handlerExceptions: true}));
默认情况下,winston 将在记录 uncaughtException 后退出。如果这不是您想要的行为,请设置exitOnError = false
const logger = winston.createLogger({ exitOnError: false });//// 或者,像这样://logger.exitOnError = false;
使用自定义记录器实例时,您可以将单独的传输传递给exceptionHandlers
属性或在任何传输上设置handleExceptions
。
const logger = winston.createLogger({ Transports: [ new winston.transports.File({ filename: 'path/to/combined.log' }) ], exceptionHandlers: [ new winston.transports.File({ filename: 'path/到/exceptions.log' }) ]});
const logger = winston.createLogger({ Transports: [ new winston.transports.Console({ handleExceptions: true }) ], exitOnError: false});
exitOnError
选项也可以是一个函数,用于防止仅因某些类型的错误而退出:
functionignoreEpipe(err) { return err.code !== 'EPIPE';}const logger = winston.createLogger({ exitOnError:ignoreEpipe });//// 或者,像这样://logger.exitOnError =ignoreEpipe;
使用winston
,可以捕获并记录流程中的unhandledRejection
事件。使用您自己的记录器实例,您可以在创建该实例时或稍后在应用程序生命周期中启用此行为:
const { createLogger, Transports } = require('winston');// 创建 logger 时启用拒绝处理。const logger = createLogger({ Transports: [ new Transports.File({ filename: 'combined.log' }) ] , RejectionHandlers: [ new Transports.File({ filename: 'rejections.log' }) ]});// 或者稍后通过添加传输或使用来启用它`.rejections.handle`const logger = createLogger({ Transports: [ new Transports.File({ filename: 'combined.log' }) ]});// 使用传输调用rejections.handle来处理rejectionslogger.rejections.handle ( new Transports.File({ filename: 'rejections.log' }));
如果您想在默认记录器中使用此功能,只需使用传输实例调用.rejections.handle()
即可。
//// 您可以通过将其传递给`.rejections.handle`来添加单独的拒绝记录器 //winston.rejections.handle( new winston.transports.File({ filename: 'path/to/rejections.log' }) );//// 或者,您可以在向 Winston 添加 Transports// 时将 `handleRejections` 设置为 true。//winston.add(new winston.transports.File({ filename: 'path/to/combined.log', handleRejections: true}));
除了记录消息和元数据之外, winston
还为任何记录器实现了一个简单的分析机制:
//// 启动 'test' 的配置文件 //logger.profile('test');setTimeout(function () { // // 停止 'test' 的配置文件。现在将进行日志记录: // '17 Jan 21 :00:00 - 信息: 测试持续时间=1000ms' // logger.profile('test');}, 1000);
您还可以启动计时器并保留可以调用.done()
引用:
// 返回特定时间对应的对象。 // 调用完成后,计时器将完成并记录持续时间。例如: // const profiler = logger.startTimer(); setTimeout(function () { profiler.done({ message: '记录消息' }); }, 1000);
默认情况下,所有配置文件消息都设置为“信息”级别,并且消息和元数据都是可选的。 对于单个配置文件消息,您可以通过提供具有level
属性的元数据对象来覆盖默认日志级别:
logger.profile('测试', { level: '调试' });
winston
支持使用类似 Loggly 的选项查询日志。请参阅 Loggly 搜索 API。具体来说: File
、 Couchdb
、 Redis
、 Loggly
、 Nssocket
和Http
。
const options = { from: new Date() - (24 * 60 * 60 * 1000), 直到: new Date(), limit: 10, start: 0, order: 'desc', fields: ['message']} ;//// 查找今天和昨天之间记录的项目。//logger.query(options, function (err, results) { if (err) { /* TODO: 处理我 */ throw err; } console.log(结果);});
流式传输允许您从所选传输方式流回日志。
//// 从末尾开始。//winston.stream({ start: -1 }).on('log', function(log) { console.log(log);});
默认记录器可以直接通过winston
模块访问。您可以在记录器实例上调用的任何方法都可以在默认记录器上使用:
const winston = require('winston');winston.log('info', '你好分布式日志文件!');winston.info('你好再次分布式日志');winston.level = 'debug';winston.log ('debug', '现在我的调试消息已写入控制台!');
默认情况下,默认记录器上未设置任何传输。您必须通过add()
和remove()
方法添加或删除传输:
const 文件 = new winston.transports.File({ filename: 'combined.log' });const console = new winston.transports.Console();winston.add(console);winston.add(files);winston.remove (安慰);
或者通过一次调用 configure() 来完成此操作:
winston.configure({ 传输: [ new winston.transsports.File({ filename: 'somefile.log' }) ]});
有关使用winston
支持的每个单独传输的更多文档,请参阅winston
传输文档。
winston
中写入日志通常,在退出进程之前等待日志被写入是很有用的。 winston.Logger
的每个实例也是一个 [Node.js 流]。当流结束后所有日志都刷新到所有传输时,将引发finish
事件。
const Transport = new winston.transports.Console();const logger = winston.createLogger({ Transports: [transport]});logger.on('finish', function (info) { // 所有 `info` 日志消息都有现在已被记录});logger.info('CHILL WINSTON!', {认真: true });logger.end();
还值得一提的是,如果记录器本身发生错误,记录器也会发出“错误”事件,如果您不希望出现未处理的异常,则应该处理或抑制该错误:
//// 处理源自记录器本身的错误 //logger.on('error', function (err) { /* Do Something */ });
通常在更大、更复杂的应用程序中,需要有多个具有不同设置的记录器实例。每个记录器负责不同的功能区域(或类别)。这在winston
中以两种方式公开:通过winston.loggers
和winston.Container
的实例。事实上, winston.loggers
只是winston.Container
的预定义实例:
const winston = require('winston');const { format } = Winston;const {combine, label, json } = format;//// 配置 `category1` 的记录器 //winston.loggers.add('category1' , { 格式:combine( label({ label: '类别一' }), json() ), Transports: [ new winston.transports.Console({ level: 'silly' }), new winston.transports.File({ filename: 'somefile.log' }) ]});//// 配置 `category2` 的记录器 //winston.loggers.add('category2', { 格式:combine( label({ label: '类别二' }), json() ), Transports: [ new winston.transports.Http({ host: 'localhost',端口:8080 }) ]});
现在您的记录器已设置完毕,您可以在应用程序的任何文件中require Winston 并访问这些预配置的记录器:
const winston = require('winston');//// 获取预配置的记录器//constcategory1 =winston.loggers.get('category1');constcategory2 = winston.loggers.get('category2');category1. info('记录到文件和控制台传输');category2.info('记录到http传输');
如果您喜欢自己管理Container
,您可以简单地实例化一个容器:
const winston = require('winston');const { format } = Winston;const { merge, label, json } = format;const container = new winston.Container();container.add('category1', { format: merge ( label({ label: '类别一' }), json() ), Transports: [ new winston.transports.Console({ level: 'silly' }), new winston.transports.File({ filename: 'somefile.log' }) ]});const Category1 = container.get('category1');category1.info('记录到文件和控制台传输');
默认情况下, winston.transports.Console
传输将消息发送到stdout
和stderr
。这在大多数情况下都很好;但是,在某些情况下这是不可取的,包括:
使用 VSCode 进行调试并附加到(而不是启动)Node.js 进程
在 AWS Lambda 中编写 JSON 格式消息
在 Jest 测试期间使用--silent
选项进行日志记录
要使传输日志使用console.log()
、 console.warn()
和console.error()
,请将forceConsole
选项设置为true
:
const logger = winston.createLogger({ level: 'info', Transports: [new winston.transports.Console({ forceConsole: true })]});
npm 安装温斯顿
纱线添加温斯顿
所有的温斯顿测试都是用mocha
、 nyc
和assume
编写的。 它们可以使用npm
运行。
npm测试