簡體   English   中英

Google App Engine在kubernetes容器應用中請求樣式日志記錄

[英]Google App Engine request style logging in a kubernetes container app

我需要在自定義Web應用程序中設置日志記錄,該日志記錄理想地與在Google App Engine中運行Web應用程序時發生的魔術匹配

例如,在GAE中,有一個request_log可以查看。 這會將所有日志語句分組到每個請求下,並且每個請求都具有http狀態代碼以及url的端點路徑。 這是一個示例(我在這里對粗略的編輯表示歉意)

在此處輸入圖片說明

在燒瓶應用程序中,我要將其部署到Google Kubernetes Engine,希望獲得相同級別的日志記錄。 問題是我只是不知道從哪里開始。

我已經安裝了google-cloud-logging python庫,並且已經有了一些基本的日志記錄。

在此處輸入圖片說明

..但這不是我想要的水平。

所以問題是-我從哪里開始? 到目前為止,我找到的所有搜索/文檔都不多。

結構化日志

在Stackdriver Logging中, 結構化日志是指使用jsonPayload字段將結構添加到其有效負載的日志條目。 如果您使用Stackdriver Logging API或命令行實用程序gcloud logging,則可以控制有效負載的結構。 這是jsonPayload的示例:

{
     insertId:  "1m9mtk4g3mwilhp"
     jsonPayload: {
      [handler]:  "/"
      [method]:  "GET"
      [message]: "200 OK" 
     }
     labels: {
      compute.googleapis.com/resource_name:  "add-structured-log-resource"
     }
     logName:  "projects/my-sample-project-12345/logs/structured-log"
     receiveTimestamp:  "2018-03-21T01:53:41.118200931Z"
     resource: {
      labels: {
       instance_id:  "5351724540900470204"
       project_id:  "my-sample-project-12345"
       zone:  "us-central1-c"
      }
      type:  "gce_instance"
     }
     timestamp:  "2018-03-21T01:53:39.071920609Z"
    }

您可以使用想要獲取的參數和值設置自己的可自定義jsonPayload,然后將此信息寫入Stackdriver Logs Viewer。

將調試模式設置為True

設置debug = True時,您將可以在調試模式下查看您的應用。 您將能夠看到HTTP請求,因為它們將出現在控制台上以進行調試,然后您可以將這些請求寫入Stackdriver Logs Viewer。 在調試模式下運行的Hello world Flask應用程序的示例。

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run(port='5000', debug=True)

您可以添加Flask日志記錄處理程序 ,如下所示:

import logging
from logging.handlers import RotatingFileHandler

from flask import Flask

app = Flask(__name__)

@app.route('/')
def foo():
    app.logger.warning('A warning occurred (%d apples)', 42)
    app.logger.error('An error occurred')
    app.logger.info('Info')
    return "foo"

if __name__ == '__main__':
    handler = RotatingFileHandler('foo.log', maxBytes=10000, backupCount=1)
    handler.setLevel(logging.INFO)
    app.logger.addHandler(handler)
    app.run()

如您所見,可以通過遵循正確的日志配置來實現此目的。 但是,對於Kubernetes日志,Stackdriver Logs Viewer UI的外觀與App Engine Stackdriver Logs Viewer中的外觀不同。


此外,您還可以在Google Stackdriver中查看合並相關的日志行,因為這樣可以使您更好地了解如何按類別或組對日志進行批處理(如果需要)。

單擊日志面板右上角的“查看選項”>“修改自定義字段”

https://cloud.google.com/logging/docs/view/overview#custom-fields

我在這里寫這是為了讓人們知道我在調查過程中想出了什么。

sllopis提供的信息將我帶到了最接近的解決方案-混合使用結構化日志記錄和重構flask-gcp-log-groups庫中的一些代碼,我能夠將請求記錄在Stackdriver中,並在下面關聯日志行

不幸的是,盡管基於Stackdrivers的剛度,這是迄今為止我能提供的最好的解決方案,但該解決方案仍存在一些漏洞。

每次我鑽研請求時,當Stackdriver搜索並獲取與該請求匹配的所有跟蹤條目時,都會出現“閃爍”。 條目集合越大,刷新所需的時間越長。

僅查看“請求”日志時,無法在相關行中搜索文本。 例如,假設某個請求下方的相關日志條目包含一個帶有文本“ now you see me”的字符串-如果我搜索字符串“ see”,它將不會在搜索結果列表中顯示該請求。

我可能錯過了一些顯而易見的東西,但是我花了很多令人沮喪的日子來嘗試實現您認為應該非常簡單的東西。

理想情況下,我將在每個日志條目中創建一個protoPayload,在其中將一個數組放置在屬性“線”下,類似於Google App Engine進行日志記錄的方式。

但是,由於protoPayload保留用於審核日志,因此似乎沒有做到這一點的方法。

感謝sllopis提供的信息-如果我很快找不到更好的解決方案,我會將答案標記為正確,因為它是最接近的答案,我相信我會達到我想要的目標。

在這種情況下,我很想放棄Stackdriver,轉而使用更好的日志記錄解決方案-歡迎提出任何建議!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM