3

Python 2.7 を使用する App Engine フレキシブル環境を使用して Google Stackdriver Error Reporting を機能させるのに問題があります

ドキュメントには、柔軟な環境には手動構成が必要であると記載されています: https://cloud.google.com/error-reporting/docs/setting-up-on-app-engine

Pythonランタイムのデフォルトではps ax | grep fluentd、ドキュメントが示唆するものを返すため、google-fluentdがインストールされているように見えます。ただし、実行するとsudo service google-fluentd restart失敗します。

私はfluent-logger==0.4.1自分のrequirements.txtファイルにあります。

ドキュメントが示唆する場所に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 {}
4

1 に答える 1

4

カスタム ランタイムを必要とせずに App Engine フレキシブル ランタイムを構成する方法があります。これはまもなく公式ドキュメントに記載されます。また、これらの手順をより簡単にするために取り組んでいます。

という名前のファイルに構造化ログとして例外データを送信するには、 Google Compute Engine のサンプルで詳しく説明されているコードと同様のコードを使用する必要があります/var/log/app_engine/custom_logs/errors.json(TCP ポート経由で送信しないでください)。

次のことが重要です。

  • ファイルパスは/var/log/app_engine/custom_logs/
  • ファイル拡張子は.json
  • ファイル名は名前に含まerrれます。
  • このファイルには、構造化された JSON オブジェクトのみが含まれています。

structPayloadその後、Stackdriver Logging で、エラーがカスタム ログ ストリームのように表示されることを確認できます。App Engine最初のドロップダウンで選択し、次にcustom.var.lop.app_engine.app.custom_logs.errors.json.

この場合、Error Reporting はこれらのエラーの処理を自動的に開始する必要があります。

そうでない場合はお知らせください。

于 2016-05-06T11:49:06.450 に答える