【问题标题】:Plain console.warn() shows up in logs with serverity "ERROR"普通的 console.warn() 显示在日志中,服务器性为“ERROR”
【发布时间】:2019-09-09 14:59:48
【问题描述】:

当我使用console.warn() 记录某些内容时,它似乎出现在 Stackdriver 日志中,严重性为“错误”。 Stackdriver 错误报告未显示这些错误,因此它们似乎不被视为错误。这使得无法过滤日志以仅显示错误。

阅读 Stackdriver 日志 docs 我的印象是,我不应该使用普通的 javascript 控制台函数,而是使用 Bunyan。那是对的吗?我没有读到不该读的地方。

【问题讨论】:

  • 调用console.warn()的代码在哪里运行?
  • Cloud Functions 我肯定知道,可能还有 App Engine。
  • GKE 容器的同样问题

标签: gcloud google-cloud-stackdriver


【解决方案1】:

如果您的日志显示在 Stackdriver Logging 中,那么错误报告至少能够看到它们。从那里开始,还有更多的要求取决于您正在使用的确切内容(例如,如果您只是记录 JSON,它可能需要一个带有 serviceContext 的 reportLocation)。

这可能有用:https://cloud.google.com/error-reporting/docs/formatting-error-messages

另一方面,如果您只是想查看严重性错误日志,那么仅使用 Logging for severity=ERROR 中的高级过滤器可能会满足您的需求?

【讨论】:

  • 我想使用过滤器来只显示错误,但是我用 console.warn() 打印的东西被stackdriver记录为severity=error。
【解决方案2】:

Cloud Functions 仅区分 stdout 和 stderr。

Writing, Viewing, and Responding to Logs 上的文档说“Cloud Functions 默认包含简单的日志记录。写入 stdout 或 stderr 的日志将自动显示”。您引用的日志记录文档页面提到了关于 stdout & stderr being automatic for Cloud Functions 的相同内容。

我的解释是console.warn() 将进入stderr,一旦出现警告和错误之间的区别就会消失。我怀疑你会看到同样的console.debug() 显示为 INFO。使用 stderr 时,我在虚拟机中出现此行为,但我认为 App Engine 没有此问题。

我不认为日志记录页面专门建议使用 Bunyan。它以类似的方式处理 Winston 以及客户端库(在这种情况下,身份验证应该正常工作)。

错误报告对构成要捕获的“错误”有一个特定的概念:https://cloud.google.com/error-reporting/docs/formatting-error-messages

【讨论】:

【解决方案3】:

我从 Google 支持了解到,自 Node 10 以来情况发生了变化(至少对于云功能而言)。Node 8 仍然正确记录,其中 console.info 获取级别信息和 console.warn 获取级别警告,这似乎与我的经验。

在最新版本的 firebase-functions 中,您应该使用 logger library 来编写日志。对于非 Firebase 环境,您可以使用 @google-cloud/logging,这看起来本质上是一样的。然后,您可以完全控制严重性级别以及将额外 JSON 有效负载记录为第二个参数的能力。

也就是说,不要使用原生 Javascript 控制台方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    相关资源
    最近更新 更多