web-dev-qa-db-ja.com

ウィンストンロガーでノードエラーを記録する方法

私のノードアプリケーションでは、 Winstonjs ロガーを使用します。今日、私のアプリケーションはどういうわけかフリーズしているように見えましたが、何かをログに記録することに失敗しました。アプリケーションを停止して手動で実行すると、このエラーが表示されました

_ReferenceError: totalValue is not defined
_

私は明らかにコードを間違えましたが、ここでの私の主な問題は、Winstonのログからはわからなかったことです。

以下にWinstonの実装を貼り付けました。 log('The log message');を簡単に使用できるように作成しました。しかし、これは発生しているノードエラーをログに記録しません。

発生しているすべてのノードエラーをWinstonログに取得する方法を誰かが知っていますか?

_const myFormat = winston.format.printf(info => {
    return `${info.timestamp} ${info.level}: ${info.message}`;
});
const logger = winston.createLogger({
    level: 'info',
    format: winston.format.combine(winston.format.timestamp(), myFormat),  // winston.format.json(),
    transports: [
        new winston.transports.File({filename: 'logs/error.log', level: 'error'}),
        new winston.transports.File({filename: 'logs/combined.log'}),
    ]
});
function log(message, level='info'){
    if (typeof message === 'object'){
        message = JSON.stringify(message);
    }
    logger[level](message);
}
_
5
kramer65

Winstonは例外をログに記録できます。ドキュメントから: Exceptions

Winstonを使用すると、プロセスからuncaughtExceptionイベントをキャッチしてログに記録できます。独自のロガーインスタンスを使用すると、アプリケーションのライフサイクルの作成時または後で、この動作を有効にできます。

const { createLogger, transports } = require('winston');

// Enable exception handling when you create your logger.
const logger = createLogger({
  transports: [
    new transports.File({ filename: 'combined.log' }) 
  ],
  exceptionHandlers: [
    new transports.File({ filename: 'exceptions.log' })
  ]
});

// Or enable it later on by adding a transport or using `.exceptions.handle`
const logger = createLogger({
  transports: [
    new transports.File({ filename: 'combined.log' }) 
  ]
});

// Call exceptions.handle with a transport to handle exceptions
logger.exceptions.handle(
  new transports.File({ filename: 'exceptions.log' })
4
gforce301

次のように使用するだけです。

_const winston = require('winston');
require('winston-daily-rotate-file');

function getLogger(module) {

var transport = new (winston.transports.DailyRotateFile)({
  filename: './logs/log',
  datePattern: 'yyyy-MM-dd.',
  prepend: true,
  level: process.env.ENV === 'development' ? 'debug' : 'error'
});

const logger = new (winston.Logger)({
  transports: [
    transport
  ]
});
return logger;
}

module.exports = getLogger;
_

それを別のファイルに入れ、使用したい場所で必要に応じて、次のように使用できます。
log.debug('This is debug statement!')
log.error('Logging exception here')

transportオブジェクトのログレベルはいつでも変更でき、それに応じてステートメントがログに記録されます。また、このコードは毎日ファイルをローテーションし、日付に基づいて新しいファイルを作成します。これは単一の大きなファイルを持たないのに役立ちます

1
Anshul Verma