App Engine 柔性环境的错误报告
Error Reporting with App Engine Flexible Environment
我在使用带有 Python 2.7
的 App Engine 柔性环境时遇到了 Google Stackdriver 错误报告工作的问题
文档说灵活的环境需要手动配置:https://cloud.google.com/error-reporting/docs/setting-up-on-app-engine
默认情况下,python 运行时,看起来 google-fluentd 已安装,因为 ps ax | grep fluentd
returns 文档建议。但是,执行 sudo service google-fluentd restart
失败。
我的 requirements.txt 文件中有 fluent-logger==0.4.1
。
我切换到自定义运行时,以便能够将 forward.conf
文件放在文档建议的 /etc/google-fluentd/config.d
中。
我的 Docker 文件如下所示:
FROM gcr.io/google_appengine/python
RUN virtualenv /env -p python2.7
# stackdriver logging (for error reporting)
RUN mkdir -p /etc/google-fluentd/config.d
ADD forward.conf /etc/google-fluentd/config.d/
# Set virtualenv environment variables. This is equivalent to running
# source /env/bin/activate
ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH
ADD requirements.txt /app/
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
ADD . /app/
RUN python manage.py collectstatic --noinput
RUN python manage.py migrate --noinput
CMD gunicorn -b :$PORT project_name.wsgi
和 forward.conf 看起来像:
<source>
type forward
port 24224
</source>
在我的应用程序中,我有一个应该报告错误的视图,但没有任何结果:
from django.http import HttpResponse
from django.views.generic import View
from fluent import sender
from fluent import event
import traceback
sender.setup('myapp', host='localhost', port=24224)
def report(ex):
data = {}
data['message'] = '{0}'.format(ex)
data['serviceContext'] = {'service' : 'myapp'}
# ... add more metadata
event.Event('errors', data)
class ErrorView(View):
def get(self, request, *args, **kwargs):
# report exception data using:
try:
Exception("Woops.. an Error Occurred")
except Exception as e:
report(traceback.format_exc())
raise e
设置中是否缺少某些内容? Web 服务器访问日志通过得很好,但没有异常或写入 stderr 或 stdout
2016 年 5 月 9 日更新
感谢@Steren 的回答...它比我在 Python 灵活环境中使用 Django 时要简单得多。不需要自定义运行时和安装 fluentd
。下面是一个工作示例,它将文件日志输出到 /var/log/app_engine/custom_logs/error.log
和一个日志格式化程序以将日志放入适当的格式。
日志设置:
'formatters': {
'gcp_json': {
'()': 'helloworld.gcp_logger.GCPJsonFormatter',
},
},
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': '/var/log/app_engine/custom_logs/errors.json',
'formatter': 'gcp_json',
},
},
'loggers': {
'django.request': {
'filters': ['require_debug_false'],
'handlers': ['file'],
'level': 'ERROR',
'propagate': True,
},
},
和格式化程序:
import logging
import json
import os
class GCPJsonFormatter(logging.Formatter):
def format(self, record):
# https://cloud.google.com/error-reporting/docs/formatting-error-messages
return json.dumps({
'eventTime': record.created,
'message': self.formatException(record.exc_info),
'level': record.levelname,
'serviceContext': {
'service': os.environ.get('GAE_MODULE_NAME', ''),
'version': os.environ.get('GAE_MODULE_VERSION', ''),
},
"context": {
"httpRequest": self._get_request_info(record),
'user': str(record.request.user) if record.request else "",
"reportLocation": {
"filePath": record.pathname,
"lineNumber": record.lineno,
"functionName": record.funcName,
},
}
})
def _get_request_info(self, record):
try:
request = record.request
return {
"method": request.method,
"url": request.get_full_path(),
"userAgent": request.META.get("HTTP_USER_AGENT", ""),
"referrer": request.META.get("HTTP_REFERER", ""),
"responseStatusCode": record.status_code,
"remoteIp": request.META.get("REMOTE_ADDR", "")
}
except Exception:
return {}
有一种无需自定义运行时即可配置 App Engine 灵活运行时的方法,它很快就会记录在官方文档中,我们也在努力简化这些步骤:
您应该使用与 Google Compute Engine samples 中详述的代码类似的代码将异常数据作为结构化日志发送到名为 /var/log/app_engine/custom_logs/errors.json
的文件中(不要通过 TCP 端口发送)
重要的是:
- 文件路径以
/var/log/app_engine/custom_logs/
开头
- 文件扩展名为
.json
- 文件名中包含
err
- 该文件仅包含结构化 JSON 个对象。
然后您可以在 Stackdriver Logging 中确认您看到错误在自定义日志流中显示为 structPayload
:
在第一个下拉列表中选择 App Engine
,然后选择 custom.var.lop.app_engine.app.custom_logs.errors.json
.
如果是这种情况,错误报告应该会自动开始处理这些错误。
如果不是这样请告诉我。
我在使用带有 Python 2.7
的 App Engine 柔性环境时遇到了 Google Stackdriver 错误报告工作的问题文档说灵活的环境需要手动配置:https://cloud.google.com/error-reporting/docs/setting-up-on-app-engine
默认情况下,python 运行时,看起来 google-fluentd 已安装,因为 ps ax | grep fluentd
returns 文档建议。但是,执行 sudo service google-fluentd restart
失败。
我的 requirements.txt 文件中有 fluent-logger==0.4.1
。
我切换到自定义运行时,以便能够将 forward.conf
文件放在文档建议的 /etc/google-fluentd/config.d
中。
我的 Docker 文件如下所示:
FROM gcr.io/google_appengine/python
RUN virtualenv /env -p python2.7
# stackdriver logging (for error reporting)
RUN mkdir -p /etc/google-fluentd/config.d
ADD forward.conf /etc/google-fluentd/config.d/
# Set virtualenv environment variables. This is equivalent to running
# source /env/bin/activate
ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH
ADD requirements.txt /app/
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
ADD . /app/
RUN python manage.py collectstatic --noinput
RUN python manage.py migrate --noinput
CMD gunicorn -b :$PORT project_name.wsgi
和 forward.conf 看起来像:
<source>
type forward
port 24224
</source>
在我的应用程序中,我有一个应该报告错误的视图,但没有任何结果:
from django.http import HttpResponse
from django.views.generic import View
from fluent import sender
from fluent import event
import traceback
sender.setup('myapp', host='localhost', port=24224)
def report(ex):
data = {}
data['message'] = '{0}'.format(ex)
data['serviceContext'] = {'service' : 'myapp'}
# ... add more metadata
event.Event('errors', data)
class ErrorView(View):
def get(self, request, *args, **kwargs):
# report exception data using:
try:
Exception("Woops.. an Error Occurred")
except Exception as e:
report(traceback.format_exc())
raise e
设置中是否缺少某些内容? Web 服务器访问日志通过得很好,但没有异常或写入 stderr 或 stdout
2016 年 5 月 9 日更新
感谢@Steren 的回答...它比我在 Python 灵活环境中使用 Django 时要简单得多。不需要自定义运行时和安装 fluentd
。下面是一个工作示例,它将文件日志输出到 /var/log/app_engine/custom_logs/error.log
和一个日志格式化程序以将日志放入适当的格式。
日志设置:
'formatters': {
'gcp_json': {
'()': 'helloworld.gcp_logger.GCPJsonFormatter',
},
},
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': '/var/log/app_engine/custom_logs/errors.json',
'formatter': 'gcp_json',
},
},
'loggers': {
'django.request': {
'filters': ['require_debug_false'],
'handlers': ['file'],
'level': 'ERROR',
'propagate': True,
},
},
和格式化程序:
import logging
import json
import os
class GCPJsonFormatter(logging.Formatter):
def format(self, record):
# https://cloud.google.com/error-reporting/docs/formatting-error-messages
return json.dumps({
'eventTime': record.created,
'message': self.formatException(record.exc_info),
'level': record.levelname,
'serviceContext': {
'service': os.environ.get('GAE_MODULE_NAME', ''),
'version': os.environ.get('GAE_MODULE_VERSION', ''),
},
"context": {
"httpRequest": self._get_request_info(record),
'user': str(record.request.user) if record.request else "",
"reportLocation": {
"filePath": record.pathname,
"lineNumber": record.lineno,
"functionName": record.funcName,
},
}
})
def _get_request_info(self, record):
try:
request = record.request
return {
"method": request.method,
"url": request.get_full_path(),
"userAgent": request.META.get("HTTP_USER_AGENT", ""),
"referrer": request.META.get("HTTP_REFERER", ""),
"responseStatusCode": record.status_code,
"remoteIp": request.META.get("REMOTE_ADDR", "")
}
except Exception:
return {}
有一种无需自定义运行时即可配置 App Engine 灵活运行时的方法,它很快就会记录在官方文档中,我们也在努力简化这些步骤:
您应该使用与 Google Compute Engine samples 中详述的代码类似的代码将异常数据作为结构化日志发送到名为 /var/log/app_engine/custom_logs/errors.json
的文件中(不要通过 TCP 端口发送)
重要的是:
- 文件路径以
/var/log/app_engine/custom_logs/
开头
- 文件扩展名为
.json
- 文件名中包含
err
- 该文件仅包含结构化 JSON 个对象。
然后您可以在 Stackdriver Logging 中确认您看到错误在自定义日志流中显示为 structPayload
:
在第一个下拉列表中选择 App Engine
,然后选择 custom.var.lop.app_engine.app.custom_logs.errors.json
.
如果是这种情况,错误报告应该会自动开始处理这些错误。
如果不是这样请告诉我。