Google Kubernetes 容器应用程序中的 App Engine 请求样式日志记录
Google App Engine request style logging in a kubernetes container app
我需要在自定义 Web 应用程序中设置日志记录,理想情况下它会匹配 运行 Google 应用程序引擎
中的 Web 应用程序时发生的魔力
比如GAE中有一个request_log可以查看。这会将每个请求下的所有日志语句组合在一起,并且每个请求都有 http 状态代码以及 url 的端点路径。这是一个例子(我为这里的粗略编辑提前道歉)
在我部署到 Google Kubernetes Engine 的烧瓶应用程序中,我希望获得相同级别的日志记录。麻烦的是我只是不知道从哪里开始。
我已经安装了 google-cloud-logging python 库,并且有一些像这样的基本日志记录....
..但这远不是我想要的水平。
所以问题是 - 我从哪里开始??到目前为止,我发现的任何搜索/文档都不足。
单击日志面板右上角的 "View options" > "Modify Custom fields"
https://cloud.google.com/logging/docs/view/overview#custom-fields
结构化日志记录
In Stackdriver Logging, structured logs refer to log entries that use the jsonPayload field to add structure to their payloads. If you use the Stackdriver Logging API or the command-line utility, gcloud logging, you can control the structure of your payloads. Here's an example of what a jsonPayload would look like:
{
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
When setting debug=True, you will be able see your app in debugging mode. You will be able to see the HTTP requests, as they will appear on your console for debugging purposes, which you could then write these requests to Stackdriver Logs Viewer. An example of a Hello world Flask app running in Debug mode.
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run(port='5000', debug=True)
您可以添加一个 Flask logging handler,如下所示:
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 日志查看器 UI 与 App Engine Stackdriver 日志查看器看起来不一样。
此外,您还可以查看 Combining correlated log lines in Google Stackdriver,因为它会让您更好地了解如何在需要时按类别或组对日志进行批处理。
我在这里写这篇文章是为了让人们知道我在调查过程中得出的结论。
sllopis 提供的信息让我找到了最接近的解决方案——混合使用结构化日志记录和重构 flask-gcp-log-groups 库中的一些代码,我能够使用 Stackdriver 记录请求下面相关的日志行
不幸的是,这个解决方案有一些漏洞,使其远非理想,尽管它是迄今为止我能根据 Stackdrivers 刚性提出的最佳解决方案。
每次我深入研究一个请求时,都会有一个 "flash",因为 Stackdriver 会搜索并获取与该请求匹配的所有跟踪条目。条目集合越大,闪存完成所需的时间就越长。
仅查看 "request" 日志时无法在相关行中搜索文本。例如,假设请求下的相关日志条目有一个字符串,文本为 "now you see me" - 如果我搜索字符串 "see",它不会在搜索结果列表中显示该请求。
我可能遗漏了一些明显的东西,但我花了几天非常令人沮丧的时间来尝试实现你认为应该非常简单的东西。
理想情况下,我会为每个日志条目创建一个 protoPayload,其中我会在 属性 "line" 下放置一个数组,类似于 Google App Engine 进行日志记录的方式。
然而,似乎没有办法做到这一点,因为 protoPayload 是为审计日志保留的。
感谢 sllopis 提供的信息 - 如果我没有尽快找到更好的解决方案,我会将答案标记为正确,因为它是我相信我会达到我想要实现的最接近的答案。
鉴于这种情况,我很想放弃 Stackdriver,转而采用更好的日志记录解决方案 - 欢迎提出任何建议!
我需要在自定义 Web 应用程序中设置日志记录,理想情况下它会匹配 运行 Google 应用程序引擎
中的 Web 应用程序时发生的魔力比如GAE中有一个request_log可以查看。这会将每个请求下的所有日志语句组合在一起,并且每个请求都有 http 状态代码以及 url 的端点路径。这是一个例子(我为这里的粗略编辑提前道歉)
在我部署到 Google Kubernetes Engine 的烧瓶应用程序中,我希望获得相同级别的日志记录。麻烦的是我只是不知道从哪里开始。
我已经安装了 google-cloud-logging python 库,并且有一些像这样的基本日志记录....
..但这远不是我想要的水平。
所以问题是 - 我从哪里开始??到目前为止,我发现的任何搜索/文档都不足。
单击日志面板右上角的 "View options" > "Modify Custom fields"
https://cloud.google.com/logging/docs/view/overview#custom-fields
结构化日志记录
In Stackdriver Logging, structured logs refer to log entries that use the jsonPayload field to add structure to their payloads. If you use the Stackdriver Logging API or the command-line utility, gcloud logging, you can control the structure of your payloads. Here's an example of what a jsonPayload would look like:
{
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
When setting debug=True, you will be able see your app in debugging mode. You will be able to see the HTTP requests, as they will appear on your console for debugging purposes, which you could then write these requests to Stackdriver Logs Viewer. An example of a Hello world Flask app running in Debug mode.
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run(port='5000', debug=True)
您可以添加一个 Flask logging handler,如下所示:
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 日志查看器 UI 与 App Engine Stackdriver 日志查看器看起来不一样。
此外,您还可以查看 Combining correlated log lines in Google Stackdriver,因为它会让您更好地了解如何在需要时按类别或组对日志进行批处理。
我在这里写这篇文章是为了让人们知道我在调查过程中得出的结论。
sllopis 提供的信息让我找到了最接近的解决方案——混合使用结构化日志记录和重构 flask-gcp-log-groups 库中的一些代码,我能够使用 Stackdriver 记录请求下面相关的日志行
不幸的是,这个解决方案有一些漏洞,使其远非理想,尽管它是迄今为止我能根据 Stackdrivers 刚性提出的最佳解决方案。
每次我深入研究一个请求时,都会有一个 "flash",因为 Stackdriver 会搜索并获取与该请求匹配的所有跟踪条目。条目集合越大,闪存完成所需的时间就越长。
仅查看 "request" 日志时无法在相关行中搜索文本。例如,假设请求下的相关日志条目有一个字符串,文本为 "now you see me" - 如果我搜索字符串 "see",它不会在搜索结果列表中显示该请求。
我可能遗漏了一些明显的东西,但我花了几天非常令人沮丧的时间来尝试实现你认为应该非常简单的东西。
理想情况下,我会为每个日志条目创建一个 protoPayload,其中我会在 属性 "line" 下放置一个数组,类似于 Google App Engine 进行日志记录的方式。
然而,似乎没有办法做到这一点,因为 protoPayload 是为审计日志保留的。
感谢 sllopis 提供的信息 - 如果我没有尽快找到更好的解决方案,我会将答案标记为正确,因为它是我相信我会达到我想要实现的最接近的答案。
鉴于这种情况,我很想放弃 Stackdriver,转而采用更好的日志记录解决方案 - 欢迎提出任何建议!