Windows Azure Web サイトのログ ストリーミングはD:/home/logfiles
、Web サイトのディレクトリ内の任意のテキスト ファイルに書き込まれた情報をストリーミングします。したがって、要件は、アプリケーションがそのログ ファイルをこのディレクトリに書き込むことです。ストリーミング サポートはかなり一般的で、LogFiles フォルダーにある任意のテキスト ファイルをストリーミングできます。しかし、それが機能するためには、ファイルが読み取り可能である必要があるため、排他的に開いていると機能しません。
Python では、アプリケーションの複数のインスタンスが同時に実行される可能性があるため、ファイルのロックが問題になる可能性があることを考えると、これを行うのは少し難しい場合があります。
これを回避するには、ログ ファイルへの同時書き込みアクセスを許可するConcurrentLogHandlerを使用します。これにはpywin32 (Python for Windows 拡張機能) が必要ですが、これは既定では Windows Azure Web サイトにインストールされないため、アプリケーションと共にその依存関係を含める必要があります。Windows Azure Web サイトで使用される Python ランタイムの適切なバージョン (現時点では Python 2.7 32 ビット) を含めるようにしてください。
DjangoWAWSLoggingサンプル プロジェクトは、その方法を示しています。settings.pyとviews.pyを参照してください。プロジェクトのREADMEで説明されているように、現時点では、ログは Web サイトが停止している場合にのみダウンロードできます。これはおそらく、ConcurrentLogHandler がファイルを排他モードで開いていることが原因です。この質問を参照してください。
このフラグメントは、環境変数をファイル名としてsettings.py
使用して、ログ ハンドラーを構成します。LOGFILE
'ConcurrentLogHandler':{
'level': 'DEBUG',
'class': 'cloghandler.ConcurrentRotatingFileHandler',
'formatter': 'verbose',
'filename': os.getenv('LOGFILE', 'django.log')
},
ログ ストリーミングでは複数のファイルを同時に処理できるため、次のように、各 Web サイト インスタンスのログを別のファイルに記録することをお勧めします。
'handlers': {
'logfile': {
'level':'DEBUG',
'class':'logging.handlers.RotatingFileHandler',
'filename': os.path.join(os.getenv('LOGPATH', "."), str(uuid.uuid1()) + ".log"),
'maxBytes': 1024 * 1024,
'backupCount': 9,
'formatter': 'standard',
},
},
LOGPATH は、Windows Azure Web サイトで "D:\home\logfiles" として構成された環境変数です。
おそらく、Python のドキュメンテーションによると、Windows では「ロギングによりファイルが排他ロックで開かれる」ためです。