【问题标题】:Google Tail log entries: on data event does not receive any messageGoogle Tail 日志条目:关于数据事件未收到任何消息
【发布时间】:2021-10-26 17:34:59
【问题描述】:

我需要使用 Google Logging 来实时登录我的项目(使用 Nodejs/express)。

我发现“尾日志条目”对我有好处,我想将它应用到我的项目中,但是当我尝试应用 google doc (https://cloud.google.com/logging/docs/samples/logging-tail-log-entries) 中的示例代码时,事件 on('data ) 没有收到任何消息。我认为过滤条件并不重要,因为我仍然可以在相同条件下使用 logging.getEntries()。

这是我的示例代码(几乎就像谷歌文档中的示例):

const express = require("express");
const app = express();
const port = process.env.PORT || 5001;

app.use(express.json());

const server = app.listen(port, () => {
    console.log(`Server is up on port ${port}!`);
});

const {Logging} = require('@google-cloud/logging');
const logging = new Logging();

console.log('running tail log entries test');

const stream = logging
  .tailEntries({
    filter: 'timestamp >= "2021-08-26T15:59:51.000Z"',
  })
  .on('error', console.error)
  .on('data', resp => {
    console.log(resp.entries);
    console.log(resp.suppressionInfo);
    // If you anticipate many results, you can end a stream early to prevent
    // unnecessary processing and API requests.
    // stream.end();
  })
  .on('end', () => {
    console.log('log entry stream has ended');
  });

如果有人遇到过这种情况或有相关信息,请分享给我。提前致谢。

更新:

我不知道为什么,但是在我发布之后,源代码可以正常工作。我认为google api有问题,也许已经修复了。

【问题讨论】:

    标签: node.js gcloud google-cloud-logging


    【解决方案1】:

    我可以重现您的问题。

    我对 Node.JS 不熟悉,发现 const stream = .... stream.end() ... 代码很奇怪,但是……就您而言,这是由 Google 发布的。

    const {Logging} = require("@google-cloud/logging");
    const logging = new Logging();
    
    const project = process.env.PROJECT;
    const logName = `projects/${project}/logs/bunyan_log`;
    const log = logging.log(logName);
    
    // Assuming the `logName` need not be duplicated in the `filter`
    const filter = `timestamp>="2021-08-26T00:00:00.000Z"`;
    console.log(filter);
    
    const stream = log
      .tailEntries({
        filter: "",
      })
      .on('close', () => {console.log("closed");})
      .on('pause', () => {console.log("paused");})
      .on("readbale", () => {console.log("readable");})
      .on('resume', () => {console.log("resumed");})
      .on('error', console.error)
      .on('data', resp => {
        console.log("data");
        console.log(resp.entries);
        console.log(resp.suppressionInfo);
        stream.end();
      })
      .on('end', () => {
        console.log('log entry stream has ended');
      });
    
    
    const bunyan = require('bunyan');
    const {LoggingBunyan} = require("@google-cloud/logging-bunyan");
    const loggingBunyan = new LoggingBunyan();
    
    const logger = bunyan.createLogger({
      name: 'test',
      streams: [
        {stream: process.stdout, level: 'info'},
        loggingBunyan.stream('info'),
      ],
    });
    
    setInterval(()=>{
      logger.info("Ping");
    },1000);
    

    有趣的是,我也无法直接调用底层 REST API:

    TOKEN=$(gcloud auth print-access-token)
    
    curl \
    --request POST \
    --header "Authorization: Bearer ${TOKEN}" \
    --header 'Content-Type: application/json' \
    --header 'Accept: application/json' \
    --data "{\"resourceNames\":[\"projects/${PROJECT}\"],\"filter\":\"\"}" \
    https://logging.googleapis.com/v2/entries:tail
    

    产量:

    [{
      "error": {
        "code": 400,
        "message": "Invalid value (Object), ",
        "status": "INVALID_ARGUMENT",
        "details": [
          {
            "@type": "type.googleapis.com/google.rpc.BadRequest",
            "fieldViolations": [
              {
                "description": "Invalid value (Object), "
              }
            ]
          }
        ]
      }
    }
    ]
    

    虽然gcloud 命令有效:

    gcloud logging read "logName=\"projects/${PROJECT}/logs/bunyan_log\" timestamp>=\"2021-08-26T00:00:00.000Z\"" \
    --project=${PROJECT} \
    --format="value(jsonPayload.message)"
    Ping
    Ping
    

    添加--log-http 表明它正在进行类似的调用:

    =======================
    ==== request start ====
    uri: https://logging.googleapis.com/v2/entries:list?alt=json
    method: POST
    == headers start ==
    b'X-Goog-User-Project': b'[[REDACTED]]'
    b'accept': b'application/json'
    b'accept-encoding': b'gzip, deflate'
    b'authorization': --- Token Redacted ---
    b'content-length': b'220'
    b'content-type': b'application/json'
    b'user-agent': b'[[REDACTED]]'
    == headers end ==
    == body start ==
    {"filter": "logName=\"projects/[[PROJECT]]/logs/bunyan_log\" timestamp>=\"2021-08-26T00:00:00.000Z\"", "orderBy": "timestamp desc", "pageSize": 1000, "resourceNames": ["projects/[[PROJECT]]"]}
    == body end ==
    ==== request end ====
    ---- response start ----
    status: 200
    -- headers start --
    Cache-Control: private
    Content-Encoding: gzip
    Content-Type: application/json; charset=UTF-8
    Date: Thu, 26 Aug 2021 20:38:36 GMT
    Server: ESF
    Transfer-Encoding: chunked
    Vary: Origin, X-Origin, Referer
    X-Content-Type-Options: nosniff
    X-Frame-Options: SAMEORIGIN
    X-XSS-Protection: 0
    -- headers end --
    -- body start --
    {
      "entries": [ ... ]
    }
    -- body end --
    total round trip time (request+response): 1.406 secs
    ---- response end ----
    ----------------------
    Ping
    Ping
    
    

    您有办法输出您的代码正在进行的 REST API 调用吗?

    【讨论】:

    • 我不知道为什么,但是在我发布之后,源代码从现在开始可以正常工作。我检查收到的消息,它的数据 type_url 是“type.googleapis.com/google.appengine.logging.v1.RequestLog”。我认为google api有问题,也许它已修复。感谢您的 cmets。
    猜你喜欢
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多