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


99

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、にwinston書き込むときに私の標準出力に書き込むこと/var/log/log-file.logです。

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


これを行う意味は何ですか、つまり、なぜ最初からモーガンが必要だったのですか、エクスプレス用のウィンストンミドルウェアを書いてみませんか?
Dimitri Kopriwa

回答:


141

この記事は、あなたがやりたいことに優れた働きをします。

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がコンソールとファイルにログを書き込むように設定されます。次に、最後の式を使用して、モーガンミドルウェアからの出力をウィンストンに渡すことができます。


このプロセスでタイムスタンプを使用できますか?
bombayquant

23
logger.streamをオーバーライドする必要はないようです。私の場合、私はできましたapp.use(morgan("combined", { stream: { write: message => logger.info(message) }}));
Devon Sams

17
@DevonSamsのメソッドを使用している場合、morganとwinstonの両方がログメッセージの最後に改行を追加しているため、ログに記録された行の間に空の行が表示されます。メッセージから改行を削除するだけですlogger.info(message.trim())
Timo

2
サーバーが500で応答する場合、logger.infoの代わりにlogger.errorを使用したい場合はどうなりますか?
アレンドルフ2017

3
以下のためのwinston: ^3.0.0使用winston.createLoggerの代わりにnew winston.Logger
streof

21

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 }));

なぜ結合されていないのですか?
ドロイド、

これを機能させることができなくなりました。入力が間違っているようです。stackoverflow.com/questions/50048193/...
jpetitte

7

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

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

3

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 }));

これは、クラスを作成することにそれほど大きくないので私を助けました。


1

モーガンは、メッセージ\nをs で終わらせるという悪い習慣を持っています。

これは、ウィンストンのフォーマット側など、さまざまな方法で、またはストリームを更新して \n

class MyStream {
    write(text: string) {
        logger.info(text.replace(/\n$/, ''));
    }
}
let myStream = new MyStream()
app.use(morgan('tiny', { stream: myStream }));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.