0

私の計画は、スクリプトが実行されるたびに、現在の時間を取得して、生成するログファイル用のフォルダーを作成することです。スクリプトの各ステップで、このフォルダーに新しいログファイルが作成されます。

問題は、スクリプトの実行中に同じフォルダーを使用する方法を理解しようとしていることです。現在起こっていることは、ロガーが作成されるたびに現在の時刻を取得し、毎回新しいフォルダーを作成することです。

モジュールは次のようになります。

logger.py

...

CURRENT_TIME = # get current time
LOG_FOLDER = "logs/%s/" % CURRENT_TIME

...

def get_logger(name):
    # Create a log file with the given name in the LOG_FOLDER

import logger.py何が起こるかは、私が再計算するたびCURRENT_TIMEです。これを回避する方法はfrom logger.py import *、すべてのモジュールに対してコードを1回実行し、それらに同じログフォルダーを持たせることです。

問題は、スクリプトが他のPythonスクリプトを呼び出し、新しいプロセスなどを生成することです。これらの新しいプロセスがロガーをインポートするとき、まだインポートしていないため、再生成されCURRENT_TIMEます。

では、これを修正する良い方法は何ですか?私が考えた解決策の1つは、ロガーにという定数フォルダーを使用させtemp、メインスクリプトが終了したら、現在の時刻に名前を変更する(または、スクリプトの先頭に現在の時刻を保存する)ことです。例外やエラーが発生してスクリプトが停止した場合のように、このソリューションはあまり好きではありません。tempその場合、フォルダーはスクリプトの時間になりたいときに残るので、いつ失敗したかがわかります。

4

3 に答える 3

1

古典的な解決策は、プロセスとすべての子の間で共有される環境変数を使用することです。

デモ(x.pyとして保存、警告:何度も何度も呼び出されます):

import os
import random
from subprocess import call

def get_logger():
    return os.environ.setdefault("LOG_DIR", logger_name())

def logger_name(): return "log" + str(random.random())

print "Process " + str(os.getpid()) + " uses " + get_logger()

call(["python",  "x.py"])

参照:os.environ docs、環境変数の概念

于 2012-08-15T20:28:40.533 に答える
1

より良いアプローチは、アプリケーションの起動時にを実装しRotatingFileHandlerて実行することです。doRollover()

于 2012-08-15T20:32:01.783 に答える
0

スクリプトを最初に開始するときに、starttimeをtempディレクトリ内のファイルに書き込みます。

ロガーが実行されると、tempディレクトリ内のファイルで時間値が検索されます。

スクリプトがクラッシュした場合、メインスクリプトを再度開始すると、以前の値が置き換えられるため、この実行のログは正しい場所にあります。

クリーンアップスクリプトでtempディレクトリからstarttimeを削除することもできます。

于 2012-08-15T20:31:25.837 に答える