web-dev-qa-db-ja.com

Winston 3でフルスタックトレースを記録する方法は?

私のロガーは次のように設定されています:

const myFormat = printf(info => {
   return `${info.timestamp}: ${info.level}: ${info.message}: ${info.err}`;
 });


 const logger =
   winston.createLogger({
   level: "info",
   format: combine(timestamp(), myFormat),

   transports: [
     new winston.transports.File({
     filename:
      "./logger/error.log",
        level: "error"
    }),
     new winston.transports.File({
       filename:
       "./logger/info.log",
       level: "info"
   })
  ]
})

その後、私はこのようなエラーをログアウトしています:

logger.error(`GET on /history`, { err });

エラートランスポート経由でエラーの完全なスタックトレースを記録するにはどうすればよいですか? err.stackを渡そうとしましたが、未定義として出てきました。

ありがとう!

19
Anthony Xie

@Mingの答えは部分的にそこに来ましたが、エラーのある文字列の説明を得るために、これが私たちのもので動作する完全なスタックトレースを取得した方法です:

import winston from "winston";

const errorStackTracerFormat = winston.format(info => {
    if (info.meta && info.meta instanceof Error) {
        info.message = `${info.message} ${info.meta.stack}`;
    }
    return info;
});

const logger = winston.createLogger({
    format: winston.format.combine(
        winston.format.splat(), // Necessary to produce the 'meta' property
        errorStackTracerFormat(),
        winston.format.simple()
    )
});

logger.error("Does this work?", new Error("Yup!"));

// The log output:
//   error: Does this work? Error: Yup!
//       at Object.<anonymous> (/path/to/file.ts:18:33)
//       at ...
//       at ...
13
Mike Richards

error.stackをログに渡すフォーマッタを作成できます。

const errorStackFormat = winston.format(info => {
  if (info instanceof Error) {
    return Object.assign({}, info, {
      stack: info.stack,
      message: info.message
    })
  }
  return info
})

const logger = winston.createLogger({
  transports: [ ... ],
  format: winston.format.combine(errorStackFormat(), myFormat)
})

logger.info(new Error('yo')) // => {message: 'yo', stack: "Error blut at xxx.js:xx ......"} 

(出力は設定によって異なります)

12
Ming

これが私のlogger.js with winston": "^3.1.0

const { createLogger, format, transports } = require('winston');
const { combine, timestamp, printf, colorize, splat } = format;

const myFormat = printf((info) => {
  if (info.meta && info.meta instanceof Error) {
    return `${info.timestamp} ${info.level} ${info.message} : ${info.meta.stack}`;
  }
  return `${info.timestamp} ${info.level}: ${info.message}`;
});

const LOG_LEVEL = process.env.LOG_LEVEL || 'debug';
const logger = createLogger({
  transports: [
    new (transports.Console)(
      {
        level: LOG_LEVEL,
        format: combine(
          colorize(),
          timestamp(),
          splat(),
          myFormat
        )
      }
    )
  ]
});
module.exports = logger;
3
vanduc1102

logger.error(_GET on /history_、{err});

err変数はエラーオブジェクトですか?

そうでない場合は、new Error().stackを使用してトレースを取得でき、winstonにパスします。

0
Elad