AppEngine 开发服务器上的 Google KMS - 日志混乱
Posted
技术标签:
【中文标题】AppEngine 开发服务器上的 Google KMS - 日志混乱【英文标题】:Google KMS on AppEngine Dev Server - logging clutter 【发布时间】:2017-12-06 21:34:39 【问题描述】:这是一个已知问题:https://issuetracker.google.com/issues/63253097
除了my question about getting Google KMS working with App Engine,我要提出一个关于相关但有问题的副作用的新问题。
也就是说,Google Cloud API 发现似乎想要在 AppEngine 沙箱之外走多条路径。这本身不是问题,但它使测试和调试非常有问题,因为每次尝试都会被记录,产生数百行如下所示:
INFO 2017 年 7 月 3 日 14:44:51 沙盒阻止访问文件“/Users”
INFO 03 Jul 2017 14:44:51 如果是静态文件,请检查您的 app.yaml 中是否设置了
application_readable: true
INFO 2017 年 7 月 3 日 14:44:52 沙盒阻止访问文件“/usr/lib/Acrobat9/Resource/CMap”
INFO 03 Jul 2017 14:44:52 如果是静态文件,请检查您的 app.yaml 中是否设置了
application_readable: true
INFO 2017 年 7 月 3 日 14:44:52 沙盒阻止访问文件“/usr/lib/Acrobat8/Resource/CMap”
INFO 03 Jul 2017 14:44:52 如果是静态文件,请检查您的 app.yaml 中是否设置了
application_readable: true
有没有办法禁用或静默这些请求或日志?
EDIT*通过在stub.py
中将traceback.print_stack()
添加到log_access_check_fail
打印的众多结果之一(抱歉这里不是很清晰):
测试 #1:Sentry.io 的 Raven 导入 pkg_resources
File "/Users/bmh/testapp/application.py", line 3, in <module>
from nassau.application import app, sentry
File "/Users/bmh/testapp/nassau/application.py", line 28, in <module>
from raven.contrib.flask import Sentry
File "/Users/bmh/testapp/python-virtualenv/lib/python2.7/site-packages/raven/__init__.py", line 16, in <module>
VERSION = __import__('pkg_resources') \
File "/Users/bmh/testapp/python-virtualenv/lib/python2.7/site-packages/pkg_resources/__init__.py", line 3037, in <module>
@_call_aside
File "/Users/bmh/testapp/python-virtualenv/lib/python2.7/site-packages/pkg_resources/__init__.py", line 3021, in _call_aside
f(*args, **kwargs)
File "/Users/bmh/testapp/python-virtualenv/lib/python2.7/site-packages/pkg_resources/__init__.py", line 3050, in _initialize_master_working_set
working_set = WorkingSet._build_master()
File "/Users/bmh/testapp/python-virtualenv/lib/python2.7/site-packages/pkg_resources/__init__.py", line 646, in _build_master
ws = cls()
File "/Users/bmh/testapp/python-virtualenv/lib/python2.7/site-packages/pkg_resources/__init__.py", line 639, in __init__
self.add_entry(entry)
File "/Users/bmh/testapp/python-virtualenv/lib/python2.7/site-packages/pkg_resources/__init__.py", line 695, in add_entry
for dist in find_distributions(entry, True):
File "/Users/bmh/testapp/python-virtualenv/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2006, in find_on_path
path_item = _normalize_cached(path_item)
File "/Users/bmh/testapp/python-virtualenv/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2217, in _normalize_cached
_cache[filename] = result = normalize_path(filename)
File "/Users/bmh/testapp/python-virtualenv/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2210, in normalize_path
return os.path.normcase(os.path.realpath(filename))
File "/Users/bmh/testapp/python-virtualenv/lib/python2.7/posixpath.py", line 375, in realpath
path, ok = _joinrealpath('', filename, )
File "/Users/bmh/testapp/python-virtualenv/lib/python2.7/posixpath.py", line 400, in _joinrealpath
if not islink(newpath):
File "/Users/bmh/testapp/python-virtualenv/lib/python2.7/posixpath.py", line 135, in islink
st = os.lstat(path)
File "/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/python/stubs.py", line 286, in __call__
log_access_check_fail(path)
File "/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/python/stubs.py", line 51, in log_access_check_fail
traceback.print_stack()
我删除了对 Sentry / Raven 的依赖,但堆栈跟踪仍在继续,通过:
测试 #2:Flask 导入 pkgutil
File "/Users/bmh/testapp/application.py", line 3, in <module>
from nassau.application import app
File "/Users/bmh/testapp/nassau/application.py", line 72, in <module>
app = Flask('nassau')
File "/Users/bmh/testapp/python-virtualenv/lib/python2.7/site-packages/flask/app.py", line 331, in __init__
instance_path = self.auto_find_instance_path()
File "/Users/bmh/testapp/python-virtualenv/lib/python2.7/site-packages/flask/app.py", line 622, in auto_find_instance_path
prefix, package_path = find_package(self.import_name)
File "/Users/bmh/testapp/python-virtualenv/lib/python2.7/site-packages/flask/helpers.py", line 661, in find_package
loader = pkgutil.get_loader(root_mod_name)
File "/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pkgutil.py", line 464, in get_loader
return find_loader(fullname)
File "/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pkgutil.py", line 475, in find_loader
loader = importer.find_module(fullname)
File "/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pkgutil.py", line 184, in find_module
path = [os.path.realpath(self.path)]
File "/Users/bmh/testapp/python-virtualenv/lib/python2.7/posixpath.py", line 375, in realpath
path, ok = _joinrealpath('', filename, )
File "/Users/bmh/testapp/python-virtualenv/lib/python2.7/posixpath.py", line 400, in _joinrealpath
if not islink(newpath):
File "/Users/bmh/testapp/python-virtualenv/lib/python2.7/posixpath.py", line 135, in islink
st = os.lstat(path)
File "/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/python/stubs.py", line 286, in __call__
log_access_check_fail(path)
File "/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/python/stubs.py", line 51, in log_access_check_fail
traceback.print_stack()
必须有更好的方法来表示堆栈溢出时的堆栈跟踪:)
【问题讨论】:
我在最新的“传统”sdk (1.9.56) 上注意到了这一点。我必须调查是否可以在不抑制其他有用日志消息的情况下抑制这些消息。但我可以说它们没有出现在 1.9.50 中,所以如果降级你的 sdk 是可以接受的,你可以这样做。 @snakecharmerb 好主意,使用 gcloud 你如何降级?谢谢! @Shaungcloud components update --version xxx.x.x
会将整个 gcloud sdk 升级或降级到提供的版本;我没有看到升级或降级特定子组件的方法。
谢谢,成功了!
@Shaun 添加了answer 以过滤掉这些消息,而无需降级 gcloud
【参考方案1】:
对我来说,这些消息似乎来自名为 stubs.py 的 GAE (.local) 文件。
在我的第一个案例中,stubs.py 正在寻找不存在的文件。因此,您可能想检查“/usr/lib/Acrobat8/Resource/CMap”是否确实存在。然后,从 stubs.py 开始,尝试找出 what file is trying to load it。
我的项目正在使用 web.py,突然之间我又开始收到 (stubs.py) 消息,这次是关于 .pyc 文件的消息。我在 app.yaml 文件的底部放了一个skip_files:,它确实抑制了这些消息,但我还没有测试我的应用是否仍然可以完全编译。
skip_files:
- ^(.*/)?\.pyc$
在此处了解有关 Python GAE 运行时和沙箱的更多信息。 https://cloud.google.com/appengine/docs/standard/python/runtime
【讨论】:
【参考方案2】:我是一名从事 dev_appserver 的全职工程师。
此日志消息是从 /google/appengine/tools/devappserver2/python/stubs.py 报告的,方法为 log_access_check_fail
我们添加此日志消息以提醒用户 dev_appserver 阻止文件访问的行为。
推荐的解决方法: dev_appserver.py --log_level 警告
--log_level 设置本地python运行时进程的日志级别。 log_access_check_fail() 设置为 INFO 并且不会被记录。注意,这个标志也会阻止其他 INFO 级别的日志记录在您的应用程序中。
同时,我们正在修复这个 log_access_check_fail 方法。可能会将 log_access_check_fail() 日志记录级别降低到 DEBUG。
【讨论】:
谢谢凯。 FWIW,我认为日志访问失败可能是有用的调试信息,因此最好不要完全禁用它们(或者也许用标志选择启用它们);一个更好的答案可能是修复发现 API(如果可能)不检查 dev_appserver 栖息地之外。 嗨,Brian,我同意日志访问的必要性。实际上,当尝试使用 mykms.py [1] 复制您的问题(在 Mac OS 和 Ubuntu 上)时。我没有看到使用“/Users”或“/usr/lib/Acrobat9/Resource/CMap”进行访问的尝试。您能否确认这些尝试是由发现 api 而不是 oauthclient2 或您的应用程序代码进行的?谢谢 [1] ***.com/questions/44826934/… @KaiWang,我在导入reportlab 包的应用中看到/usr/lib/Acrobat...
日志消息。
@KaiWang 是否有公开的错误报告,我们可以对此行为发表评论?我对此有更多的 cmets,但 SO cmets 并不是本次讨论的最佳地点。
@KaiWang 确实可以通过 oauthclient2 — 当我开始使用发现 API 时问题就开始了,但确实可以通过 oauth2。我们还包括 reportlab - 但它已经存在多年了。【参考方案3】:
这很烦人,有一个bug report。
与此同时,我们可以过滤掉这些消息,但我们需要弄清楚它们使用的是哪个logger
。有关如何处理日志记录的更多信息,请参阅the docs。查看stubs.py
的来源我发现:
logging.info('Sandbox prevented access to file "%s"', filename)
logging.info('If it is a static file, check that '
'`application_readable: true` is set in your app.yaml')
所以他们使用的是根记录器(通常是不好的做法)。要在您的根记录器上过滤掉这些消息,请将以下内容添加到您的 appengine_config.py
:
import logging
class StubsFilter(logging.Filter):
def filter(self, record):
return 'stubs.py' != record.filename
logging.root.addFilter(StubsFilter())
【讨论】:
以上是关于AppEngine 开发服务器上的 Google KMS - 日志混乱的主要内容,如果未能解决你的问题,请参考以下文章
自定义子域上的 AppEngine“Google 管理的自动续订”SSL 证书错误地路由内容
有没有办法从 Google appengine 标准向网络浏览器发送推送通知? [关闭]
AppEngine (Java) 上的 Adwords API
Google Cloud Endpoints 和用户身份验证