問題
Python エージェントがログ出力するように設定することができます。この設定により、エージェントが New Relic に正しく接続しているかどうか、エラーが発生していないかどうかを追跡することができます。この情報は、問題が発生した場合にNew Relicサポートに役立ちます。
解決策
詳細な debug
ロギングは、標準的なPythonエージェントのインストールのトラブルシューティングに役立ちます。
debug
ロギングを有効にするには。
newrelic.ini (通常はアプリの階層にあります)を開きます。
アンコメント
#log_file = /tmp/newrelic-python-agent.log
.ログの保存先に書き込み権限があることを確認し、必要に応じてパスやファイル名を変更します。適当なファイルの場所がない場合は、log_file
をstderr
に設定します。log_level
をdebug
(frominfo
)に変更。注意
debug
でログを取ると、大量のデータがすぐに生成されてしまいます。log_level
をinfo
に戻し、トラブルシューティングが終わったら、ログファイルのサイズを注意深く監視してください。ファイルを保存して閉じます。設定を反映させるために、アプリを再起動してください。
アプリケーションへの数分間のトラフィックを生成します。
ログファイルをNew Relicサポートに送信する場合は、サポートチケットに newrelic.ini を添付し、タイムゾーンをサポートに伝えてください。
重要
New Relic Python エージェントのトラブルシューティングの際には、デバッグレベルのログファイルを生成するように設定されていることを確認し、ログファイルのサイズを注意深く監視してください。 log_level = debug
を使用すると、大量のデータがすぐに生成されます。問題を再現した後は、ログファイルを log_level = info
に戻してください。
ファイルへのログ
エージェントは、Pythonのロギングモジュールを使用してログメッセージを出力します。したがって、エージェントからの出力は、アプリケーションの全体的なロギング戦略を考慮する必要があります。
ログモジュールを使用していない場合、エージェントはPythonエージェントのログファイルを有効にする簡易な方法を提供しています。これを使うには、 エージェント設定ファイル で、 log_file
と log_level
オプションを設定します。
例:
log_file = /tmp/newrelic-python-agent.loglog_level = info
log_file
に指定するパスは、アプリケーションを実行するユーザーが書き込み可能なものでなければなりません。
ヒント
Apache/mod_wsgi
を使用する場合、Apache ユーザはファイルシステムへのアクセスを制限されます。ログファイルを置くことができる特別なディレクトリを作成して、Apache ユーザに書き込み可能にしてください。相対パスではなく、絶対パスで作成することをお勧めします。
使用するログレベルは、 error
、 warning
、 info
、 debug
のいずれかです。通常は、 info
を使用してください。 debug
では、より詳細なデバッグオプションが使用されます。これらの verbose デバッグオプションは、長時間使用しないでください。これらは過剰な出力を発生させる可能性があります。また、loggingモジュールのログファイルハンドラーは、標準のファイルハンドラーであり、ログファイルのローテーションは行いません。
標準エラーへのログ
ホスティングプロバイダーによっては、エージェント用に個別のログファイルを使用できない場合があります。標準エラー出力にログを記録するようにロギングモジュールを設定します。この出力は、ホスティング・メカニズムの通常のエラー・ログ・ファイルに取り込まれます。
これをエージェント設定ファイル内で行うには、次のように実行します。
log_file = stderrlog_level = info
また、 stderr
の代わりに stdout
という値を使用することもできます。
すべてのデータを記録(監査ログ)
監視対象のプロセスと New Relic コレクターの間で 送信されているすべての データに関する情報を記録し、表示する必要がある場合は、 監査ログ を短時間有効にすることができます。これは、デバッグや監査などで、正確に何が送信されているかの詳細な情報が必要な場合に便利です。
ログモジュールのコンフリクトのトラブルシューティング
ログが取得されない場合は、Pythonのloggingモジュールの初期化や設定方法に問題がある可能性があります。以下の関数で問題が発生する可能性があります。
使用しているWebフレームワークやアプリケーションのドキュメントを参照してください。それは Python の logging モジュールを設定するための特別なメカニズムを提供しているかもしれません。例えば、 Django を使っている場合、 Python のロギングモジュールを設定するための辞書的なアプローチが自動的にサポートされており、 Django の設定モジュール内の LOGGING
属性で定義が設定されています。
詳しくは、 Django logging configuration のドキュメントをご覧ください。
エージェントログファイルのローテーション
エージェント設定で log_file
オプションを使用すると、ログモジュールの標準ファイルハンドラが使用されます。これは、ログファイルのローテーションを行いません。ログファイルのローテーションは自動的には行われません。なぜならば、あなたがどのような種類のローテーションログファイルハンドラを使用したいのかわからないからです。また、Pythonで提供される標準のローテーションログファイルハンドラは、マルチプロセス構成では必ずしも安全ではありません。そのため、サードパーティ製の回転ログファイルハンドラーをダウンロードして使用するか、専用のログシステムを使用する必要があるかもしれません。
アプリケーションが単一のプロセスで実行されている場合は、 RotatingFileHandler
または TimedRotatingFileHandler
ハンドラのいずれかを logging モジュールと共に安全に使用することができます。これをPythonエージェントからの出力にのみ使用するには、WSGIスクリプトファイルまたはモジュールの先頭で、 newrelic
モジュールのインポートの前に、次のように記述します。
_LOG_FORMAT = '%(asctime)s (%(process)d/%(threadName)s)' \ ' %(name)s %(levelname)s - %(message)s'
_logger = logging.getLogger('newrelic')_handler = logging.handlers.TimedRotatingFileHandler( 'agent.log', when='midnight', backupCount=7)_formatter = logging.Formatter(_LOG_FORMAT)_handler.setFormatter(_formatter)_logger.addHandler(_handler)_logger.setLevel(logging.INFO)
このコードは、ルートの newrelic
ロガーインスタンスにアクセスし、回転するログファイルハンドラをアタッチし、このログファイルに送られるメッセージのログレベルを設定します。また、ログメッセージのフォーマットを設定する方法も示していますが、これはオプションです。
ロギングモジュール全体が初期化されると、ログ出力はルートロガーに関連付けられたハンドラーに伝わり、標準エラーを含めて記録されます。重複を避けるために、ルート・ロガーのログ・ハンドラを設定してください。
上記のコードは、 logging.fileConfig()
関数と設定ファイルを使用することでも簡略化できます。設定ファイルの使用についての詳細は、Python logging module documentation on Logging configuration を参照してください。
マルチプロセス構成でログを回転させる
標準のloggingモジュールで提供されている回転ログファイルハンドラーは、マルチプロセスサーバの構成で使用するには完全に安全ではありません。複数のプロセスからのメッセージが混ざってしまったり、複数のプロセスが同時にログファイルのローテーションを行おうとすると、問題が発生します。
より強固なログファイルのローテーションメカニズムのためには、サードパーティのログハンドラーをPythonのロギングモジュールと組み合わせて使用してください。
PyPiで利用可能なそのような実装の1つです。
より複雑なソリューションとして、以下のようなロギングサービスを検討することもできます。
また、Pythonのloggingモジュールで標準的に提供されている other handlers のリストも参考にしてください。ソケットへの送信やHTTP URLへの投稿のためのものも、状況によっては妥当な解決策になるかもしれません。