ホームページ >バックエンド開発 >Python チュートリアル >Python で print の代わりにログ モジュールを使用する (ログの簡潔なガイド)
印刷を置き換えますか?印刷はどうなったのですか?
print は、Python 言語を学ぶ人が最初に触れるものかもしれません。その主な機能は、次のように情報をコンソールに出力することです:
Print は、ほとんどの人が自分のプログラムをデバッグするために使用するものでもあり、js を作成するときに console.log を使用するのと同じくらい自然です。 Python を学習し始めたばかりの多くの初心者や、ある程度の経験を持つベテランさえも、print を使用してコードをデバッグしています。
たとえば、これはフィボナッチ数列を出力するために私が書いた小さなプログラムです。そのコードを見てみましょう。
parser = argparse.ArgumentParser(description='フィボナッチ数列を出力します')
parser.add_argument('-s', '--start', type=int, dest='start',
help='シーケンスの開始'、required=True)
parser.add_argument('-e', '--end', type=int, dest='end',
help='シーケンスの終了'、required=True)
deffinity_fib():
a、b = 0、1
を生成します
収量 b
True の場合:
#print '計算前: a, b = %s, %s' % (a, b)
a、b = b、a + b
#print '計算後: a, b = %s, %s' % (a, b)
収量 b
def fib(開始、終了):
finity_fib() の cur の場合:
#print 'cur: %s, start: %s, end: %s' % (cur, start, end)
現在終了の場合:
戻る
cur >= start の場合:
#print '返される結果 %s' % cur
イールドカー
def main():
args = parser.parse_args()
fib(args.start, args.end) の n の場合:
print n,
if __name__ == '__main__':
main()
それがどのように機能するかを見てみましょう:
これは、この小さなプログラムを作成したときにデバッグ (DEBUG) に使用された出力情報であることがわかりました。プログラムが完成した後、これらの出力を自然にコメントアウトしました。この print ステートメントをオンにするとどうなるかを見てみましょう。
ご覧のとおり、すべての計算プロセスが印刷されます。
記述するときに print を追加し、コードを送信するときに print ステートメントを削除/コメントアウトすることを忘れないでください。なぜこのような手間を負わなければならないのでしょうか。 このユースケースのためにほぼ誕生した主人公のロギングを紹介しましょう。
より良いアプローチは、ログモジュール
を使用することです。ロギング モジュールは Python の組み込みロギング モジュールであり、ログ出力を非常に簡単に処理および管理するために使用できます。ロギング モジュールを使用する最も簡単な方法は、basicConfig メソッドを直接使用してロギングを構成することです:
# デフォルトのレベルを DEBUG に設定します
# ログ形式を設定します
logging.basicConfig(
レベル=logging.DEBUG、
format="[%(asctime)s] %(name)s:%(levelname)s: %(message)s"
)
# ログを記録します
logging.debug(...)
logging.info(...)
logging.warn(...)
logging.error(...)
logging.critical(...)
この方法でロギングを設定したら、単に ``logging.debug`` を使用してすべての print ステートメントを置き換えます。 次のような出力が表示されます:
リアルロガーを使用する
上記の BasicConfig メソッドは、ほとんどのシナリオのニーズを満たすことができますが、basicConfig には大きな欠点があります。
basicConfig を呼び出すと、実際にはルート ロガーにハンドラーが追加されるため、プログラムがロギングを使用する他のサードパーティ モジュールと連携する場合、サードパーティ モジュールのロガー動作に影響を与えます。これは、ロガーの継承特性によって決まります。
したがって、実際のロガーを使用する必要があります:
# fib という名前のロガーを使用します
ロガー =logging.getLogger('fib')
# ロガーレベルを DEBUG に設定します
logger.setLevel(logging.DEBUG)
# コンソールにログを出力する StreamHandler を作成します
hdr =logging.StreamHandler()
formatter =logging.Formatter('[%(asctime)s] %(name)s:%(levelname)s: %(message)s')
hdr.setFormatter(フォーマッタ)
# ロガーにハンドラーを追加します
logger.addHandler(hdr)
logger を使用してログを出力するだけです。ただし、この欠点は、コード サイズが BasicConfig よりもはるかに大きいことです。 したがって、非常に単純な小さなスクリプトの場合は、basicConfig を直接使用することをお勧めします。少し大きなプロジェクトの場合は、ロガーを慎重に構成することをお勧めします。
スクリプトからのすべての出力の動的制御
ロギングモジュールを使用した後、ロガーのログレベルを変更することでプログラムの出力を簡単に制御できます。 たとえば、フィボナッチ数列に -v パラメータを追加して、すべてのデバッグ情報の出力を制御できます。
# 冗長な裁判官
if args.verbose:
Logger.setLevel(logging.DEBUG)
それ以外:
Logger.setLevel(logging.ERROR)
このように、デフォルトでは、アプレットはデバッグ情報を出力しません。`-v/--verbose` が渡された場合にのみ、次のような追加のデバッグ情報を出力します。
$ python fib.py -s 1 -e 100 -v
[2014-03-18 15:17:45,216] fib:DEBUG: cur: 0、開始: 1、終了: 100
[2014-03-18 15:17:45,216] fib:DEBUG: cur: 1、開始: 1、終了: 100
[2014-03-18 15:17:45,216] fib:DEBUG: 結果 1 を返します
[2014-03-18 15:17:45,216] fib:DEBUG: 計算前: a, b = 0, 1
... ...
ご覧のとおり、ロギングを使用した後は、DEBUG 情報を出力する必要がある場合と、それを閉じる必要がある場合、すべてが非常に簡単になります。
それでは、スクリプト内の print をすぐに logg に置き換えてください。
多読
上記は、ログ モジュールの最も単純な関数の一部を紹介しただけであり、印刷の代わりに使用できます。ログ モジュールには、ファイルからの設定の読み取り、さまざまなハンドラーなど、非常に強力で便利な関数も多数あります。 。 待って。 ロギングの公式ドキュメントを読むことをお勧めします:
1.logging Python のロギング機能
2.ロギング方法
最後に、ロギング モジュールを使用したフィボナッチ数列プログラムの完全なコードを添付します。
parser = argparse.ArgumentParser(description='フィボナッチ数列を出力します')
parser.add_argument('-s', '--start', type=int, dest='start',
help='シーケンスの開始'、required=True)
parser.add_argument('-e', '--end', type=int, dest='end',
help='シーケンスの終了'、required=True)
parser.add_argument('-v', '--verbose', action='store_true', dest='verbose',
help='デバッグ情報を有効にする')
インポートログ
ロガー =logging.getLogger('fib')
logger.setLevel(logging.DEBUG)
hdr =logging.StreamHandler()
formatter =logging.Formatter('[%(asctime)s] %(name)s:%(levelname)s: %(message)s')
hdr.setFormatter(フォーマッタ)
logger.addHandler(hdr)
def 無限_fib():
a、b = 0、1
を生成します
収量 b
True の場合:
logger.debug('計算前: a, b = %s, %s' % (a, b))
a、b = b、a + b
logger.debug('計算後: a, b = %s, %s' % (a, b))
収量 b
def fib(開始、終了):
cur の infinity_fib():
logger.debug('cur: %s, start: %s, end: %s' % (cur, start, end))
cur>の場合終了:
戻る
if cur >= start:
logger.debug('結果 %s を返します' % cur)
イールドカー
def main():
args = parser.parse_args()
if args.verbose:
logger.setLevel(logging.DEBUG)
それ以外:
logger.setLevel(logging.ERROR)
for n in fib(args.start, args.end):
print n,
if __name__ == '__main__':
main()