2010-11-30 8 views
1

私は、subprocess.Popenを使用して多数のユーザープロセスを起動するpythonスクリプトを持っています。各プロセスstdoutは一意のファイルにリダイレクトされます。stdoutを複数のプロセスからpythonにリダイレクトするログモジュール

proc = my_proc 
for p in range(1, max_p, 1): 
    log_file = proc + "_" + str(p) + ".log" 
    log = open(log_file, "w+") 
    subprocess.Popen([my_proc, p], shell = False, stdout = log) 

を、例えば以下のように私は、各プロセスを起動し、私は、彼らが大きすぎるなったときに、これらのファイルを回転させるようにしたいと思います。これを行う最善の方法は何でしょうか?私は、ロギングモジュールを使用したいが、私は、これはその使用目的

おかげ

答えて

0

どの程度logging.handlers.RotatingFileHandlerあると思ういけませんか?

+0

おかげだが、私は、プロセスごとにロガーが必要です。このクラスで可能ですか? – mikip

+0

各プロセスのIDがあれば可能です。次にidをファイル名に焼くことができます。 –

1

ピジョンソニックソリューションではありません。 Linuxシステムではlogrotateを使ってログを自動的にローテーションする方が好きです。あなたのシステムにインストールされているかどうかを確認してください(ubuntuには/etc/logrotate.d/というディレクトリがあり、cronで自動的に実行されるファイルがあります)。これは、アプリケーション内からログのローテーションを実行する方が望ましい場合とそうでない場合があります。

古いファイルの圧縮ではN個のファイルをN個のファイルに保存し、cronを "100kサイズ以上"で回転させ、man logrotateを見ると非常に簡単に設定できます。

manページから、ここではサンプルファイルは

# sample logrotate configuration file 
    compress 

    /var/log/messages { 
     rotate 5 
     weekly 
     postrotate 
      /usr/bin/killall -HUP syslogd 
     endscript 
    } 

    "/var/log/httpd/access.log" /var/log/httpd/error.log { 
     rotate 5 
     mail [email protected] 
     size 100k 
     sharedscripts 
     postrotate 
      /usr/bin/killall -HUP httpd 
     endscript 
    } 
+0

ありがとうございます。しかし、pythonスクリプトから起動されるプロセスは100個までです。各プロセスとログファイルにエントリが必要ですか? – mikip

+0

すべてのプロセス/ログファイルのエントリは必要ありません。ワイルドカードをサポートしています。たとえば、すべてのログがディレクトリ/var/log/some_app/*.logに保存されている場合は、そのディレクトリ内のすべてのログファイルをローテーションすることができます。これは実際に私が切り捨てた3番目の例です。 –

関連する問題