[Python] loggre 로그 출력을 JSON 형식으로 설정

35735 단어 Pythontech

개시하다


다음은 여러 로그 출력의Handler를 설정하는 방법을 요약한다.
내가 하고 싶은 일은 출력 컨트롤러의 출력 파일을 동시에 기록하는 것이다!!

날과 씨


실제 운용할 때 여러 개의 로그 출력 모드를 설정해야 한다.
이상 검출을 통해 조사할 때 의도적인 실행 처리가 이뤄졌는지 등을 감시한다.
  • 콘솔 출력: Stream Handler
  • 파일 출력:FileHandler
  • 그 외에도 SysLogHandler,SocketHandler,TimedRotatingFileHandler 등이 있다.

    절차.


    공식 문서를 참고하여 StreamHandler,FileHandler의handler를 조정합니다.
    코드에 직접 기술하는 방법도 있는데 이번에는 설정 파일로 만들었다.
    호출자의 파일 이름만 바꾸면 임의의 설정 파일을 사용할 수 있다는 장점이 있다.
  • 로그 출력 설정 파일에 대한 설정에 설정 파일 기술
  • 호출 측면에서logger 이름 지정
  • 로그가 예상 결과로 출력될 수 있는지 여부
  • 디테일


    형식 설정 파일(conf.json)
    {
      "version": 1,
      "formatters": {                                 ... 1
        "detailed": {
          "class": "logging.Formatter",
          "format": "%(asctime)s %(name)-15s %(levelname)-13s %(message)s",
          "datefmt": "%Y-%m-%d %H:%M:%S"
        }
      },
      "handlers": {
        "console": {                                 ... 2
          "class": "logging.StreamHandler",
          "level": "INFO",
          "formatter": "detailed"
        },
        "file": {
          "class": "logging.FileHandler",
          "filename": "log/mplog.log",
          "mode": "a",
          "formatter": "detailed"
        },
        "testfile": {
          "class": "logging.FileHandler",
          "filename": "log/testfile.log",
          "level": "ERROR",
          "mode": "a",
          "formatter": "detailed"
        },
        "errors": {                                  ... 3
          "class": "logging.FileHandler",
          "filename": "log/mplog-errors.log",
          "mode": "a",
          "level": "ERROR",
          "formatter": "detailed"
         }
      },
      "loggers": {                                   ... 4
        "testfile": {
          "handlers": ["testfile"]
        }
      },
      "root": {                                                             ... 5
        "level": "DEBUG",
        "handlers": ["console", "file", "errors"]
      }
    }
    

    1. formatters: 출력 형식 설정


  • detailed: 마음에 드는 이름을 지어서formatter의 이름을 붙일 수 있습니다

  • class:Formater 인스턴스 지정

  • format: 로그 출력 형식 모드

  • 데이터 fmt 조정: %(asctime)s의 표시
      "formatters": {
        "detailed": {
          "class": "logging.Formatter",
          "format": "%(asctime)s %(name)-15s %(levelname)-13s %(message)s",
          "datefmt": "%Y-%m-%d %H:%M:%S"
        }
    
  • 2.handlers: 출력 항목 설정(Stream Handler)


  • 좋아하는 handler 이름

  • level: 출력 레벨 설정

  • formatter:formatters에서 지정할 형식 이름
      "handlers": {
        "console": {
          "class": "logging.StreamHandler",
          "level": "INFO",
          "formatter": "detailed"
        },
    
  • 3. handlers: 출력 항목 설정(FileHandler)


  • erross:좋아하는handler명

  • filename:<디렉토리 경로>/<파일 출력 이름>

  • mode: 쓰기 모드 w: 새 쓰기, a: 추기 등
    "errors": {
        "class": "logging.FileHandler",
        "filename": "log/mplog-errors.log",
        "mode": "a",
        "level": "ERROR",
        "formatter": "detailed"
       }
    
  • 4.loggers:logger 이름 지정


    logger 이름을 지정하면 출력이 표시됩니다.다음 설정은 testfile의handler를 선택합니다.

  • 마음에 드는 이름을 짓다

  • handlers:handlers 이름의 이름 설정을 지정합니다
      "loggers": {
        "testfile": {
          "handlers": ["testfile"]
        }
    
    호출자의 logging을 지정하여 사용할 수 있음"testfile"👇이런 느낌.
    import logging
    
    logger = logging.getLogger("testfile")
    
  • 5. 루트: 설정


  • handlers에서 로그를 출력하고자 하는 대상의 이름을 목록에 저장함으로써 로그 출력은 항상 반영됩니다
      "root": {
        "level": "DEBUG",
        "handlers": ["console", "file", "errors"]
      }
    
  • 로그 생성/출력


    main () 에 호출 처리라고 쓰여 있습니다.상세히 설명하지 않다.
    main.py
    import configparser
    import os
    import json
    import logging
    
    import logging.config
    
    # 実行ファイル名を取得
    _EXEC_FILE_NAME = os.path.basename(__file__)[:-3]
    
    def read_conf_file(conf_file='conf/conf.json'):
        """ 設定ファイルの読み込む """
        with open(conf_file, 'r', encoding='utf-8') as f:
            f_ = json.load(f)
            logging.config.dictConfig(f_)
    
    def get_logger(logger_='simpleDefault'):
        """ ロガー生成 """
        return logging.getLogger(logger_)
    
    def set_conf(conf_file='conf/msg_format.ini'):
        """ Read the format file you set. """
        conf = configparser.ConfigParser()
        conf.read(conf_file)
        return conf
    
    def get_conf(conf, sec: str, option: str, format1=None, format2=None):
        """ Get the section name and key. """
        conf = conf.get(section=sec, option=option)
        return conf.format(format1, format2)
    
    def main():
        """ 実行ファイル """
    
        # formater ファイル呼び出し
        read_conf_file(conf_file='conf/conf.json')
    
        # logger 名を設定
        logger = get_logger(logger_=_EXEC_FILE_NAME)
    
        # メッセージ一覧設定ファイルの読み込み
        set_conf_ = set_conf(conf_file='conf/msg_format.ini')
    
        # ------------------------
        # ログ出力
        # ------------------------
    
        # Debug
       msg1 = get_conf(conf=set_conf_, sec='message', option='DAP0001', format1=[1, 2, 3], format2=[1, 2, 3])
        logger.debug(msg1)
    
        # Info
        msg2 = get_conf(conf=set_conf_, sec='message', option='IAP0001', format1=[1, 2, 3], format2=[1, 2, 3])
        logger.info(msg2)
    
        # Warning
        msg3 = get_conf(conf=set_conf_, sec='message', option='WAP0001', format1=[1, 2, 3], format2=[1, 2, 3])
        logger.warning(msg3)
    
        # Error
        msg4 = get_conf(conf=set_conf_, sec='message', option='EAP0001', format1=[1, 2, 3], format2=[1, 2, 3])
        logger.error(msg4)
    
        # Critical
        msg5 = get_conf(conf=set_conf_, sec='message', option='CAP0001', format1=[1, 2, 3], format2=[1, 2, 3])
        logger.critical(msg5)
    
    if __name__ == '__main__':
        main()
    
    
    로그 출력.메시지 목록의 설정 파일msg_format.ini
    [message]
    DAP0001=Debug Message user_id: {0[0]} tr_id: {0[1]} param_id: {0[2]} err_id: {1[0]}
    DAP0002=Debug Message user_id: {0[0]} tr_id: {0[1]} param_id: {0[2]}
    DAP0003=Debug Message user_id: {0[0]} tr_id: {0[1]}
    
    IAP0001=Info Message user_id: {0[0]} tr_id: {0[1]} param_id: {0[2]} err_id: {1[0]}
    IAP0002=Info Message user_id: {0[0]} tr_id: {0[1]} param_id: {0[2]}
    IAP0003=Info Message user_id: {0[0]} tr_id: {0[1]}
    
    WAP0001=Warning Message user_id: {0[0]} tr_id: {0[1]} param_id: {0[2]} err_id: {1[0]}
    WAP0002=Warning Message user_id: {0[0]} tr_id: {0[1]} param_id: {0[2]}
    WAP0003=Warning Message user_id: {0[0]} tr_id: {0[1]}
    
    EAP0001=Error Message user_id: {0[0]} tr_id: {0[1]} param_id: {0[2]} err_id: {1[0]}
    EAP0002=Error Message user_id: {0[0]} tr_id: {0[1]} param_id: {0[2]}
    EAP0003=Error Message user_id: {0[0]} tr_id: {0[1]}
    
    CAP0001=Critical Message user_id: {0[0]} tr_id: {0[1]} param_id: {0[2]} err_id: {1[0]}
    CAP0002=Critical Message user_id: {0[0]} tr_id: {0[1]} param_id: {0[2]}
    CAP0003=Critical Message user_id: {0[0]} tr_id: {0[1]}
    

    실행 결과


    하고 싶은 거 다 한 것 같아!
    콘솔 출력 INFO 레벨 이상
    2021-12-11 20:12:40 format          INFO          Info Message user_id: 1 tr_id: 2 param_id: 3 err_id: 1
    2021-12-11 20:12:40 format          WARNING       Warning Message user_id: 1 tr_id: 2 param_id: 3 err_id: 1
    2021-12-11 20:12:40 format          ERROR         Error Message user_id: 1 tr_id: 2 param_id: 3 err_id: 1
    2021-12-11 20:12:40 format          CRITICAL      Critical Message user_id: 1 tr_id: 2 param_id: 3 err_id: 1
    
    mplog.log:DEBUG 레벨 이상의 파일 출력
    2021-12-11 20:12:40 format          DEBUG         Debug Message user_id: 1 tr_id: 2 param_id: 3 err_id: 1
    2021-12-11 20:12:40 format          INFO          Info Message user_id: 1 tr_id: 2 param_id: 3 err_id: 1
    2021-12-11 20:12:40 format          WARNING       Warning Message user_id: 1 tr_id: 2 param_id: 3 err_id: 1
    2021-12-11 20:12:40 format          ERROR         Error Message user_id: 1 tr_id: 2 param_id: 3 err_id: 1
    2021-12-11 20:12:40 format          CRITICAL      Critical Message user_id: 1 tr_id: 2 param_id: 3 err_id: 1
    
    mplog-error.log:ERROR 이상의 파일 출력
    2021-12-11 20:12:40 format          ERROR         Error Message user_id: 1 tr_id: 2 param_id: 3 err_id: 1
    2021-12-11 20:12:40 format          CRITICAL      Critical Message user_id: 1 tr_id: 2 param_id: 3 err_id: 1
    

    총결산


    이번에는 로그 출력 설정을 이해할 수 있을 것 같아.
    그리고 다음 절차를 진행하는 것이 좋습니다!!
  • 업그레이드 후 사용하기 쉬운 수정 사항
  • 사용하기 편리하도록 로그 출력을 정확하게 설정
  • 이상입니다.감사합니다!

    참고 자료

  • Logging Cookbook - Python 3.10.1 documentation
  • Logging Cookbook - Python 3.10.1 documentation
  • 대상 창고: GitHub try-docs/src/conf_logger/↗︎ 많은 시도를 했기 때문에 참고만 한다
  • 좋은 웹페이지 즐겨찾기