0

初めてロギングモジュールをいじりました。私は本当に2つの質問があります:

FileHandler の作成で見つけたすべての例では、ダミーのファイル名を使用しているだけですが、ログ ファイルに特定のタイトル形式を持たせたいと考えています。

log = time.strftime('./logs/'+'%H:%M:%S %d %b %Y', time.localtime())+'.log'
logger = logging.getLogger('myproject')
formatter = logging.Formatter('%(asctime)s %(message)s', '%H:%M:%S %d %b %Y')
handler = logging.FileHandler(log)
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

ログファイルが作成されるという点で、これは最初は機能しているように見えますが、スクリプトを強制終了して調べると、そこには何もありません。の使用を提案する前に、 in の代わりにinをwith open(log) as f:使用すると、ファイルが作成されていないというエラーが表示されます。ログファイルが書き込まれないと何が間違っていますか? ファイル名を賢く使いすぎたせいでしょうか。floghandler = logging.FileHandler(log)

2 番目の質問は、最初の質問を何らかの形で包含している可能性があります。このスクリプトは時間がかかり、進行状況を測定したいので、コンソールとログ ファイルの両方に同時に書き込む方法が本当に必要です。hereなど、これを行う方法に関する回答があることを確認しましたが、これらはすべて、2つの異なる出力に対して異なるレベルのログが必要であることを前提としているようです。私はしません。ちなみに、私のスクリプトがログ ファイルの名前を動的に生成しなかった場合は、python myscript.py | tee log.fileさまざまなハンドラーを作成しないようにするなどの方法が考えられます。

最初の質問には変数が含まれているため、2 番目の質問に答えるのに苦労しているように感じますが、病気とその後の睡眠不足のために、今は霧がかかっています。5 歳児のように、コンソールとログ ファイルの両方に同じ出力を書き込む方法を誰かが説明してくれたら、とても助かります。

どうもありがとう。

4

1 に答える 1

2

あなたのコードは「myproject」という名前のロガーを設定しています:

logger = logging.getLogger('myproject')
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

そのロガーでメソッドを使用すると、すべてが機能します。

logger.info('foo bar')
logging.getLogger('myproject').info('foo bar')

ただし、モジュールレベルの関数を使用するだけでは、次のことはできません。

logging.info('foo bar')

なんで?モジュールレベルの関数はデフォルトのルートロガーを使用するため、これは構成したものではありません。これがどのように機能するかの詳細については、ドキュメントを参照してください。

一般に、これに対処する方法は、次のように、モジュールloggerごとにモジュールレベルのオブジェクトを作成することです。

logger = logging.getLogger(__name__)

…またはクラスまたはインスタンス属性logger、次のようなもの:

self.logger = logging.getLogger('{}.{}'.format(__name__, cls.__name__))

そして、モジュールレベルの関数ではなく、そのオブジェクトloggerまたはオブジェクトを介してすべてを実行します。self.logger

では、なぜモジュールレベルの関数がそこにあるのでしょうか。主に簡単なプログラムの便宜のために。それがあなたにとって適切であると思われ、それらを使用したい場合は、次のことができます。別のロガーではなく、ルートロガーを構成する必要があります。最初の行を次のように変更します。

logger = logging.getLogger()

これで、を構成loggerすると、モジュールレベルの機能も構成されます。

于 2013-02-28T21:55:58.140 に答える