ログ記録のパイソンガイド
適切に行うと、ログはあなたの遵守スイートの貴重なコンポーネントです.ログは、アプリケーションでデータがどのように変更されたかをお話します.彼らはあなたのような質問に答えることができます:なぜジョンドは昨日チェックアウト中にエラーを受け取るか?彼はどんな入力をしましたか.
非常に単純な静的なストリング声明から豊かな構造化されたデータイベントへの範囲を記録することの実行.この記事では、Pythonでのログをどのようにしてアプリケーションで何が起こっているのかをよりよく表示します.加えて、私はあなたのログの中で最も値を得るのを助けるいくつかのベストプラクティスを探索します.
多くのPythonチュートリアル
これは小さなスクリプトで有用ですが、アプリケーションと操作の要件が大きくなるにつれてです.
loggingモジュールはPythonの標準ライブラリの一部で、バージョン2.3以降である.これは自動的に行番号やタイムスタンプなどのコンテキストをログに追加します.モジュールは、名前空間のログとseverityレベルを追加して、どこで何が出力されるかをより詳細に制御できます.
私は何かを学ぶ最良の方法は、それを行うことです信者ですので、私はあなたに沿ってPython replで従うことをお勧めします.ログモジュールが簡単になりました.
Pythonモジュールでは、イベントのseverityレベルに基づいてイベントを区別できます.レベルは0から50までの整数として表現される.モジュールは、スペクトル間で5つの定数を定義し、メッセージ間の区別を簡単にします.
各レベルは、それに接続された意味を持っており、あなたがログインしているレベルについて批判的に考える必要があります.
既定のフォーマッタは、ログの書式設定に有用ではありません.ログモジュールでは、フォーマットを変更することで簡単に追加できます.
時刻、レベル、メッセージを表示する書式を設定します.
一般的なログメッセージはほとんどログ情報としてほとんど情報を提供しません.あなたのログを通過しなければならない場合は
構造化されたデータを文字列の代わりに追加して、エンコーディングをエンコーディングすることができます.構造化されたデータがなければ、将来的にログストリームを解読するのは難しい.これに対処する最良の方法は、重要なメタデータを
ロギングは、あなたが書くソフトウェアのパフォーマンス要件と釣り合う必要があるオーバーヘッドを導入します.オーバーヘッドが一般的に無視できる間、悪い習慣と間違いはつながることができます.
ここでいくつかの役に立つヒントがあります.
The Python Logging Documentation 評価を遅らせるために、高価な呼び出しがレベルチェックで包まれることを勧めます.
ホットパスはパフォーマンスにとって重要なコードであるので、しばしば実行されます.ログへのデータがホットパスの外で利用できないので、それがIOボトルネックになることができるので、ここでログを避けるのが最善です.
あなたがこれらの(美しい)ログを書くことを学んだ今、あなたは彼らとどうするかを決定しなければなりません.デフォルトでは、ログは標準出力デバイス(おそらくあなたのターミナルウィンドウ)に書き込まれますが、Pythonのログモジュールは出力処理をカスタマイズするための豊富なオプションを提供します.標準出力へのログ出力を促し、標準出力をキャプチャし、プラットフォームレベルで他のロギング機能にリダイレクトすることによって、Heroku、Amazon Velocity Beanstalk、Dockerなどのプラットフォームがこの規格でビルドされます.
ログモジュールでは、ログファイルをローカルのファイルに書き込むことができます.
今すぐあなたのログファイルを使用して検索を簡単に
Pythonロギングモジュールは、ログファイルが一定のサイズに達した後、または別のファイルにログオンするのを容易にします.これは、古いログを自動的に取得したい場合や、既にグループ化されているログのセットを見つけるために巨大なファイルを検索する必要がないので、ログを検索する場合に便利です.
作成する
それはあなたのアプリケーションを観察することになるときにログがどこに収まるかを理解することが重要です.私は読者が読者を見ることをお勧め3 pillars of observability 原則、そのログでは、アプリケーションを観察するときに到達するいくつかのツールの1つである必要があります.ログはあなたの可観測性スタックのコンポーネントです、しかし、メトリックと追跡は等しくそうです.
ログは、特に規模で高価になることができます.トレースは、すべてのアクションのトレースを維持することなく、データを集計し、お客様についての質問に答えるために使用することができますトレース中にあなたのプラットフォーム全体のリクエストのパスを表示することができます.
あなたがこのポストから何かを取り去るならば、ログがユーザーの行動のために真実の源として役立つということです.アイテムをカートに入れたり取り出したりするなどの一時的な動作であっても、バグ報告のためのユーザーのステップをたどることができ、ログを使用して行動を決定することができます.
Pythonログモジュールはこれを簡単にします.それはあなたのログを、動的にレベルを使用してメッセージの間に区別することができますし、“ハンドラ”を使用してログを外部船を出荷します.ユーザーのアクションに洞察を得るために使用する必要があります唯一のメカニズムが、それは生のイベントデータをキャプチャし、未知の質問に答えて効果的な方法です.
これを行う代わりに、我々はかなり素晴らしいサービスを持っているhere @ Timber それが自動的にデバッグを容易にするためにログとコンテキストをキャプチャします.私たちを試してください(完全に)無料;あなたも、クレジットカードを必要としない!
ホスティングログのサービスにログを書き込む真剣に真剣にあなたの人生を容易にするので、何が重要であなたの時間を集中することができます.
免責事項:私は現在の従業員@木材です.このセクションは完全に任意ですが、私は心からあなたの人生を容易にするためにログオンすることを信じています(そして、あなたは完全に無料でそれを試みることができます).
注:あなたがフラスコのアプリケーションを作成している場合は、また、それらをチェックアウトすることをお勧めしますlogging documentation .
非常に単純な静的なストリング声明から豊かな構造化されたデータイベントへの範囲を記録することの実行.この記事では、Pythonでのログをどのようにしてアプリケーションで何が起こっているのかをよりよく表示します.加えて、私はあなたのログの中で最も値を得るのを助けるいくつかのベストプラクティスを探索します.
印刷してください
多くのPythonチュートリアル
print
デバッグツールとして.使用例print
スクリプトとして例外を出力する>>> import sys
>>>
>>> def captureException():
... return sys.exc_info()
...
>>> try:
... 1/0
... except:
... print(captureException())
...
(<class 'ZeroDivisionError'>, ZeroDivisionError('division by zero',), <traceback object at 0x101acb1c8>)
None
これは小さなスクリプトで有用ですが、アプリケーションと操作の要件が大きくなるにつれてです.
print
より実行可能な解決になります.それはあなたに出力文の全体のカテゴリをオフにするための柔軟性を提供していません、それだけで出力することができますstdout
. また、デバッグを支援することができます生成された行番号や時間などの情報をミス.中print
それはセットアップを必要としないので、最も簡単なアプローチは、すぐに戻ってくることができます噛む.また、直接印刷するパッケージを出荷するのも悪い習慣ですstdout
それは、メッセージを制御するユーザーの能力を削除します.ログ記録情報(" hello world to logging )
loggingモジュールはPythonの標準ライブラリの一部で、バージョン2.3以降である.これは自動的に行番号やタイムスタンプなどのコンテキストをログに追加します.モジュールは、名前空間のログとseverityレベルを追加して、どこで何が出力されるかをより詳細に制御できます.
私は何かを学ぶ最良の方法は、それを行うことです信者ですので、私はあなたに沿ってPython replで従うことをお勧めします.ログモジュールが簡単になりました.
>>> import logging
>>> logging.basicConfig()
>>> logger = logging.getLogger(__name__)
>>>
>>> logger.critical('logging is easier than I was expecting')
CRITICAL:__main__:logging is easier than I was expecting
何が起こったの?getLogger
Loggerインスタンスを提供します.その後、私たちはそれをイベント'ログは私が期待していたよりも簡単だった'critical
.レベル
Pythonモジュールでは、イベントのseverityレベルに基づいてイベントを区別できます.レベルは0から50までの整数として表現される.モジュールは、スペクトル間で5つの定数を定義し、メッセージ間の区別を簡単にします.
各レベルは、それに接続された意味を持っており、あなたがログインしているレベルについて批判的に考える必要があります.
>>> logger.critical("this better be bad")
CRITICAL:root:this better be bad
>>> logger.error("more serious problem")
ERROR:root:more serious problem
>>> logger.warning("an unexpected event")
WARNING:root:an unexpected event
>>> logger.info("show user flow through program")
>>> logger.debug("used to track variables when coding")
注意info
and debug
メッセージを印刷しなかった.デフォルトでは、ロガーはwarning
, error
, or critical
メッセージ.この動作をカスタマイズし、さらに詳細に冗長なログ出力をアクティブにするためにランタイムで変更することもできます.>>> # should show up; info is a higher level than debug
>>> logger.setLevel(logging.DEBUG)
>>> logger.info(1)
INFO:root:1
>>>
>>> # shouldn't show up; info is a lower level than warning
... logger.setLevel(logging.WARNING)
>>> logger.info(2)
ログの書式設定
既定のフォーマッタは、ログの書式設定に有用ではありません.ログモジュールでは、フォーマットを変更することで簡単に追加できます.
時刻、レベル、メッセージを表示する書式を設定します.
>>> import logging
>>> logFormatter = '%(asctime)s - %(levelname)s - %(message)s'
>>> logging.basicConfig(format=logFormatter, level=logging.DEBUG)
>>> logger = logging.getLogger(__name__)
>>> logger.info("test")
2018-06-19 17:42:38,134 - INFO - test
このようなデータのいくつかtime
and levelname
自動的にキャプチャすることができますがextra
ログへのコンテキスト.コンテキストの追加
一般的なログメッセージはほとんどログ情報としてほとんど情報を提供しません.あなたのログを通過しなければならない場合は
removed from cart
. このような質問に答えることは困難になります:ときにアイテムが削除された?誰がそれを削除?彼らは何を削除しましたか?構造化されたデータを文字列の代わりに追加して、エンコーディングをエンコーディングすることができます.構造化されたデータがなければ、将来的にログストリームを解読するのは難しい.これに対処する最良の方法は、重要なメタデータを
extra
オブジェクト.これを使用すると、ストリーム内のメッセージを豊かにすることができます.>>> import logging
>>> logFormatter = '%(asctime)s - %(user)s - %(levelname)s - %(message)s'
>>> logging.basicConfig(format=logFormatter, level=logging.DEBUG)
>>> logger = logging.getLogger(__name__)
>>> logger.info('purchase completed', extra={'user': 'Sid Panjwani'})
2018-06-19 17:44:10,276 - Sid Panjwani - INFO - purchase completed
パフォーマンス
ロギングは、あなたが書くソフトウェアのパフォーマンス要件と釣り合う必要があるオーバーヘッドを導入します.オーバーヘッドが一般的に無視できる間、悪い習慣と間違いはつながることができます.
ここでいくつかの役に立つヒントがあります.
レベルチェックでラップ高価な呼び出し
The Python Logging Documentation 評価を遅らせるために、高価な呼び出しがレベルチェックで包まれることを勧めます.
if logger.isEnabledFor(logging.INFO):
logger.debug('%s', expensive_func())
さあexpensive_func
ログレベルがINFO
.ホットパスでログを避ける
ホットパスはパフォーマンスにとって重要なコードであるので、しばしば実行されます.ログへのデータがホットパスの外で利用できないので、それがIOボトルネックになることができるので、ここでログを避けるのが最善です.
これらのログの保存とアクセス
あなたがこれらの(美しい)ログを書くことを学んだ今、あなたは彼らとどうするかを決定しなければなりません.デフォルトでは、ログは標準出力デバイス(おそらくあなたのターミナルウィンドウ)に書き込まれますが、Pythonのログモジュールは出力処理をカスタマイズするための豊富なオプションを提供します.標準出力へのログ出力を促し、標準出力をキャプチャし、プラットフォームレベルで他のロギング機能にリダイレクトすることによって、Heroku、Amazon Velocity Beanstalk、Dockerなどのプラットフォームがこの規格でビルドされます.
ファイルへのログ記録
ログモジュールでは、ログファイルをローカルのファイルに書き込むことができます.
>>> import logging
>>> logger = logging.getLogger(__name__)
>>>
>>> handler = logging.FileHandler('myLogs.log')
>>> handler.setLevel(logging.INFO)
>>>
>>> logger.addHandler(handler)
>>> logger.info('You can find this written in myLogs.log')
あなたが沿って続いていたならば、あなたのログがあなたのファイルに現れないことに気がつきますinfo
. 必ず使うsetLevel
それを変える.今すぐあなたのログファイルを使用して検索を簡単に
grep
.grep critical myLogs.log
今すぐあなたのようなキーワードを含むメッセージを検索することができますcritical
or warning
.回転ログ
Pythonロギングモジュールは、ログファイルが一定のサイズに達した後、または別のファイルにログオンするのを容易にします.これは、古いログを自動的に取得したい場合や、既にグループ化されているログのセットを見つけるために巨大なファイルを検索する必要がないので、ログを検索する場合に便利です.
作成する
handler
これは、毎日新しいログファイルを作成し、自動的に5日以上のログを削除すると、TimedRotatingFileHandler
. 以下に例を示します:logger = logging.getLogger('Rotating Log by Day')
# writes to pathToLog
# creates a new file every day because `when="d"` and `interval=1`
# automatically deletes logs more than 5 days old because `backupCount=5`
handler = TimedRotatingFileHandler(pathToLog, when="d", interval=1, backupCount=5)
欠点
それはあなたのアプリケーションを観察することになるときにログがどこに収まるかを理解することが重要です.私は読者が読者を見ることをお勧め3 pillars of observability 原則、そのログでは、アプリケーションを観察するときに到達するいくつかのツールの1つである必要があります.ログはあなたの可観測性スタックのコンポーネントです、しかし、メトリックと追跡は等しくそうです.
ログは、特に規模で高価になることができます.トレースは、すべてのアクションのトレースを維持することなく、データを集計し、お客様についての質問に答えるために使用することができますトレース中にあなたのプラットフォーム全体のリクエストのパスを表示することができます.
ラッピング
あなたがこのポストから何かを取り去るならば、ログがユーザーの行動のために真実の源として役立つということです.アイテムをカートに入れたり取り出したりするなどの一時的な動作であっても、バグ報告のためのユーザーのステップをたどることができ、ログを使用して行動を決定することができます.
Pythonログモジュールはこれを簡単にします.それはあなたのログを、動的にレベルを使用してメッセージの間に区別することができますし、“ハンドラ”を使用してログを外部船を出荷します.ユーザーのアクションに洞察を得るために使用する必要があります唯一のメカニズムが、それは生のイベントデータをキャプチャし、未知の質問に答えて効果的な方法です.
これを行う代わりに、我々はかなり素晴らしいサービスを持っているhere @ Timber それが自動的にデバッグを容易にするためにログとコンテキストをキャプチャします.私たちを試してください(完全に)無料;あなたも、クレジットカードを必要としない!
クラウドへのログイン
ホスティングログのサービスにログを書き込む真剣に真剣にあなたの人生を容易にするので、何が重要であなたの時間を集中することができます.
免責事項:私は現在の従業員@木材です.このセクションは完全に任意ですが、私は心からあなたの人生を容易にするためにログオンすることを信じています(そして、あなたは完全に無料でそれを試みることができます).
pip install timber
import logging
import timber
logger = logging.getLogger(__name__)
timber_handler = timber.TimberHandler(api_key='...')
logger.addHandler(timber_handler)
それです.あなたがする必要があるのは、あなたのAPIキーをtimber.io , そして、あなたはあなたのログを見ることができるでしょう.我々は自動的にログモジュールからそれらをキャプチャするので、我々はシームレスにコンテキストを追加しながら、最高のプラクティスに従うし、通常ログを続けることができます.注:あなたがフラスコのアプリケーションを作成している場合は、また、それらをチェックアウトすることをお勧めしますlogging documentation .
Reference
この問題について(ログ記録のパイソンガイド), 我々は、より多くの情報をここで見つけました https://dev.to/timber/the-pythonic-guide-to-logging-4p35テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol