GCP,nodejs读取云功能日志时,stdout为空

时间:2018-09-13 13:12:03

标签: javascript google-cloud-platform google-cloud-functions

这是我的nodejs代码:

const cp = require('child_process');

describe('cloud function test suites', () => {
  describe('deleteCampaign test suites', () => {
    const cloudFunctionName = 'deleteCampaign';
    it('should print campaign data', () => {
      const campaign = { id: '1' };
      const encodedCampaign = Buffer.from(JSON.stringify(campaign)).toString(
        'base64',
      );
      const data = JSON.stringify({ data: encodedCampaign });

      const executeResultOutput = cp
        .execSync(
          `gcloud beta functions call ${cloudFunctionName} --data '${data}'`,
        )
        .toString();

      const executionId = executeResultOutput.split(': ')[1];

      const logs = cp
        .execSync(
          `gcloud beta functions logs read ${cloudFunctionName} --execution-id ${executionId}`,
        )
        .toString();

      console.log(logs);

      expect(logs).toContain('campaign:  {"id":"1"}');
    });
  });
});

我想将日志打印到stdout,但是日志为空字符串。

但是当我使用gcloud命令行读取日志时,就可以了。标准输出正确:

gcloud beta functions logs read deleteCampaign --execution-id ee5owvtzlekc
LEVEL  NAME            EXECUTION_ID  TIME_UTC                 LOG
D      deleteCampaign  ee5owvtzlekc  2018-09-13 12:46:17.734  Function execution started
I      deleteCampaign  ee5owvtzlekc  2018-09-13 12:46:17.738  campaign:  {"id":"1"}
D      deleteCampaign  ee5owvtzlekc  2018-09-13 12:46:17.742  Function execution took 9 ms, finished with status: 'ok'

我使用jestnodejs为我的云功能编写一些测试。为什么日志是空字符串?

1 个答案:

答案 0 :(得分:0)

您要获取的字符串为空,因为生成日志需要更多时间。即使Google Cloud Function已经完成执行,您也必须等待几秒钟才能准备好日志。

阅读代码,您不会让这种情况发生,因此您得到的是空字符串。

我注意到阅读您的代码的第一件事是这一部分:

const executionId = executeResultOutput.split(': ')[1];

我了解您要提取Google Cloud Function的执行ID。我在这里遇到了问题,因为该字符串不仅限于执行ID,还包括换行符和单词“ result”。我确保使用下面的代码提取必要的执行ID:

const executionId = executeResultOutput.split(':')[1]; //We get the GCP ID. 
const executionId2 = executionId.split("\n")[0].toString(); //removing the right part of the string. 

如果您找到了没有问题的获取执行ID的方法,请忽略我的代码。

在下面,您可以找到对我实现功能有用的代码。

let cloudFunctionLog ='';

function getLogs(){
    console.log('Trying to get logs...');
    const logs = cp
    .execSync(`gcloud beta functions logs read ${cloudFunctionName} --execution-id ${executionId2}`);
    return logs;
}

do{
    cloudFunctionLog=getLogs();
    if(!cloudFunctionLog){
        console.log('Logs are not ready yet...');
    }else{
        console.log(`${cloudFunctionLog}`);
    }
}while(!cloudFunctionLog);//Do it while the string comes empty.

当日志不再为空时,它们将显示在您的控制台中。