2016-05-24 9 views
4

(私は検索しましたが、この質問の複製は見つかりませんでしたが、そうでないと証明されてうれしいです)。ログの回転 - pythonとwindows

いくつかのPythonコード内からログをローテーションする必要があります。コードはWindows(Server 2008 R2)上で実行されています。

最初は私がTimedRotatingFileHandler(Pythonのlogging.handlersパッケージから)を使用しましたが、私が理解しているので、これは複数の処理で問題があるために必要ではありません(subprocess.check_callは別のアプリケーション)。

ジョブを実行する可能性があると思われるConcurrentLogHandlerをチェックアウトしましたが、最近問題が提起されていますが、2013年以降に更新されていないと心配しています。

UPDATEopen bug(2013年以降)は、ConcurrentLogHandlerがPython 2.7/Windowsでは動作しないことを示しています。ロギングでは、コードがハングするだけです。

ベストプラクティスはありますかWindows解決策を使用する必要がありますか?

+0

あなたが参照しているバグは、Pythonに含まれているものではなく、サードパーティのパッケージのものです –

+1

これを動作させるためにロギングサーバを使用している人が見つかりました:https://www.huyng .com/posts/python-logging-from-multiple-processes –

+1

これは役に立つかもしれません - http://plumberjack.blogspot.com/2010/09/using-logging-with-multiprocessing.html –

答えて

0

たぶん私は何かが足りないんだけど、PythonのloggingモジュールはRotatingFileHandlerが付属しています:

import logging 
import time 

from logging.handlers import RotatingFileHandler 

#---------------------------------------------------------------------- 
def create_rotating_log(path): 
    """ 
    Creates a rotating log 
    """ 
    logger = logging.getLogger("Rotating Log") 
    logger.setLevel(logging.INFO) 

    # add a rotating handler 
    handler = RotatingFileHandler(path, maxBytes=20, 
            backupCount=5) 
    logger.addHandler(handler) 

    for i in range(10): 
     logger.info("This is test log line %s" % i) 
     time.sleep(1.5) 

#---------------------------------------------------------------------- 
if __name__ == "__main__": 
    log_file = r"c:\path\to\test.log" 
    create_rotating_log(log_file) 

は、これはここでのWindows 7上のPython 2.7で私のためにうまく働い詳細に入るリンクのカップルです:

+0

はい - これは(元のreqtとして使用されていたTimedRotatingFileHandlerは、毎日ロールオーバーするログ用です)、複数のプロセスを混在させるまで絶対にうまく動作します。 2008年に同様の問題がバグとして記録されました(その後バグではなくなりました)(https://bugs.python.org/issue4749)。私の場合、余分なプロセスはログに書き込もうとしていませんが、同じ動作が見られます。 この点を明確にするために質問を更新します。 – azp74

0

OK - これが私がやったことです。

ログに関する限り、物事はマルチスレッドのみです(追加のプロセスはログに書き込まれません)。私はこのアプローチに夢中ではありません - スレッドロックオブジェクトを作成し、ロギングを閉じます(logging.shutdown - ドッグがプログラム終了時に呼び出すと言う...)。&起動再度ログを記録する。その後、ロックを解除します。

try/exceptブロック内にあります。何か問題が生じた場合は、ロックが解除されます。

テストでは、これが必要なことを示しています。

この種のコンテキストでlogging.shutdownを呼び出すと、わからないことがありますか?

関連する問題