วิธีรับบันทึกด้วย Stackdriver Logging API

ฉันกำลังพัฒนาแชทบอทโดยใช้ Dialogflow และฉันจำเป็นต้องได้รับบันทึกการสนทนาทั้งหมดจากมัน

ฉันตรวจสอบหน้านี้ และฉัน เดาว่ามันสามารถทำได้โดยใช้ Stackdriver Logging api

ฉันอ้างถึงหน้าด้านล่างและลองแล้ว แต่เมื่อใช้ API นี้ เกิดข้อผิดพลาด 403 https://cloud.google.com/logging/docs/reference/v2/rest/v2/logs/list

ฉันใช้สิ่งนี้ในทางที่ผิดหรือไม่?

ฉันจะแก้ไขปัญหานี้ได้อย่างไร?

นี่คือข้อความแสดงข้อผิดพลาด

{
  "error": {
    "code": 403,
    "message": "The request is missing a valid API key.",
    "status": "PERMISSION_DENIED"
  }
}

นี่คือรหัสของฉันที่ใช้เรียก api ฉันใช้สคริปต์ของ Google Apps

function getLogs() {
  //XXXXXXXX is my project_id
  var output = UrlFetchApp.fetch('https://logging.googleapis.com/v2/projects/XXXXXXXX/logs');
  Logger.log(output)
}

person SasuraiNoTsuba    schedule 15.02.2020    source แหล่งที่มา
comment
ในขั้นตอนปัจจุบัน เพื่อให้บรรลุเป้าหมาย จำเป็นต้องสร้างโปรเจ็กต์ Google Apps Script และ Cloud Platform Project จากนั้นจึงจำเป็นต้องลิงก์โปรเจ็กต์เหล่านั้น ด้วยเหตุนี้ Stackdriver API จึงสามารถเปิดใช้งานและใช้งานได้ เนื่องจากค่าผลลัพธ์ วิธีการของ Method: logs.list ที่คุณพยายามใช้คือ Lists the logs in projects, organizations, folders, or billing accounts. Only logs that have entries are listed. ค่าผลลัพธ์นี้เป็นสิ่งที่คุณต้องการหรือไม่? ฉันขอถามคุณว่าเมื่อคุณทดสอบแล้ว ลองใช้ API นี้ที่ลิงก์ที่คุณแสดง คุณจะสามารถดึงผลลัพธ์ที่ต้องการได้หรือไม่   -  person Tanaike    schedule 15.02.2020
comment
ขอบคุณสำหรับคำแนะนำ. ฉันเดาว่าสคริปต์ Google Apps ของฉันและแพลตฟอร์ม Google Cloud ได้รับการเชื่อมโยงแล้วเนื่องจากมีการแสดงโครงการแพลตฟอร์มที่เชื่อมโยงได้ ฉันตรวจสอบทางด้านล่างแล้ว เมนูสคริปต์ของแอป › ทรัพยากร › สามารถจัดทำโครงการแพลตฟอร์มได้ ฉันจะวางผลลัพธ์ของลองใช้ API นี้ในความคิดเห็นถัดไป   -  person SasuraiNoTsuba    schedule 15.02.2020
comment
แต่เมื่อยกเลิกการเลือก Google OAuth2.0 ข้อผิดพลาด 403 เดียวกันก็ปรากฏขึ้น   -  person SasuraiNoTsuba    schedule 15.02.2020
comment
คุณต้องส่งส่วนหัวการอนุญาตด้วยโทเค็นผู้ถือ (สามารถดึงมาจากคลาส ScriptApp)   -  person TheMaster    schedule 15.02.2020
comment
ขอบคุณสำหรับการตอบกลับ เกี่ยวกับการดึงข้อมูล logNames ในการตอบกลับของคุณ พบว่าลองใช้ API นี้ใช้งานได้ เกี่ยวกับ when uncheck "Google OAuth2.0" the same 403 error displayed ฉันไม่เข้าใจ โดยเฉพาะฉันไม่เข้าใจเกี่ยวกับ same 403 คุณช่วยอธิบายรายละเอียดได้ไหม?   -  person Tanaike    schedule 15.02.2020
comment
หากโปรเจ็กต์ GAS ของคุณเชื่อมโยงกับโปรเจ็กต์ Cloud Platform แล้วและกำหนดขอบเขตที่ต้องการแล้ว คุณสามารถดึงค่าจากวิธีการของ logs.list ที่คุณต้องการใช้โดยใช้สคริปต์ของ var res = UrlFetchApp.fetch('https://logging.googleapis.com/v2/projects/XXXXXXXX/logs', {headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()}}); สิ่งนี้ถูกกล่าวถึงแล้วโดยความคิดเห็นของ @TheMaster   -  person Tanaike    schedule 15.02.2020
comment
ขออภัยสำหรับภาษาอังกฤษที่ไม่ดีของฉัน but when uncheck "Google OAuth2.0" the same 403 error displayed. นี่หมายความว่าลองใช้ API นี้มีข้อมูลรับรอง เมื่อตรวจสอบ Google OAuth2.0 ส่งคืน 200 แต่เมื่อยกเลิกการเลือก จะส่งคืนข้อผิดพลาด 403 { "error": { "code": 403, "message": "The caller does not have permission", "status": "PERMISSION_DENIED" } } ฉันเลยสงสัยว่าการตั้งค่า OAuth ของฉันไม่ถูกต้อง   -  person SasuraiNoTsuba    schedule 15.02.2020
comment
@TheMaster san, @Tanaike san ขอบคุณสำหรับการตอบกลับของคุณ ฉันเพิ่มส่วนหัวและดำเนินการ แล้วข้อผิดพลาดนี้ก็ปรากฏขึ้น { "error": { "code": 403, "message": "Request had insufficient authentication scopes.", "status": "PERMISSION_DENIED" } }   -  person SasuraiNoTsuba    schedule 15.02.2020
comment
สิ่งนี้ตอบคำถามของคุณหรือไม่? Stackdriver Logging API ส่งคืนรหัสตอบกลับ 200 แต่การตอบสนอง ว่างเปล่า   -  person TheMaster    schedule 15.02.2020
comment
@TheMaster san, Tanaike san ฉันได้แก้ไขมันแล้ว ฉันเพิ่มคีย์ API ใน httprequest และเพิ่มขอบเขต oauth ใน appsscript.json ฉันจะวางรหัสคงที่เพื่อตอบคอลัมน์ ฉันขอขอบคุณสำหรับความร่วมมือของคุณ!!   -  person SasuraiNoTsuba    schedule 17.02.2020


คำตอบ (1)


ฉันแก้ไขด้วยวิธีนี้แล้ว

  1. เพิ่มคีย์ api ของฉันไปยังคำขอ http
var options = {headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()}};
var logs = UrlFetchApp.fetch("https://logging.googleapis.com/v2/projects/XXXXXXXX/logs?key=my_api_key", options)
  1. เพิ่มขอบเขตให้กับ appscript.json
"oauthScopes": ["https://www.googleapis.com/auth/cloud-platform","https://www.googleapis.com/auth/script.external_request"]

จากนั้นฉันพบว่าวิธี logs.list ไม่เหมาะสมกับเป้าหมายของฉัน ฉันจึงต้องเปลี่ยนเป็นวิธี v2.entries

function getLogs(){
var options = {
    method: "post",
    contentType: "application/json",
    headers: {Authorization: 'Bearer ' + ScriptApp.getOAuthToken()},
    payload: JSON.stringify({
      resourceNames: ['projects/XXXXXXX'],
      filter: "timestamp >= searchdate",
      orderBy: "timestamp desc",
      pageSize: 1,
    }),
  }

  var logs = UrlFetchApp.fetch("https://logging.googleapis.com/v2/entries:list?key=my_api_key", options);
  Logger.log(logs);

}
person SasuraiNoTsuba    schedule 17.02.2020