Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonロギング:ガイド

アプリケーションを作成したばかりで、何かが意図したとおりに機能していないことに気づきました。実装したばかりの機能は、予期しない方法で動作しています。あなたは何をするべきか?この問題にどのように対処しますか?

ソフトウェア開発では、プログラマーはソフトウェアの実行中にイベントを追跡するためにロギングに依存しています。これにより、問題が発生した場合に、問題の原因を効果的に追跡できます。

このガイドでは、アプリケーションログを保持する必要がある理由と、Pythonログモジュールを使用してプログラム内のイベントを追跡する方法について説明します。

ログを保持する必要がある理由

ログを保持すると、より保守しやすいコードを作成するのに役立ちます。ロギングのようなモジュールを使用すると、プログラムで発生するすべてのイベントの正確な記録を保持できます。これは、実行されたコード行と実行に失敗したコード行を確認できることを意味します。

Pythonでは、開発者は多くの場合print()に依存しています コードをログに記録するステートメント。これは、初心者から専門家まで、誰もが使用することに罪を犯し、正当な理由があるという慣習です。 print() ステートメントは使いやすいです。簡単だ。

ただし、print() ステートメントは、コードのログを保持するための最良の方法ではありません。一つには、print() ステートメントを使用して、任意の出力をコンソールに出力できます。これは、ログとして保存される出力とメインプログラムの一部である出力を区別するのが混乱する可能性があることを意味します。さらに、print() ステートメントはデフォルトではログを保存しません。

そこで、Pythonロギングモジュールが役に立ちます。ロギングシステムモジュールを使用すると、コードで実行されたイベントのより正確な記録を保持できます。これにより、コードをより効果的にデバッグし、エラーを修正できます。

Pythonロギングモジュールの使用方法

このチュートリアルでは、基本的なログメッセージをプログラムに追加して、学生の成績のリストを調べ、試験に不合格か合格かを計算します。次のコードを検討してください:

参加者の81%は、ブートキャンプに参加した後、自分たちの技術的な仕事の見通しについてより自信を持っていると述べました。今日のブートキャンプにマッチしましょう。

平均的なブートキャンプの卒業生は、ブートキャンプの開始から最初の仕事を見つけるまで、キャリアの移行に6か月も費やしませんでした。

students = ["Martin", "Lewis", "Terri", "Bart"]
grades = [92, 78, 72, 38]
pass_fail = []

for i in range(0, len(students)):
	print("Calculating grade for {}".format(students[i]))
	if grades[i] > 55:
		pass_fail.append(True)
		print("{} has passed their exam.".format(students[i)))
	else:
		pass_fail.append(False)
		print("{} has failed their exam.".format(students[i)))

print("Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.")

上記のコードは、4年生のクラスの5人の生徒のそれぞれが試験に合格したかどうかを計算します。私たちのプログラムでは、3つのリストを宣言します。 1つのリストには、各学生の名前が格納されます。別のリストには、各学生が獲得した成績が保存されます。最終リストには、学生が試験に合格したか失敗したかが格納されます。

プログラムを実行すると、以下が返されます。

Calculating grade for Martin.
Martin has passed their exam.
Calculating grade for Lewis.
Lewis has passed their exam.
Calculating grades for Terri.
Terri has passed their exam.
Calculating grades for Bart.
Bart has failed their exam.
>

print() ステートメントはコードが機能していることを示していますが、logging()を使用できます 代わりにこのデータを表示するモジュール。これにより、デバッグメッセージとプログラムの出力を区別できるようになります。

まず、プログラムの上部にロギング標準ライブラリを追加しましょう:

import logging

ロギングライブラリをインポートしたので、コード内のログの追跡を開始できます。この例では、DEBUG構成を使用してログを追跡します。これは、現時点では警告の追跡には関心がないためです。参考までに、指定できるロギングオプションは次のとおりです。

  • クリティカル:重大なエラーを表示するために使用されます(logging.critical())
  • エラー:問題を表示するために使用されます(logging.error())
  • 警告:予期しない動作を示すために使用されます(logging.warning())
  • 情報:プログラムが機能していることを示すために使用されます(logging.info())
  • デバッグ:コードのデバッグに使用されます(logging.debug())

ロギングライブラリのデフォルト設定はWARNINGであるため、次のコードを使用してリセットする必要があります:

import logging

logging.basicConfig(level=logging.DEBUG)

これで、コードのデバッグを開始する準備が整いました。 print()を置き換えましょう グレードが計算されていること、またはプログラムがステートメントのデバッグを終了したことを示すステートメント:

import logging

logging.basicConfig(level=logging.DEBUG)

students = ["Martin", "Lewis", "Terri", "Bart"]
grades = [92, 78, 72, 38]
pass_fail = []

for i in range(0, len(students)):
	logging.debug("Calculating grade for {}".format(students[i]))
	if grades[i] > 55:
		pass_fail.append(True)
		print("{} has passed their exam.".format(students[i]))
	else:
		pass_fail.append(False)
		print("{} has failed their exam.".format(students[i]))

logging.debug("Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.")

コードを実行すると、次のように返されます。

DEBUG:root:Calculating grade for Martin
Martin has passed their exam.
DEBUG:root:Calculating grade for Lewis
Lewis has passed their exam.
DEBUG:root:Calculating grade for Terri
Terri has passed their exam.
DEBUG:root:Calculating grade for Bart
Bart has failed their exam.
DEBUG:root:Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.

出力に以前と同じコンテンツが含まれていることがわかります。ただし、「…の成績を計算しています」というメッセージと、成績が計算されたことを通知するメッセージは、表示が異なります。これらのステートメントの前に「DEBUG:root:」というテキストが表示されます。

これにより、プログラムがいつでも実行していることを追跡できます。ロギングイベントモジュールは前述のテキストをプログラムに追加するため、プログラムによって出力されたテキストとデバッグ用のテキストを簡単に把握できます。

この場合、「[学生]」というメッセージは、各学生が試験に合格したか失敗したかを示す重要な情報です。他のすべては、プログラムがどのように実行されているかを確認するのに役立ちますが、ユーザーには役立ちません。したがって、ロギング呼び出しを使用してこれらのステートメントを追跡します。

ログをファイルに保存する方法

ロギングモジュールを使用すると、ファイル内のログを追跡できます。これは、Pythonシェルを閉じた後、ログが失われないことを意味するため、便利です。プログラムが特定の機会にどのように実行されたかを永続的に記録します。

必要なのは、ログハンドラーの構成行にfilename引数を含めることだけです。プログラムは、ログをファイルに自動的に保存します。

import logging

logging.basicConfig(level=logging.DEBUG, filename="student_data.log")

…

コードを実行すると、指定したファイル名にログが追加されます。 「student_data.log」ファイルを開くと、次のように返されます。

DEBUG:root:Calculating grade for Martin
DEBUG:root:Calculating grade for Lewis
DEBUG:root:Calculating grade for Terri
DEBUG:root:Calculating grade for Bart
DEBUG:root:Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.

デバッグ出力には、logging.debug()を使用してログとして指定したメッセージのみが含まれていることに注意してください。 方法。これは、プログラム出力を区別するのに役立つため便利です。これは、print()を使用して示されます。 ステートメント–デバッグログから。

エントリがログに追加された時期を追跡するパラメータを追加することもできます。次のコードを使用してこれを行うことができます:

logging.basicConfig(
level=logging.DEBUG,
filename="student_data.log",
format="%(asctime)s:%(levelname)s:%(message)s"
)

このコードは、student_data.logファイルに次を追加します。

2020-06-18 08:27:50,123:DEBUG:Calculating grade for Martin
2020-06-18 08:27:50,123:DEBUG:Calculating grade for Lewis
2020-06-18 08:27:50,123:DEBUG:Calculating grade for Terri
2020-06-18 08:27:50,123:DEBUG:Calculating grade for Bart
2020-06-18 08:27:50,124:DEBUG:Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.

これで、コードの各行がいつ実行されたかがわかりました。より長いプログラムでは、このデータは、コードが実行されている順序とコードの速度を理解するのに役立つため、特に役立ちます。

結論

Pythonロギングモジュールは、デバッグに非常に便利なツールです。プログラムで実行されるすべてのイベントを追跡するのに役立ち、それらのイベントを個別のファイルとして保存するオプションを提供します。これにより、コードをより効果的にデバッグし、プログラムの実行時に実行されたイベントを理解するのに役立ちます。


  1. Pythonインタープリター:ステップバイステップガイド

    Pythonインタープリターは、マシンに正しいバージョンのPythonがインストールされていることを確認しなくてもオンラインで存在するため、Pythonは非常にアクセスしやすく学習できます。この記事では、Pythonインタープリターとは何かについて説明し、オンラインで使用できる、より人気のある、初心者向けのインタープリターをいくつかリストします。 Pythonプログラムはどのように実行されますか? Pythonは、Javaと同様に、インタプリタ言語またはコンパイル言語として完全に分類することはできません。両方のほんの少しです。 この場合にコンパイルされるということは、どの

  2. Pythonでのログイン

    この記事では、Pythonでのログインと、保護とセキュリティのさまざまな段階について学習します。 まず、ロギングモジュールをインポートし、次にロガーを使用して現在のステータスとログメッセージをchecj=kする必要があります。 5つの重大度レベルがあります。つまり- 警告 情報 エラー 重要 デバッグ ロギングモジュールを使用すると、構成を手動で設定しなくても直接開始できます。 例 Import logging logging.debug('a debug message') logging.info('an info message') logging