【问题标题】:GAE node.js console.error() not logging as ERROR log levelGAE node.js console.error() 未记录为 ERROR 日志级别
【发布时间】:2019-06-06 16:15:16
【问题描述】:
  • 谷歌应用引擎标准
  • 运行时:nodejs10

我不知道我是怎么搞砸的,因为它看起来很简单。根据app engine standard documentation

console.error('message');

在 Stackdriver 日志查看器中应该有 ERROR 日志级别。但是,我看到日志级别设置为“任何日志级别”。从logName 可以看出,它正在记录到stderr,这似乎是正确的。

logName:  "projects/my-project-name/logs/stderr"  

引用:

要从您的 Node.js 应用发出日志项,您可以使用 console.log()console.error() 函数,它们具有 以下日志级别:

  • 使用console.log() 发出的项目具有INFO 日志级别。
  • 使用console.error() 发出的项目具有ERROR 日志级别。
  • 内部系统消息具有 DEBUG 日志级别。

我最初试图让 winston 与 Stackdriver 一起工作(使用 @google-cloud/logging-winston)以获得更精细的日志记录级别,但现在我什至无法让它登录到 INFOERROR 带有基本的console.log()console.error()

希望我不必为了使用普通的console.error() 而写crazy custom transport

【问题讨论】:

  • 我也面临同样的问题。你搞定了吗?
  • @DarshanDevrai 抱歉,我没有。我已经把这个问题放在次要位置,但希望重新审视它。如果我找到解决方案或者如果谷歌提供了一些支持,我会很乐意回答我自己的问题。
  • 我重新访问了文档,看来这可能是不可能的。不确定我是第一次错过还是他们最近添加了它(最后更新于 2019 年 9 月 17 日)。它现在显示“使用 stdout 编写应用程序日志作为输出,使用 stderr 编写错误。这些文件是自动收集的,可以在日志查看器中查看。请注意,这不提供可用于过滤的日志级别日志查看器;但是,日志查看器确实提供其他过滤,例如文本、时间戳等。”强调我的。 Doc 有点自相矛盾。

标签: javascript node.js google-app-engine logging stackdriver


【解决方案1】:

尝试了几个小时后,我得到了它的工作。 我按照文档https://cloud.google.com/logging/docs/setup/nodejs#using_winston 使用了温斯顿。

然后在 stackdriver 日志查看器中,我从下拉列表中选择了 winston_log,如下所示 -

它现在显示错误日志。

这也适用于班扬。您必须为 Bunyan 选择 bunyan_log

希望这对某人有帮助:)

【讨论】:

  • 我试试看! stderr 或普通的console.error 不会以错误级别记录吗?
  • 我知道 stderr 或普通 console.error 应该按照文档记录在错误级别,但在我的情况下,只有 Winston 和 Bunyan 会这样做。
  • 查看我对自己问题的评论。看起来他们在我上次阅读文档后编辑了这些文档,现在它有点自相矛盾。
  • 达山感谢您的回答。我投了赞成票,但决定更直接地回答这个问题。
【解决方案2】:

tl;dr - 不支持。

更长的答案

所以自从我发布我的问题以来,Google 似乎已经更新了他们的文档。他们已经澄清,写信给stdoutstderr 会被收集,但是:

不提供可用于在日志查看器中过滤的日志级别

很高兴我有一个答案:“不,console.log()console.error() 不会有日志级别。”这种与下一段相矛盾。我可能误读或误解了文档,如果是这种情况,请发表评论。

我截取了文档的屏幕截图,指出我指的是什么,以防他们再次更新:

解决方案

将 Google 支持的日志库之一与 Stackdriver 日志传输一起使用,例如 @darshan-devrai 的答案。如果您不想更改所有console.log()console.error() 等,只需将控制台记录器别名为您选择的记录器(类似于此stackoverflow answer)。

【讨论】:

    【解决方案3】:

    文档 herehere 在记录 console.error 的方式方面似乎存在冲突。

    在我的例子中,打印一个简单的对象效果很好:

    let gcloudError = {
            severity: 'ERROR',
            message: 'Error in country ' + country + ' ' + JSON.stringify(err.message)
          }
    console.error(JSON.stringify(gcloudError));
    

    这将显示为:

    【讨论】:

    • 感谢您的贡献。首先,您发布的链接是关于 Cloud Functions 的,它是与 App Engine 不同的 PaaS。其次,您的第一个链接是关于“报告错误”的,它是与日志记录不同的服务,因此它们不会冲突。
    猜你喜欢
    • 2020-04-16
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 2014-12-03
    • 1970-01-01
    相关资源
    最近更新 更多