Node.js でのロギングに Winston を使用したいと考えています。しかし、2 つのログ ファイルを作成する方法がわかりません。1 つはエラー用で、もう 1 つはその他すべて用です。
ただし、単純な方法ではうまくいきません。複数のwinston.transports.File
トランスポートを追加すると、エラーが発生します。
他の人はこの問題に遭遇し、漠然とした解決策のヒントを持っていますが、本当の答えはありません.
何か案は?
Node.js でのロギングに Winston を使用したいと考えています。しかし、2 つのログ ファイルを作成する方法がわかりません。1 つはエラー用で、もう 1 つはその他すべて用です。
ただし、単純な方法ではうまくいきません。複数のwinston.transports.File
トランスポートを追加すると、エラーが発生します。
他の人はこの問題に遭遇し、漠然とした解決策のヒントを持っていますが、本当の答えはありません.
何か案は?
残念ながら、pesho が言及したパッチはまだ公式バージョンに含まれていないようです (プル リクエスト #149の stephenbeeson のコメントを参照)。
そこで、代わりに回避策を使用しました。winston は name 属性を比較するので、name を自分で定義することで欺くことができます。
winston = require 'winston'
logger = new winston.Logger
transports: [
new winston.transports.File
name: 'file#debug'
level: 'debug'
filename: '/tmp/debug.log'
new winston.transports.File
name: 'file#error'
level: 'error'
filename: '/tmp/error.log'
]
logger.error 'error' # both logs
logger.debug 'debug' # on debug log
エレガントではないかもしれませんが、少なくとも機能します。
それまでの間、次のように同じインターフェースを使用して基本的なラッパーを実装できます。
var winston = require('winston');
var configs = require('./env.js');
var debug = new winston.Logger({
levels: {
debug: 0
},
transports: [
new (winston.transports.File)({ filename: configs.PATH_TO_LOG, level: 'debug'}),
new (winston.transports.Console)({level: 'debug'})
]
});
var info = new winston.Logger({
levels: {
info: 1
},
transports: [
new (winston.transports.File)({ filename: configs.PATH_TO_LOG, level: 'info'}),
new (winston.transports.Console)({level: 'info'})
]
});
var warn = new winston.Logger({
levels: {
warn: 2
},
transports: [
new (winston.transports.File)({ filename: configs.PATH_TO_LOG, level: 'warn'}),
new (winston.transports.Console)({level: 'warn'})
]
});
var error = new winston.Logger({
levels: {
error: 3
},
transports: [
new (winston.transports.File)({ filename: configs.PATH_TO_LOG, level: 'error'}),
new (winston.transports.Console)({level: 'error'})
]
});
var exports = {
debug: function(msg){
debug.debug(msg);
},
info: function(msg){
info.info(msg);
},
warn: function(msg){
warn.warn(msg);
},
error: function(msg){
error.error(msg);
},
log: function(level,msg){
var lvl = exports[level];
lvl(msg);
}
};
module.exports = exports;
これは、基本的な winston API をカバーします。メタデータなどに拡張できます...
1 つのロガーで複数のファイル トランスポートを使用できるプル リクエストを送信しました。 https://github.com/flatiron/winston/pull/149
すでに flatiron/winston に統合されています。
私のフォークされたレポも使用できます: https://github.com/pdobrev/winston
トランスポートにカスタムname
プロパティを指定するだけで、衝突が発生しなくなります。
const logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)(),
new (winston.transports.File)({ name: 'text', filename: logFile, json: false }),
new (winston.transports.File)({ name: 'json', filename: logFileJson })
]
});
ドキュメントで複数のトランスポートについて詳しく読むことができます: https://github.com/winstonjs/winston#multiple-transports-of-the-same-type