2011-01-02 3 views
3

私は、操作に関するログレコードをどこに書き込むかについて考えています。ここには2つの異なるスタイルがあります。最初の1つは、操作の前にログを書き込みます。前操作の前または後にログを書き込みますか?

log.info("Perform operation XXX") 
operation() 

そして、ここでは異なるスタイルで、操作後にログを書き込みます。

後:前-スタイルで

operation() 
log.info("Operation XXX is done.") 

、ログレコードが今やって何が起こっているかと言います。このスタイルのプロは、何か問題が起こったときに、開発者が今何をしているのかを知っているので、簡単にそれを検出できるということです。しかし、誤った操作があった場合、たとえば、関数呼び出しがブロックされて返ってこないなど、操作が正しく終了しているかどうかわからない場合は、ログ記録を読み取ってもそれを知ることはできません。アフタースタイルでは、操作が完了したと確信しています。もちろん

、私たちは一緒に

両方をこれら二つのスタイルを混在させることができます:

log.info("Perform operation XXX") 
operation() 
log.info("Operation XXX is done.") 

しかし、私はそれはちょっと冗長であると感じ、それは二重のログ記録を行います。だから、ここに私の質問です - 良い伐採スタイルは何ですか?あなたはどう思いますか?

ありがとうございました。

答えて

5

私は通常、2つの異なるログレベルを使用します。最初のものは「デバッグ」レベル、もう1つは「情報」レベルです。そうすれば、典型的なプロダクションマシンは何が行われているのかだけをログに記録しますが、デバッグログを有効にして、エラーが出る前に何をしようとしているのか見ることができます。

2

すべてはログに記録する内容によって異なります。コードを操作しようとしているところに興味があれば、操作が成功したことを確認したい場合は、後に行います。両方をしたい場合は、両方を行います。

0

後者の形態:

log.info("Start XXX") 
operation() 
log.info("End XXX") 

それはほとんどの情報を提供するので。

ログレベルを明示的に下げることができるため、通常の動作状態では冗長すぎません。

0

Linuxのブートスクリプトやstraceで使用されているスタイルがあります。それはあなたの結合されたスタイルの利点をより少ない冗長で持っていますが、あなたのロギングファシリティがバッファリングをしていないことを確認しなければなりません。私はここにprintとラフな例です、log.infoを知らない:

print "Doing XXX... ", # Note lack of newline :) 
operation() 
print "Done." 

は(ほとんどの場合printは、バッファリングを使用しているので、そのままこの例を使用すると、正常に動作しませんあなたが「XXXを行う」は表示されません。

このスタイルのもう一つの欠点は、同じログに複数のスレッドが書き込まれていると事態が混乱するということです。

+0

私はこれをしないことを強く勧めます。 'operation()'にログを追加したいのですが?また、 'print'は新しい行を追加します。私はそれがちょうど擬似コードだと知っていますが、これはロギングライブラリのいずれかで実装するのは簡単ではありません。 – Falmarri

+0

これは本当です。あなたは確かにネストの問題にぶつかることがあります。 'print'に関しては、AIUIは最後にカンマをつけて改行を抑制します。 – Jander

0

多分あなたはtry catchのようなものを使うことができますか?ここに素朴なPythonの例があります:

try : 
    operation() 
    log.info("Operation XXX is done.") 
except Exception: 
    log.info("Operation xxx Failed") 
    raise Exception() # optional : if you want to propagate failure to another try catch statement and/or crash eventually. 

操作が開始されます。 失敗しない場合(例外は発生していません)、ログに成功ステートメントが表示されます。

例外が発生した場合は、ディスクがいっぱいになっているか、何をしようとしているかのように、例外がキャッチされ、失敗のステートメントが表示されます。

ログはいっそう意味がいっぱいです。あなたはオンライナーに冗長を保ち、操作が成功したかどうかを知ることができます。すべての選択のベスト。

ああ、障害発生時に実行されるコードを追加できるフックポイントがあります。

私は助けてくれることを願っています。

関連する問題