当前位置: 首页 > 知识库问答 >
问题:

winston+PM2记录uncaughtException两次

闾丘正志
2023-03-14

我将winston用于我的NodeJS应用程序,以获得结构化日志记录格式(JSON),稍后我将处理该格式并通过FileBeat发送到Logstash。

按照PM2和12Factor.NET的建议,我使用winston.transports.console传输进行日志记录,并让PM2处理我的ecosystem.json中的stdoutstderr

在我的logger.js模块中,我有以下内容:

"use strict";
const winston = require("winston");
// Remove logging on console
winston.remove(winston.transports.Console);
// env
const env = process.env.NODE_ENV || 'development';
const isDev = env === "development";
// The default Console transport
const defaultLogLevel = isDev ? "debug" : "info";

const consoleTransport = new winston.transports.Console({
    level: defaultLogLevel,
    colorize: true,
    json: true,
    timestamp: true,
    exceptionsLevel: "error",
    prettyPrint: false,
    handleExceptions: true,
    humanReadableUnhandledException: false,
    exitOnError: true
});

const defaultOptions = {
    transports: [
    consoleTransport
    ]
};


module.exports = function(options)
{
    let initOpts = defaultOptions;
    if(options)
    {
        Object.assign(initOpts, options);
    }
    const logger = new winston.Logger(initOpts);
    // suppress any logger errors
    logger.emitErrs = false;
    winston.handleExceptions(consoleTransport);

    return logger;
};

在我的主应用程序文件server.js中,我运行以下代码来模拟抛出的未处理异常,需要一个假的依赖项,但没有找到:

"use strict";
var log         = require('./logger')({name: "api-messages"});
log.info("some info message");
log.error("some error message");
var notFound = require("someInexistentPackage");

最后,在我的PM2ecosystem.json中有以下内容:

{
  "apps":
  [
    {
      "name"            : "my-app",
      "script"          : "server.js",
      "max_restarts"    : 1,
      "error_file"      : "~/.pm2/logs/my-app.log",
      "out_file"        : "~/.pm2/logs/my-app.log",
      "merge_logs"      : true

    }
  ]
}

当我运行PM2 start ecosystem.json时,日志文件的内容如下:

{
  "level": "info",
  "message": "some info message",
  "timestamp": "2017-06-08T16:10:05.967Z"
}
{
  "level": "error",
  "message": "some error message",
  "timestamp": "2017-06-08T16:10:05.968Z"
}
Error: Cannot find module 'someInexistentPackage'
    at Function.Module._resolveFilename (module.js:470:15)
    at Function.Module._load (module.js:418:25)
    at Module.require (module.js:498:17)
    at require (internal/module.js:20:19)
    at Object.<anonymous> (/Users/mps/Sites/my-app/server.js:10:20)
    at Module._compile (module.js:571:32)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:488:32)
    at tryModuleLoad (module.js:447:12)
    at Function.Module._load (module.js:439:3)
{
  "date": "Thu Jun 08 2017 13:10:05 GMT-0300 (-03)",
  "process": {
    "pid": 50862,
    "uid": 501,
    "gid": 20,
    "cwd": "/Users/mps/Sites/my-app",
    "execPath": "/Users/mps/.nvm/versions/node/v7.10.0/bin/node",
    "version": "v7.10.0",
    "argv": [
      "/Users/mps/.nvm/versions/node/v7.10.0/bin/node",
      "/Users/mps/.nvm/versions/node/v7.10.0/lib/node_modules/pm2/lib/ProcessContainerFork.js"
    ],
    "memoryUsage": {
      "rss": 36724736,
      "heapTotal": 9879552,
      "heapUsed": 6309680,
      "external": 63983
    }
  },
  "os": {
    "loadavg": [
      2.49560546875,
      2.228515625,
      2.0205078125
    ],
    "uptime": 329559
  },
  "trace": [
    {
      "column": 15,
      "file": "module.js",
      "function": "Module._resolveFilename",
      "line": 470,
      "method": "_resolveFilename",
      "native": false
    },
    {
      "column": 25,
      "file": "module.js",
      "function": "Module._load",
      "line": 418,
      "method": "_load",
      "native": false
    },
    {
      "column": 17,
      "file": "module.js",
      "function": "Module.require",
      "line": 498,
      "method": "require",
      "native": false
    },
    {
      "column": 19,
      "file": "internal/module.js",
      "function": "require",
      "line": 20,
      "method": null,
      "native": false
    },
    {
      "column": 20,
      "file": "/Users/mps/Sites/my-app/server.js",
      "function": null,
      "line": 10,
      "method": null,
      "native": false
    },
    {
      "column": 32,
      "file": "module.js",
      "function": "Module._compile",
      "line": 571,
      "method": "_compile",
      "native": false
    },
    {
      "column": 10,
      "file": "module.js",
      "function": "Module._extensions..js",
      "line": 580,
      "method": ".js",
      "native": false
    },
    {
      "column": 32,
      "file": "module.js",
      "function": "Module.load",
      "line": 488,
      "method": "load",
      "native": false
    },
    {
      "column": 12,
      "file": "module.js",
      "function": "tryModuleLoad",
      "line": 447,
      "method": null,
      "native": false
    },
    {
      "column": 3,
      "file": "module.js",
      "function": "Module._load",
      "line": 439,
      "method": "_load",
      "native": false
    }
  ],
  "stack": [
    "Error: Cannot find module 'someInexistentPackage'",
    "    at Function.Module._resolveFilename (module.js:470:15)",
    "    at Function.Module._load (module.js:418:25)",
    "    at Module.require (module.js:498:17)",
    "    at require (internal/module.js:20:19)",
    "    at Object.<anonymous> (/Users/mps/Sites/my-app/server.js:10:20)",
    "    at Module._compile (module.js:571:32)",
    "    at Object.Module._extensions..js (module.js:580:10)",
    "    at Module.load (module.js:488:32)",
    "    at tryModuleLoad (module.js:447:12)",
    "    at Function.Module._load (module.js:439:3)"
  ],
  "level": "error",
  "message": "uncaughtException: Cannot find module 'someInexistentPackage'",
  "timestamp": "2017-06-08T16:10:05.972Z"
}

如您所见,PM2正在将未捕获的异常添加到日志文件中,即以下代码:

Error: Cannot find module 'someInexistentPackage'
    at Function.Module._resolveFilename (module.js:470:15)
    at Function.Module._load (module.js:418:25)
    at Module.require (module.js:498:17)
    at require (internal/module.js:20:19)
    at Object.<anonymous> (/Users/mps/Sites/my-app/server.js:10:20)
    at Module._compile (module.js:571:32)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:488:32)
    at tryModuleLoad (module.js:447:12)
    at Function.Module._load (module.js:439:3)

这打破了日志的格式/结构,因为它是纯文本,而不是我从Winston收到的格式化的JSON。

我确信这是PM2问题/配置错误,因为如果我运行节点server.js,控制台输出只是JSON对象

我想出的唯一选择(我还没有尝试过)是将winston传输更改为winston.transports.file,将所有日志重定向stdout,并告诉PM2将stderr保存在另一个文件中,但我宁愿使用控制台aproach。

共有1个答案

谷梁翰飞
2023-03-14

防止PM2记录uncaughtexception的一种方法是将--no-pmx作为标志传递,即PM2 start--no-pmx myapp.js或将pmx:false添加到ecosystem.json文件中。

这将禁用PMX注入PM2,PM2负责记录此uncaughtException

 类似资料:
  • 问题内容: 我想在我的应用程序中将slf4j + logback用于两个目的-日志和审计。 对于日志记录,我以常规方式记录日志: 对于审计,我创建一个特殊的命名记录器并登录到它: 登录配置: 问题:通过审核记录器记录的消息出现两次-一次在AUDIT_LOGGER下,一次在根记录器下。 14:41:57.975 [main]调试com.gammay.example.Main–> main() 14:

  • 问题内容: 我刚刚实现了Winston Logging,它可以按预期工作,但是遇到了一些我找不到答案的问题。 据我所知,winston的工作方式是设置的日志级别,以及使用优先级以下的任何东西,例如出错时,它还将包括信息日志等。是否有一种创建特定日志级别的方法可以称之为HTTP还是db,我只将http或db事件记录到日志中,而它们并没有出现在合并的文件或控制台中? 问题答案: 更好的解决方案是使用具

  • 我想在我的应用程序中使用SLF4J+logback用于两个目的--日志和审计。 14:41:57.978[main]信息AUDIT_LOGGER-110欢迎使用main 如何确保审核消息在审核记录器下只出现一次?

  • 我们有一个spring批处理程序,它可以访问读卡器中的一组数据,对其进行处理和写入。这一切都是成批发生的。 我注意到,处理器和写入程序对同一数据进行了两次检查,一次作为批处理,一次作为单个记录。 例如:写入器读取1000条记录,向处理器发送1000条记录,向写入器发送1000条记录。 在此之后,记录再次被单独处理,但只调用处理器和写入器。 我们在所有读卡器、处理器和写入程序中都有日志语句,我可以看

  • koa2-winston koa2 version winston logger like express-winston Add logger to your koa2 server in 3 lines 中文介绍 koa2-winston Usage Installation Quick Start Configuration Examples Do not record any reques