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