首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Winston 3记录全栈跟踪?

如何用Winston 3记录全栈跟踪?
EN

Stack Overflow用户
提问于 2017-11-11 05:52:15
回答 6查看 27.3K关注 0票数 47

我的记录器设置如下:

代码语言:javascript
复制
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"
   })
  ]
})

然后我记下一些错误,如下所示:

代码语言:javascript
复制
logger.error(`GET on /history`, { err });

如何通过错误传输记录错误的完整堆栈跟踪?我试着传入err.stack,结果它是未定义的。

谢谢!

EN

回答 6

Stack Overflow用户

发布于 2019-10-21 01:53:01

对于winston版本的3.2.0+,下面会将堆栈跟踪添加到日志输出中:

代码语言:javascript
复制
import { createLogger, format, transports } from 'winston';

const { combine, timestamp, prettyPrint, colorize, errors,  } = format;


const logger = createLogger({
  format: combine(
    errors({ stack: true }), // <-- use errors format
    colorize(),
    timestamp(),
    prettyPrint()
  ),
  transports: [new transports.Console()],
});  

参考:https://github.com/winstonjs/winston/issues/1338#issuecomment-482784056

票数 26
EN

Stack Overflow用户

发布于 2018-09-20 11:53:01

您可以编写一个格式化程序来将error.stack传递给日志。

代码语言:javascript
复制
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 ......"} 

(输出将取决于您的配置)

票数 18
EN

Stack Overflow用户

发布于 2018-11-10 02:37:43

2021年1月14日更新-这在新版本的中不再起作用。

原始答案

@Ming的回答让我在一定程度上做到了这一点,但为了有一个带有错误的字符串描述,这就是我如何让完整的堆栈跟踪在我们的工作中工作的:

代码语言:javascript
复制
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 ...
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47231677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档