loggingログモジュール


目次
  • *loggingログモジュール**
  • loggingモード基本構造
  • を使用
  • ログのレベル
  • レベルの意味:
  • 異なるレベルのログ
  • を入力
  • 低レベルログもコンソール
  • に出力する.
  • formatログのコンテンツフォーマット
  • 時間表示
  • 現在の日付をコンソールに入力
  • 出力時間およびログコンテンツ
  • 出力ログレベル
  • ログが入力行
  • インタフェーステストでログ記録
  • を使用
  • は、通常のインタフェース要求
  • を送信する.
  • エラーリクエスト
  • を送信
  • エラーメッセージをログに出力する
  • loggingログモジュール
    コードやテストプログラムを書くときは、常に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)