Google Cloud Logging API with Apps Script - 删除日志 - 在此服务器上找不到请求的 URL

Google Cloud Logging API with Apps Script - delete logs - The requested URL was not found on this server

使用 Apps 脚本,我需要删除特定 Google 云项目的 Stackdriver 日志。这应该可以通过 Apps 脚本和 Cloud Logging REST API,使用 DELETE 请求来完成。 Apps 脚本 UrlFetchApp.fetch(url,options) 可以使用 DELETE 方法。下面的代码返回响应代码:404。我之前得到的响应代码是:400,但现在它正在接受 URL 结构,但它找不到 URL。如果 URL 需要日志 ID,那么我不确定从哪里获取日志 ID。我想删除项目中的 所有 日志,而不仅仅是特定的日志。

错误信息:

The requested URL was not found on this server. 

代码:

function deleteStackDriverLogs(po) {
  var httpRz,options,url;

  /*
    po.id = GCP project ID - https://console.cloud.google.com/home/dashboard
  */

  options = {};

  options.method = "delete";
  options.muteHttpExceptions = true;
  options.headers = {Authorization: 'Bearer ' + ScriptApp.getOAuthToken()};
  options.contentType = "application/json";

  url = 'https://logging.googleapis.com/v2/';

  options.payload = JSON.stringify({
    logName: 'projects/' + po.id + "/logs/*"
  });

  httpRz = UrlFetchApp.fetch(url,options);
  Logger.log('response code: ' + httpRz.getResponseCode());

  //Logger.log('httpRz.getAllHeaders(): ' + JSON.stringify(httpRz.getAllHeaders()))
  //Logger.log(httpRz.getContentText())

}

function testDlet() {
  deleteStackDriverLogs({"id":"project-id-your-GCP-id-here"});


}

文档: https://cloud.google.com/logging/docs/reference/v2/rest/v2/logs/delete

如果只使用不带负载的 URL,那么我会收到没有任何解释的响应代码 404。

我尝试了 url 的多种变体。

url = 'https://logging.googleapis.com/v2/logName={projects/' + po.id + '}';//404
url = 'https://logging.googleapis.com/v2/logName=projects/' + po.id + '/';//404
url = 'https://logging.googleapis.com/v2/logName=projects/' + po.id;//404
url = 'https://logging.googleapis.com/v2/logName=projects/' + po.id + '/logs/*/';//400
url = 'https://logging.googleapis.com/v2/logName=projects/' + po.id + '/logs/';//404

文档指出日志 ID 必须是 URL 编码的。但是,我不确定使用什么作为日志 ID。

我相信你的目标如下。

  • 您想使用 Google Apps 脚本删除堆栈驱动程序的日志。

为此,这个答案怎么样?

修改点:

  • 在这种情况下,请检索日志名称以删除日志。
    • 您可以使用 Could Logging API v2.
    • 中的方法 "logs.list" 检索 logName
  • 请使用logName作为端点的路径。

当以上几点反映到你的脚本中,就会变成下面这样。

修改后的脚本:

function deleteStackDriverLogs(po) {

  // --- I added below script.
  const endpoint = `https://logging.googleapis.com/v2/projects/${po.id}/logs`;
  const res = UrlFetchApp.fetch(endpoint, {headers: {authorization: `Bearer ${ScriptApp.getOAuthToken()}`}});
  const obj = JSON.parse(res.getContentText());
  const logName = obj.logNames.filter(e => e.includes("console_logs"))[0];
  /// ---

  var httpRz,options,url;

  /*
    po.id = GCP project ID - https://console.cloud.google.com/home/dashboard
  */

  options = {};

  options.method = "delete";
  options.muteHttpExceptions = true;
  options.headers = {Authorization: 'Bearer ' + ScriptApp.getOAuthToken()};

  url = 'https://logging.googleapis.com/v2/' + logName;  // Modified

  httpRz = UrlFetchApp.fetch(url,options);
  Logger.log('response code: ' + httpRz.getResponseCode());

  //Logger.log('httpRz.getAllHeaders(): ' + JSON.stringify(httpRz.getAllHeaders()))
  //Logger.log(httpRz.getContentText())

}

注:

  • 这是对您的脚本的简单修改。所以请根据您的实际情况进行修改。
  • 此修改后的脚本假设您已经能够使用 Could Logging API v2.
  • 在这种情况下,请在 V8 中使用此脚本。

参考文献: