GAE node.js控制台中的console.error()不以ERROR日志级别记录

9
  • 谷歌应用引擎标准版
  • 运行时:nodejs10

我不确定为什么会出错,因为这看起来很简单。根据应用引擎标准版文档

console.error('message');

在Stackdriver日志查看器中,应该将日志级别设置为ERROR。然而,我发现日志级别被设置为“任何日志级别”。看起来正确的是它正在记录到stderr,正如从logName所见。

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

引用如下:
使用console.log()console.error()函数可以从您的Node.js应用程序中发出日志项,它们具有以下日志级别:
- 使用console.log()发出的项目具有INFO日志级别。 - 使用console.error()发出的项目具有ERROR日志级别。 - 内部系统消息具有DEBUG日志级别。
我最初尝试使用winston与Stackdriver(使用@google-cloud/logging-winston)一起工作,以获得更精细的日志记录级别,但现在我甚至无法使用基本的console.log()console.error()进行INFOERROR日志记录。
希望我不必编写疯狂的自定义传输来使用普通的console.error()

我也遇到了同样的问题。你解决了吗? - Darshan Devrai
1
@DarshanDevrai 抱歉,我还没有。我已经把这个问题放在了后面,但是希望能够重新审视它。如果我找到了解决方案或者谷歌提供了一些支持,我会很乐意回答自己的问题。 - ahong
我重新查看了文档,似乎这可能不可能实现。不确定我第一次是否错过了这个,或者他们最近添加了它(最后更新于2019年9月17日)。现在它说“使用stdout输出应用程序日志,stderr输出错误。这些文件会自动收集,并且可以在日志查看器中查看。请注意,这不提供可用于在日志查看器中进行过滤的日志级别; 但是,日志查看器确实提供其他过滤功能,例如文本、时间戳等。”重点在我这里。文档有点自相矛盾。 - ahong
3个回答

3
tl;dr - 不支持。

更长的回答

看起来谷歌自我发布问题以来更新了他们的文档。他们澄清了写入 stdoutstderr 的内容会被收集,但:

不提供可用于过滤 Logs Viewer 的日志级别

很好,我有了一个答案:"不,console.log()console.error() 没有日志级别。" 这似乎与下一段话相矛盾。如果我理解错误或解释不当,请在评论中指出。

我截图了文档,并指出了我的问题,以防他们再次更新: Google App Engine Documentation on Logging

解决方案

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


3
尝试了几个小时后,我终于搞定了。 我按照文档使用了Winston,文档链接是https://cloud.google.com/logging/docs/setup/nodejs#using_winston
然后在Stackdriver日志查看器中,我从下拉菜单中选择了winston_log,就像这样 - enter image description here 现在它显示错误日志了。
Bunyan也可以这样操作。您需要选择Bunyan的bunyan_log
希望这对某些人有所帮助 :)

我来试试!stderr或者普通的console.error不会以错误级别记录吗? - ahong
我知道根据文档,stderr或纯console.error应该记录错误级别,但在我的情况下只有Winston和Bunyan这样做。 - Darshan Devrai
1
看起来他们自从我上次阅读文档以来已经编辑过了,现在有些地方有矛盾。 - ahong
1
Darshan,感谢你的回答。我已经点赞了它,但决定更直接地回答这个问题。 - ahong

1

这里的这里这里文档在记录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。其次,您的第一个链接是关于“报告错误”的,这是一种不同于日志记录的服务,因此它们不会冲突。 - ahong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接