首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Reporting柔性环境的错误报告

基于Reporting柔性环境的错误报告
EN

Stack Overflow用户
提问于 2016-04-29 14:40:02
回答 1查看 1.3K关注 0票数 3

我在使用App灵活环境w/ Python2.7使Google错误报告工作时遇到困难

文档说,灵活的环境需要手动配置:https://cloud.google.com/error-reporting/docs/setting-up-on-app-engine

默认情况下,使用python运行时,它看起来就像安装了google,因为ps ax | grep fluentd返回文档所建议的内容。但是,执行sudo service google-fluentd restart失败。

fluent-logger==0.4.1在我的requirements.txt文件中。

我切换到了一个自定义运行时,以便能够将forward.conf文件放在文档建议的/etc/google-fluentd/config.d中。

我的Docker文件如下所示:

代码语言:javascript
复制
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看起来像:

代码语言:javascript
复制
<source>
  type forward
  port 24224
</source>

在我的应用程序中,我有一个应该报告错误的视图,但是什么都没有得到:

代码语言:javascript
复制
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年9月5日更新

多亏了斯特伦的回答。它比我在Python灵活环境中使用Django要简单得多。不需要自定义运行时和安装fluentd。下面是一个工作示例,它将一个文件日志输出到/var/log/app_engine/custom_logs/error.log,并输出一个日志格式化程序,以将日志放入适当的格式。

日志设置:

代码语言:javascript
复制
    '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,
        },
    },

而格式化者:

代码语言:javascript
复制
    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 {}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-06 11:49:06

有一种方法可以在不需要自定义运行时的情况下配置App灵活的运行时,它很快将被记录在正式文档中,而且我们还致力于简化这些步骤:

您应该使用类似于Google计算引擎示例中详细说明的代码将异常数据作为结构化日志发送到名为/var/log/app_engine/custom_logs/errors.json的文件中(不要通过TCP端口发送它们)。

重要的是:

  • 文件路径以/var/log/app_engine/custom_logs/开头
  • 文件扩展名为.json
  • 文件名在名称中包含err
  • 该文件只包含结构化的JSON对象。

然后,您可以在Stackdriver中确认,您在自定义日志流中看到了以structPayload形式出现的错误:在第一个下拉列表中选择App Engine,然后选择custom.var.lop.app_engine.app.custom_logs.errors.json

如果是这样,那么错误报告应该会自动开始处理这些错误。

如果不是这样的话,请告诉我。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36941184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档