web-dev-qa-db-ja.com

Node.js-ロギング/モーガンとウィンストンを使用する

エクスプレス変換をログに記録するためにmorganを使用します。

var morgan  = require('morgan');
morgan('combined');
// a format string
morgan(':remote-addr :method :url :uuid');
// a custom function
morgan(function (req, res) {
  return req.method + ' ' + req.url + ' ' + req.uuid;
})

また、他のログを記録するためにwinstonを使用します。

var winston = require('winston');
var logger = new (winston.Logger)({
  transports: [
         new (winston.transports.Console)({ level: 'info' }),
          new (winston.transports.File)({ filename: '/var/log/log-file.log' })
  ]
});

2つのロガーを結合する方法はありますか?現在の状況は、morgan/var/log/log-file.logに書き込むときに、winstonが標準出力に書き込まれるということです。

ロガーファイルが高速変換情報と他の必要な情報(logger.info())から結合されることを望みます。

82
Or Smith

この記事は、あなたがやりたいことに対して素晴らしい仕事をします。

http://tostring.it/2014/06/23/advanced-logging-with-nodejs/

特定のコードには、おそらく次のようなものが必要です。

var logger = new winston.Logger({
    transports: [
        new winston.transports.File({
            level: 'info',
            filename: './logs/all-logs.log',
            handleExceptions: true,
            json: true,
            maxsize: 5242880, //5MB
            maxFiles: 5,
            colorize: false
        }),
        new winston.transports.Console({
            level: 'debug',
            handleExceptions: true,
            json: false,
            colorize: true
        })
    ],
    exitOnError: false
}),

logger.stream = {
    write: function(message, encoding){
        logger.info(message);
    }
};

app.use(require("morgan")("combined", { "stream": logger.stream }));

これにより、ファイルだけでなくコンソールにもログを書き込むようにWinstonが設定されます。次に、最後の式を使用して、morganミドルウェアからの出力をwinstonに渡すことができます。

121
lindsaymacvean

TypeScriptの場合:

let logger = new (winston.Logger)({
    exitOnError: false,
    level: 'info',
    transports: [
        new (winston.transports.Console)(),
        new (winston.transports.File)({ filename: 'app.log'})
    ]
})

class MyStream {
    write(text: string) {
        logger.info(text)
    }
}
let myStream = new MyStream()
app.use(morgan('tiny', { stream: myStream }));
16
Mahyar SEPEHR

最後の行を更新して警告を削除します

app.use(require("morgan")("combined", { stream: logger.stream }));
7
Johnny

モーガンには\nでメッセージを終了するという悪い癖があるので、物事を整然とするために、Winstonに書き込む前にそれを削除することができます。

これは、Winstonのフォーマット側など、または\nを書き込まないようにストリームを更新するなど、さまざまな方法で実行できます。

class MyStream {
    write(text: string) {
        logger.info(text.replace(/\n$/, '');
    }
}
let myStream = new MyStream()
app.use(morgan('tiny', { stream: myStream }));
0
user566245

typeScriptの場合、クラスを作成する必要なく、別の方法でそれを実行できます

let logger = new (winston.Logger)({
    exitOnError: false,
    level: 'info',
    transports: [
        new (winston.transports.Console)(),
        new (winston.transports.File)({ filename: 'app.log'})
    ]
})

const myStream = {
    write: (text: string) => {
        logger.info(text)
    }
}

app.use(morgan('combined', { stream: myStream }));

このソリューションは、このGithubページからハイブされました https://github.com/winstonjs/winston/issues/1385 。ただし、コードにはわずかな違いがあることに注意することが重要です。の代わりに:

app.use(morgan('combined', { myStream }));

私が使う:

app.use(morgan('combined', { stream: myStream }));

これは、クラスを作成する上であまり大きくないので助けてくれました。

0
Cris Shaki