Python loggingモジュールによる実装の原理解析


1.概要
いくつかのソフトウェアの実行時に発生したイベントを追跡する方法は、コードの中でログの中のいくつかの方法を呼び出して、発生したことを記録することができます。
一つのイベントは、任意の変数データを含むことができるメッセージで記述することができる。
イベントは自分の重要度レベルがあります。
2.logingログシステムを使用する四つのコンポーネント
  • loggersログ
  • アプリケーションコードを直接使用するインターフェース
  • を提供する。
  • handlesプロセッサ
  • は、ログレコードを指定の目的地に送信するためのものである

  • filtersフィルタ
  • 濾過して、どれらの出力のどれらのログ記録を決定して、残りは
  • を見落とします。
  • フォーマット
  • 制御ログ出力フォーマット
  • 使用コードは以下の通りです
    
    import os, time, logging, sys
    from Common.plugs.get_config import r_config
    
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
    if sys.platform == "win32":
      ENV_CONF_DIR = os.path.join(BASE_DIR, 'Common/conf/env_config.ini').replace('/', '\\')
    else:
      ENV_CONF_DIR = os.path.join(BASE_DIR, 'Common/conf/env_config.ini')
    log_path = r_config(ENV_CONF_DIR, "log", "log_path")
    
    
    class Log:
    
      def __init__(self, log_path):
        self.logName = os.path.join(log_path, '{0}.log'.format(time.strftime('%Y-%m-%d')))
    
      def console_log(self, level, message):
        #     logger
        logger = logging.getLogger()
        logger.setLevel(logging.DEBUG)
    
        #     handler,   debug       
        debug_file = logging.FileHandler(self.logName, 'a+', encoding='utf-8')
        debug_file.setLevel(logging.DEBUG)
    
        #      handler,        
        ch = logging.StreamHandler()
        ch.setLevel(logging.DEBUG)
    
        #   handler     
    
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    
        debug_file.setFormatter(formatter)
        ch.setFormatter(formatter)
    
        #  logger  handler
        logger.addHandler(debug_file)
        logger.addHandler(ch)
    
        #       
        if level == 'info':
          logger.info(message)
        elif level == 'debug':
          logger.debug(message)
        elif level == 'warning':
          logger.warning(message)
        elif level == 'error':
          logger.error(message)
    
        elif level == 'critical':
          logger.critical(message)
    
        logger.removeHandler(ch)
        logger.removeHandler(debug_file)
        debug_file.close()
    
      def debug(self, message): #       ,        
        self.console_log('debug', message)
    
      def info(self, message): #   DEBUG,           ,          
        self.console_log('info', message)
    
      def warning(self, message): #     ,        ,          
        self.console_log('warning', message)
    
      def error(self, message): #   WARNING     ,                 
        self.console_log('error', message)
    
      def critical(self, message):     ,                 
        self.console_log('critical', message)
    
    
    if __name__ == '__main__':
      Log(log_path).info("adasd")
      Log(log_path).error("dsadasddasd")
    '''
    以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。