loggingログモジュール
目次*loggingログモジュール** loggingモード基本構造 を使用ログのレベル レベルの意味: 異なるレベルのログ を入力低レベルログもコンソール に出力する. formatログのコンテンツフォーマット 時間表示 現在の日付をコンソールに入力 出力時間およびログコンテンツ 出力ログレベル ログが入力行 インタフェーステストでログ記録 を使用は、通常のインタフェース要求 を送信する.エラーリクエスト を送信エラーメッセージをログに出力する loggingログモジュール
コードやテストプログラムを書くときは、常にprint出力をデバッグする必要がありますが、大量の情報を表示する必要がある場合やファイルに保存する必要がある場合はprintは適用されませんloggingログモジュールを使用して、その出力のログ情報を保存することができます
loggingモード基本構造の使用
まず簡単なloggingログコードを書いて、その構造がどのようになっているかを見てみましょう.
まずモジュールをインポートし、メソッドを呼び出してパラメータをメソッドに渡す(basicConfigのパラメータはキーワード動的パラメータ**kwargs)
下のコードのbasicConfigは2つのパラメータlevelを渡します:ログのレベルfilename:ログ保存のパス
最終出力ログの内容
実行が完了するとdataディレクトリの下でlogを見つけて開く.logファイルには出力の内容が表示されます(注意:ログを表示するのは符号化ですGBKですUTF-8では文字化けしてしまう可能性があります)
ログのレベル
レベルソート:CRITICAL>ERROR>WARNING>INFO>DEBUG
レベルの意味:
debug:すべてのログを出力します.詳細はデバッグが一般的です.
info:info,warning,error,criticalレベルのログを印刷し、予想通りに実行されていることを確認します.
WARNING:warning,error,criticalレベルのログプログラムが予定通りに実行されていませんが、エラーではありません.
ERROR:error、criticalレベルのログを印刷し、より深刻な問題プログラムがエラーを出した場合に使用します.例えば、IO操作に失敗しました.
CRITICAL:criticalレベルが印刷され、重大なエラーが発生しました.これは、プログラム自体が実行を続行できない可能性があることを示しています.
異なるレベルのログを入力
異なるレベルのログの効果を出力します
コンソールにwarningレベル以上のログが出力されているだけでwarningレベル未満のログが出力されている場合は、コンソールに出力されていません.ファイルに記録して表示するしかありません.
コンソールにも低レベルのログを出力
低レベルのログ出力をコンソールに出力してデバッグする場合は、levelはNOTSETレベルを導入して表示できます.
レベルがNOTSETに設定された下位レベルのログもコンソールに出力できます
formatログのコンテンツフォーマット
パラメータ
内容
message
ログの内容
asctime
ログ時間
levelname
ログのレベル
filename
ファイル名
lineno
ファイル内の行番号
時間表示
以前に出力されたログには日付がないので、後で表示するときは友好的ではありません.そのため、ログに時間フォーマットを追加する必要があります.
現在の日付をコンソールに入力
basicConfigパラメータformatを渡す:タイムモジュールをフォーマットする
上から現在の時間が出力されます
出力時間とログの内容
上は時間しか出力できません.今は時間とログの内容を一緒に出力する必要があります.
formatにmessageコントロールを追加してメッセージボックスに表示されるメッセージを指定します
出力ログレベル
出力されたログフォーマットにログのレベルbasicConfigのパラメータformatに%sを追加すればよい
ログの行を入力
ログに行を追加すると、問題のクエリーが容易になります.
出力されたログフォーマットにログのレベルbasicConfigのパラメータformatにlinenoを追加すればよい
出力ログの内容は17行
現在出力されているログから、いつどのレベルのイベントがどの行でどのような内容が発生しているかがわかります.
このようなログは比較的にはっきりしています
以上、ログ記録の基本的な使い方を完了しましたので、インタフェーステストで運用してみましょう.
インタフェーステストでのログの使用
インタフェースをテストして結果をログに出力
通常のインタフェースリクエストの送信
次にdataディレクトリのlogファイルを開きます
ログに表示される応答ステータスコードは200 msgフィールドに対応する値は、取得に成功しました.
エラーリクエストの送信
正常なAPIリクエストを送信してログを表示するのは正常です.では、わざとリクエストアドレスを間違えてログ出力を見てみましょう.
要求アドレスを1文字間違えて見てください
ログ・ファイルを再度開くと、応答ステータス・コードが404であることがわかります.
上のエラーのリクエストはステータスコードしか出力できません.コンソールのエラーメッセージもログに出力したいです.
エラーメッセージをログに出力
エラーの可能性のあるコードをtryに配置し、異常をキャプチャしてエラーの情報を記録します.
再度ログファイルを開くとエラーメッセージが表示されます
コードやテストプログラムを書くときは、常にprint出力をデバッグする必要がありますが、大量の情報を表示する必要がある場合やファイルに保存する必要がある場合はprintは適用されませんloggingログモジュールを使用して、その出力のログ情報を保存することができます
loggingモード基本構造の使用
まず簡単なloggingログコードを書いて、その構造がどのようになっているかを見てみましょう.
まずモジュールをインポートし、メソッドを呼び出してパラメータをメソッドに渡す(basicConfigのパラメータはキーワード動的パラメータ**kwargs)
下のコードのbasicConfigは2つのパラメータlevelを渡します:ログのレベルfilename:ログ保存のパス
最終出力ログの内容
import logging#
logging.basicConfig(
level=logging.INFO, #
filename="data/log.log"#
)
logging.info(" ")#
実行が完了するとdataディレクトリの下でlogを見つけて開く.logファイルには出力の内容が表示されます(注意:ログを表示するのは符号化ですGBKですUTF-8では文字化けしてしまう可能性があります)
ログのレベル
レベルソート:CRITICAL>ERROR>WARNING>INFO>DEBUG
レベルの意味:
debug:すべてのログを出力します.詳細はデバッグが一般的です.
info:info,warning,error,criticalレベルのログを印刷し、予想通りに実行されていることを確認します.
WARNING:warning,error,criticalレベルのログプログラムが予定通りに実行されていませんが、エラーではありません.
ERROR:error、criticalレベルのログを印刷し、より深刻な問題プログラムがエラーを出した場合に使用します.例えば、IO操作に失敗しました.
CRITICAL:criticalレベルが印刷され、重大なエラーが発生しました.これは、プログラム自体が実行を続行できない可能性があることを示しています.
異なるレベルのログを入力
異なるレベルのログの効果を出力します
import logging
logging.debug("deDUB")
logging.info("info ")
logging.warning("warning")
logging.error("error")
logging.critical("critical")
>>>WARNING:root:warning
>>>ERROR:root:error
>>>CRITICAL:root:critical
コンソールにwarningレベル以上のログが出力されているだけでwarningレベル未満のログが出力されている場合は、コンソールに出力されていません.ファイルに記録して表示するしかありません.
コンソールにも低レベルのログを出力
低レベルのログ出力をコンソールに出力してデバッグする場合は、levelはNOTSETレベルを導入して表示できます.
import logging#
logging.basicConfig(
level=logging.NOTSET, #
)
logging.debug(" ")#
>>>
レベルがNOTSETに設定された下位レベルのログもコンソールに出力できます
formatログのコンテンツフォーマット
パラメータ
内容
message
ログの内容
asctime
ログ時間
levelname
ログのレベル
filename
ファイル名
lineno
ファイル内の行番号
時間表示
以前に出力されたログには日付がないので、後で表示するときは友好的ではありません.そのため、ログに時間フォーマットを追加する必要があります.
現在の日付をコンソールに入力
basicConfigパラメータformatを渡す:タイムモジュールをフォーマットする
import logging#
logging.basicConfig(
level=logging.NOTSET, #
format="%(asctime)s"#
)
logging.debug(" ")#
>>>2020-05-19 14:06:35,750
上から現在の時間が出力されます
出力時間とログの内容
上は時間しか出力できません.今は時間とログの内容を一緒に出力する必要があります.
formatにmessageコントロールを追加してメッセージボックスに表示されるメッセージを指定します
import logging#
logging.basicConfig(
level=logging.NOTSET, #
format="%(asctime)s: %(message)s"#
)
logging.debug(" ")#
>>>2020-05-19 15:08:26,221:
出力ログレベル
出力されたログフォーマットにログのレベルbasicConfigのパラメータformatに%sを追加すればよい
import logging#
logging.basicConfig(
level=logging.NOTSET, #
format="%(asctime)s: %(levelname)s: %(message)s"#
)
logging.debug(" ")#
>>>2020-05-19 15:55:20,970: DEBUG:
ログの行を入力
ログに行を追加すると、問題のクエリーが容易になります.
出力されたログフォーマットにログのレベルbasicConfigのパラメータformatにlinenoを追加すればよい
import logging#
logging.basicConfig(
level=logging.NOTSET, #
format="%(asctime)s: %(levelname)s: %(lineno)s %(message)s"#
)
logging.debug(" ")#
>>>2020-05-19 18:07:15,238: DEBUG: 17
出力ログの内容は17行
現在出力されているログから、いつどのレベルのイベントがどの行でどのような内容が発生しているかがわかります.
このようなログは比較的にはっきりしています
以上、ログ記録の基本的な使い方を完了しましたので、インタフェーステストで運用してみましょう.
インタフェーステストでのログの使用
インタフェースをテストして結果をログに出力
通常のインタフェースリクエストの送信
import logging#
import requests
logging.basicConfig(
level=logging.NOTSET, #
filename=("data/log.log"),
format="%(asctime)s: %(levelname)s:%(lineno)s %(message)s"
)
# logging.debug(" ")#
def test_API():
r = requests.post(
"http://127.0.0.1:5000/index/info",
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36"
}
)
logging.info(r.status_code)#
logging.info(r.json()['msg'])# msg
test_API()
次にdataディレクトリのlogファイルを開きます
2020-05-20 11:59:31,546: DEBUG:205 Starting new HTTP connection (1): qgyilingmuyan.com:80
2020-05-20 11:59:31,635: DEBUG:393 http://127.0.0.1:5000 "POST /index/info HTTP/1.1" 200 None
2020-05-20 11:59:31,648: INFO:17 200
2020-05-20 12:07:38,121: INFO:18
ログに表示される応答ステータスコードは200 msgフィールドに対応する値は、取得に成功しました.
エラーリクエストの送信
正常なAPIリクエストを送信してログを表示するのは正常です.では、わざとリクエストアドレスを間違えてログ出力を見てみましょう.
要求アドレスを1文字間違えて見てください
import logging#
import requests
logging.basicConfig(
level=logging.NOTSET, #
filename=("data/log.log"),
format="%(asctime)s: %(levelname)s:%(lineno)s %(message)s"
)
# logging.debug(" ")#
def test_API():
r = requests.post(
"http://127.0.0.2:5000/ndex/info",
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36"
}
)
logging.info(r.status_code)
logging.info(r.json()['msg'])
test_API()
ログ・ファイルを再度開くと、応答ステータス・コードが404であることがわかります.
2020-05-20 12:22:52,316: DEBUG:205 Starting new HTTP connection (1):127.0.0.1:5000
2020-05-20 12:22:52,376: DEBUG:393 http://127.0.0.1:5000 "POST ndex/info HTTP/1.1" 404 None
2020-05-20 12:22:52,380: INFO:17 404
上のエラーのリクエストはステータスコードしか出力できません.コンソールのエラーメッセージもログに出力したいです.
エラーメッセージをログに出力
エラーの可能性のあるコードをtryに配置し、異常をキャプチャしてエラーの情報を記録します.
import logging#
import requests
logging.basicConfig(
level=logging.INFO, #
filename=("data/log.log"),
format="%(asctime)s: %(levelname)s:%(lineno)s : %(message)s"
)
# logging.debug(" ")#
def test_API():
try:
r = requests.post(
"http://127.0.0.1:5000/indeX/info",
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36"
}
)
logging.info(r.status_code)
logging.info(r.json())
except Exception as e:
logging.error(" ",exc_info = 1)#
test_API()
再度ログファイルを開くとエラーメッセージが表示されます
2020-05-20 14:12:03,397: INFO:18 : 404
2020-05-20 14:12:03,400: ERROR:21 :
Traceback (most recent call last):
File "D:/demo2/day1/TCP.py", line 19, in test_API
logging.info(r.json())
File "C:\Users\root\AppData\Local\Programs\Python\Python37\lib\site-packages\requests\models.py", line 897, in json
return complexjson.loads(self.text, **kwargs)
File "C:\Users\root\AppData\Local\Programs\Python\Python37\lib\json\__init__.py", line 348, in loads
return _default_decoder.decode(s)
File "C:\Users\root\AppData\Local\Programs\Python\Python37\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Users\root\AppData\Local\Programs\Python\Python37\lib\json\decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)