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 中使用此脚本。
参考文献:
使用 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 中使用此脚本。