【snake】Section: 14 Logging, Middleware and Error Handling

Tracking Response Times for All Requests(gunicorn.pyに関して)

以下を実行すると

docker-compose up --build

1000で割れば秒表示になるのでマイクロセコンドで表示する。
今回の場合だと2.844秒かかったとわかる。
f:id:yukking3:20180716101943p:plain
configフォルダーのgunicorn.pyで確認することができる。
gunicorn.orgのThe access log formatで確認できる。
access_log_formatがin %(D)sµsとなっている。 f:id:yukking3:20180716102210p:plain Dはrequest time in microsecondsである。 f:id:yukking3:20180716102445p:plain

Configuring Log Levels(ログの設定方法)

4行目をWARNINGにすると、WARNINGの時のみログが出るようになる。
f:id:yukking3:20180716102907p:plain

Using Flask's Logger(flaskロガーの使い方・)

app.pyでログの設定をする。
もしここを設定しなかったらflaskが自動的にdebagで設定される。
もしdebagがfalseの場合はwarningかそれ以上の警告しか出ないようになる。
f:id:yukking3:20180716104035p:plain

次に、users/models.pyの60行目に以下を追記する。 また6行目でcurrent_appをインポートする。

from flask import current_app
current_app.logger.debug('{0} has tried to login'.format(identity))

f:id:yukking3:20180716105442p:plain 変なアドレスがログインしようとしたとログがでる。
f:id:yukking3:20180716104209p:plain 4行目のDEBAGをINFOに変えると役割が違うのでログが出てこなくなる。

Integrating Google Analytics(GAを使えば何人来たかとか色々わかる)

設定はコピペするだけで十分である。
temaplate/layout/base.htmlを確認する。
f:id:yukking3:20180716110212p:plain
35行目で config['ANALYTICS_GOOGLE_UA']としている。
configファイルで登録すれば、ここにハードコードしなくても
自動で読み取りを行ってくれるようになる。

instance/settings.pyに以下のようにかく f:id:yukking3:20180716110720p:plain 実際に確認する場合はコンテナを一度止めてから再起動する必要がある。
configではなくinstanceに登録する理由は、developmentモードでトラッキングされたくないから。
config['ANALYTICS_GOOGLE_UA']とすることでflask全体に飛ばしてくれるからconfig?
また、if分使うことでもしあればやれとしてくれる。

Fixing IP Addresses with Middleware

middlewareとはWGSIとFlaskの間にあるもの。 Flaskに情報が届く前にdetailを取得したり、addしたりheadersをremoveする。 ProxyFixとはmiddlewareでWerkzeugに含まれている。 nginx(エンジンエックス)とはproxyとして使える。

app.pyで127行目でmiddlewareが設定されている。 f:id:yukking3:20180716113442p:plain

Werkzeug(ヴェルクツォイク)とは、PythonでWebアプリケーションを作るためのユーティリティライブラリ。ドイツ語で「工具」という意味の単語。Requestオブジェクトの支援ツール。 多分、こういうの表示してくれるやつ f:id:yukking3:20180716113256p:plain

クライアント1万台問題の解決策としてAppachではなくNginxを使うようになった。 f:id:yukking3:20180716112812p:plain

Flaskはエンジンエックスをuserだと勘違いしてipadressを認識してみんな同じip adressいなってしまう。そこで、ProcyFixがIP adressをいい感じにミックスしてくれる。Flaskのrequest.remote_addrで本当のIP adressを取得する。セキュリティ面からいうと、エンジエックスのようなproxyを絶対に使った方がいい。

135行目でwsgi(ウイスキー)がproxyfixにわ達されている。 結果をapp.wsgi_appとしている。 f:id:yukking3:20180716113442p:plain

Custom Error Pages 問題あったら自動でエラーページにする。

app.pyの73行目にerror_templates(app)ファンクションが登録されている。 f:id:yukking3:20180716134417p:plain そのファンクションは140行目に定義されている。
全システムにできるようにblueprintレベルではなく、
appレベルで使えるようにする。 f:id:yukking3:20180716135302p:plain

カスタムエラー abort(500)とにするとhomepageを500エラーにすることができる。 f:id:yukking3:20180716135722p:plain f:id:yukking3:20180716135729p:plain



Handling Exceptions in Production

74行目でexception_handler(app)ファンクションが登録されている。 f:id:yukking3:20180716140029p:plain これを設定することでNotifyを得ることができる。
メールの設定を行、185行目でログの内容を記載する。 f:id:yukking3:20180716140130p:plain
3rdパーティーのライブラリーあるけど、Emailで十分である。
実際の動きを見てみる。
configフォルダーのsetting.pyのDEBUGをFalseにする。 f:id:yukking3:20180716141500p:plain 8行目をわざと消す。 f:id:yukking3:20180716141448p:plain lcoalhost8000に接続するとエラーページになる。 f:id:yukking3:20180716141530p:plain メールを見てみるとエラー表記がされている。
global name dfinned not findが確認できる。
f:id:yukking3:20180716141604p:plain