2017-04-18 55 views
6

我正在嘗試爲我的Google Cloud Platform應用程序傳輸日誌。我注意到的第一件事是Google至少每秒發送約10個健康檢查,所以我必須grep -v /health才能獲得任何有用的信息。那是標準嗎?「gcloud應用程序日誌尾部」顯示一週的舊數據

第二件事是它流出舊的日誌。我正在運行gcloud app logs tail -s default,並從4月11日(此時爲一週)獲取日誌。較新的日誌(從4天,3天和2天前開始)在數小時內緩慢流入。我只是刷新我的應用程序(觸發日誌消息),並沒有看到新的日誌。

有什麼方法可以獲得新的日誌消息的接近實時(幾分鐘或幾小時內)的視圖?

+1

有同樣的問題。你有沒有發現任何東西? 正在嘗試清除日誌 'gcl​​oud beta日誌記錄日誌列表' 'gcl​​oud beta日誌記錄日誌刪除LOG_NAME' –

回答

0

對於healthchecks,您不需要依賴grep。該SDK有included filters,所以你可以只過濾輸出。但是,您只需將它們隱藏在終端上,但SDK仍然可以從API獲取它們(就像使用grep一樣)。更好的方法是使用gcloud logging read 'resource.type="gae_app" AND logName:"logs/appengine.googleapis.com%2Frequest_log" AND protoPayload.resource!="/health"' --order desc,因爲您只會請求與自定義過濾器匹配的日誌。這給出了相當詳細的日誌,因此您可以根據需要使其format the output directly on the SDKgcloud app logs tail相似。

由於gcloud logging沒有一個「尾巴」模式,你可以把它包在watch像:

watch 'gcloud logging read "resource.type=\"gae_app\" AND logName:\"logs/appengine.googleapis.com%2Frequest_log\" AND protoPayload.resource!=\"/health\"" --order desc --limit 1' 

您應該添加--format標誌,使輸出滿足您的需求,並--limit標誌這對你來說是有意義的(限制越大,響應越慢)。

關於日誌開始的時間,如果您運行gcloud app logs tail -s default --log-http並將SDK完成的請求與API上可用的過濾器進行比較,您會看到爲什麼它開始顯示一週之前的日誌。

我認爲在你的情況下,最好的選擇是直接打電話給API,包裝在watch

直接的API調用還允許您添加自定義過濾器並使用field mask,僅返回相關的日誌條目和字段,使其對網絡的響應更少,響應速度更快。

首先,您必須創建一個log filter,它將只返回您想要的日誌(沒有健康檢查或監控垃圾郵件)。執行此操作的最佳方法是在console itself中進行測試,直到您對顯示的日誌滿意爲止。

然後你檢查你感興趣的字段。對於GAE日誌,很可能你只需要protoPayload(並且只有那些有效載荷的一些字段,但是可以在以後被過濾)。

所以我們構建我們的API調用循環下列方式(警告:報價逃脫地獄):

watch -tcn 0.5 'curl -H"Authorization: Bearer $(gcloud auth print-access-token)" \ 
    -H"Content-Type: application/json" \ 
    "https://logging.googleapis.com/v2/entries:list?fields=entries%2FprotoPayload" \ 
    -d"{ 
    \"filter\":\"resource.type=\\\"gae_app\\\" 
       logName=\\\"projects/$(gcloud config get-value project)/logs/appengine.googleapis.com%2Frequest_log\\\"\", 
    \"pageSize\":$(tput lines), 
    \"orderBy\":\"timestamp desc\", 
    \"resourceNames\": [ 
     \"projects/$(gcloud config get-value project)\" 
    ] 
}" 2>\dev\null |jq -cC ".entries[].protoPayload | { timestamp: .startTime, method, status, latency, URL: (.host + .resource) }"' 

作爲一個快速測試,我通過管道將jq響應格式化輸出和限制響應大小與屏幕大小有關,但是您應該將其調整爲使您更容易閱讀的字段和輸出。

相關問題