2012-02-02 6 views
18

私は、Linuxのlogrotateコマンドによってローテーションされているログファイルに書き込んでいるPythonプログラムを持っています。これが起こると、古いファイルへの書き込みをやめ、新しいファイルへの書き込みを開始するようプログラムに信号を送る必要があります。私は信号を処理することができますが、私は新しいファイルに書き込むようにPythonに指示しますか?Pythonロギングとローテーションファイル

logging.basicConfig(format='%(asctime)s:%(filename)s:%(levelname)s:%(message)s',filename=log_file, level=logging.INFO) 

をし、このようにそれに書き込む:

私はこのようなファイルを開封しております

logging.log(level,"%s" % (msg)) 

のロギングモジュールは、非常に強力なだけでなく、圧倒的に見えます。ありがとう。

答えて

14

これを実装するには、WatchedFileHandlerを参照するか、代替として、RotatingFileHandlerでログのローテーションを実装し、両方ともlogging.handlers moduleにある場合があります。

+0

ありがとうございます!私が必要とするなら、私はこのルートに行くことができますが、現在、ファイルはすでに私のコードの外側に回転されています。ログを閉じてそれを再び開く方法があることを期待していました。 – fredsnertz

+0

ああ... WatchedFileHandler ...今すぐ取得します。 – fredsnertz

4
from logging import handlers 

handler = handlers.TimedRotatingFileHandler(filename, when=LOG_ROTATE) 

handler.setFormatter(logging.Formatter(log_format, datefmt="%d-%m-%Y %H:%M:%S")) 

#LOG_ROTATE = midnight  
#set your log format 

これは回転はすでにあなたがもう一度logging.basicConfig(...)を呼び出す必要があり、それは、ログファイルを再度開く必要があり、あなたのシグナルハンドラでは、logrotateによって行われているので、ログ

7

を回転取り扱いに役立つはずです。

13

logging.basicConfigを使用しないでください。WatchedFileHandlerを使用してください。それを使用する方法は次のとおりです。

import time 
import logging 
import logging.handlers 

def log_setup(): 
    log_handler = logging.handlers.WatchedFileHandler('my.log') 
    formatter = logging.Formatter(
     '%(asctime)s program_name [%(process)d]: %(message)s', 
     '%b %d %H:%M:%S') 
    formatter.converter = time.gmtime # if you want UTC time 
    log_handler.setFormatter(formatter) 
    logger = logging.getLogger() 
    logger.addHandler(log_handler) 
    logger.setLevel(logging.DEBUG) 

log_setup() 
logging.info('Hello, World!') 
import os 
os.rename('my.log', 'my.log-old') 
logging.info('Hello, New World!') 
+0

例をありがとう!私がやろうとしていたことに非常に似ています:) – houcros

+0

ドキュメントごとに、これは* nixでしか動作しません。 –