幾乎所有內容的記錄器。
請參閱升級指南以了解更多資訊。歡迎 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 ,但是not trace) // new winston.transports.File({ filename: 'combined.log' }), ],});//// 如果我們不在生產中,則使用以下格式登入 `console`: // `${info.level}: ${info.message} JSON.stringify({ ...rest }) `//if (process.env.NODE_ENV !== '生產') { logger.add(new溫斯頓.transsports.Console({ 格式: 溫斯頓.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 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: '對了喵!' }), timestamp() , 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: '測試時間是幾點?'});/ / Outputs:// { level: 'info',// message: '測試時間是幾點? '}
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', 'first', 'second' , { 數量: 123 });
info
對象如果您希望在記錄時完全過濾掉給定的info
對象,則只需傳回 false 值即可。
const { createLogger, format, Transports } = require('winston');// 如果日誌訊息有{ private: true }constignorePrivate = format((info, opts) => { if (info.private) { return 則忽略日誌訊息false; } return info;});const logger = createLogger({ format: format.combine(ignorePrivate(), format.json() ), Transports: [new Transports.Console()]});// 輸出: { "level":"error","message":"要共享的公共錯誤"}logger.log({ level: 'error', message: '要共享的公共錯誤'});// 帶有{ private : true } 的訊息Logged.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 實例的函式。 dir(scream.transform({ level: 'info', message: `抱歉讓你在腦子裡大喊大叫!`}, scrape.options));// {// level: 'info' // message: '抱歉讓你在腦子裡大喊大叫! ({ level: 'info', message: `為什麼他們讓我們大喊大叫!`}, Whisper.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 - 沒有像家一樣的地方");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('不會在任一傳輸登入!');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({levels: 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:winston.format.combine(winston.format.colorize() , winston.format.simple() ) }) ]});
使用winston
,可以擷取並記錄進程中的uncaughtException
事件。使用您自己的記錄器實例,您可以在建立該實例時或稍後在應用程式生命週期中啟用此行為:
const { createLogger, Transports } = require('winston');// 建立 logger 時啟用異常處理。 : [ new Transports.File({ filename: 'exceptions.log' }) ]});// 或稍後透過新增傳輸或使用`.exceptions.handle` const logger = createLogger({ Transports: [ new Transports.File ({ filename: 'combined.log' }) ]});// 使用Transport 呼叫exceptions.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 ' }) );//// 或者,您可以在將Transports// 加到Winston 時將`handleExceptions` 設為true。 /combined.log', handleExceptions : 真的}));
預設情況下,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 時啟用拒絕處理。 : [ 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 ' }) );//// 或者,您可以在將Transports 新增至Winston 時將`handleRejections` 設為true。 .log', handleRejections : 真的}));
除了記錄訊息和元資料之外, 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']} ;//// 尋找今天和昨天之間記錄的項目。 (results );});
串流傳輸可讓您從所選傳輸方式串流回日誌。
//// 從最後開始。
預設記錄器可以直接透過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' , { 格式: 組合( label({ 標籤: '類別一' }), json() ), 傳輸: [ new winston.transports.Console({ level: '傻' }), new winston.transports.File({ filename: 'somefile.log' }) ]});//// 配置`category2` 的記錄器//winston.loggers.add('category2', { format:ombine( label({ label: 'category Two' ) }), json() ), 傳輸: [ new winston.transsports.Http({ 主機: '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測試