Heim  >  Artikel  >  Backend-Entwicklung  >  So verwenden Sie das Protokollierungsmodul in Python

So verwenden Sie das Protokollierungsmodul in Python

WBOY
WBOYnach vorne
2023-05-12 18:10:061748Durchsuche

    1. Protokollierung bei niedriger Konfiguration

    Die Protokolle sind in die folgenden fünf Ebenen unterteilt: Debug-->Info-->Warnung-->Fehler-- >kritisch, die niedrigste Standardstufe ist die Warnstufe.

    1.v1

    import logging
    
    logging.debug('调试信息')
    logging.info('正常信息')
    logging.warning('警告信息')
    logging.error('报错信息')
    logging.critical('严重错误信息')

    WARNUNG: root: Warnmeldung
    KRITISCH: root: schwerwiegende Fehlermeldung

    v1-Version kann die Protokollebene nicht angeben; kann nur gehen zum Siebdruck, Schreiben in Datei nicht möglich. Daher kann es in den folgenden Code geändert werden.

    2.v2

    import logging
    
    # 日志的基本配置
    
    logging.basicConfig(filename='access.log',
                        format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
                        datefmt='%Y-%m-%d %H:%M:%S %p',
                        level=10)
    
    logging.debug('调试信息')  # 10
    logging.info('正常信息')  # 20
    logging.warning('警告信息')  # 30
    logging.error('报错信息')  # 40
    logging.critical('严重错误信息')  # 50

    Sie können das Standardverhalten des Protokollierungsmoduls durch bestimmte Parameter in der Funktion logging.basicConfig() ändern. Die verfügbaren Parameter sind:

    • Dateiname: Erstellen Sie einen FiledHandler mit dem angegebenen Dateinamen (. wird später ausführlich erläutert (Handlerkonzept), sodass das Protokoll in der angegebenen Datei gespeichert wird.

    • Dateimodus: Dateiöffnungsmodus. Dieser Parameter wird verwendet, wenn der Dateiname angegeben ist. Der Standardwert ist „a“ und kann auch als „w“ angegeben werden.

    • Format: Geben Sie das vom Handler verwendete Protokollanzeigeformat an.

    • datefmt: Datums- und Uhrzeitformat angeben.

    • level: Legen Sie die Protokollebene des Rootloggers fest (das spezifische Konzept wird später erläutert)

    • stream: Erstellen Sie einen StreamHandler mit dem angegebenen Stream. Sie können die Ausgabe in sys.stderr, sys.stdout oder einer Datei angeben. Der Standardwert ist sys.stderr. Wenn sowohl Dateiname als auch Stream-Parameter aufgeführt sind, wird der Stream-Parameter ignoriert.

    Formatzeichenfolgen, die im Formatparameter verwendet werden können:

    • %(name)s Name des Loggers

    • %(levelno)s Protokollebene in numerischer Form

    • %(levelname)s Protokoll Ebene in Textform

    • %(Pfadname)s Der vollständige Pfadname des Moduls, das die Protokollausgabefunktion aufruft, lautet möglicherweise nicht

    • %(Dateiname)s Der Dateiname des Moduls, das die Protokollausgabefunktion aufruft

    • % (module)s Der Modulname, der die Protokollausgabefunktion aufruft

    • %(funcName)s Der Funktionsname, der die Protokollausgabefunktion aufruft

    • %(lineno)d Die Codezeile, in der Die Anweisung, die die Protokollausgabefunktion aufruft, befindet sich der Logger wurde erstellt

    • %(asctime)s Zeichen Die aktuelle Zeit als String. Das Standardformat ist „2003-07-08 16:49:45,896“. Was auf das Komma folgt, sind Millisekunden

    • %(thread)d Thread-ID. Möglicherweise sind keine

    • %(threadName)s Thread-Namen vorhanden. Möglicherweise ist keine

    • %(process)d-Prozess-ID vorhanden. Möglicherweise werden vom Benutzer keine

    • %(message)s-Nachrichten ausgegeben. Version 2 kann keine Zeichenkodierung angeben; sie kann nur in eine Datei gedruckt werden.

      3.v3
    • Das Protokollierungsmodul enthält vier Rollen: Logger, Filter, Formatter-Objekt, Handler.

    • Logger: ein Objekt, das Protokolle generiert.

    Filter: ein Objekt, das Protokolle filtert. Formatter-Objekt : ja Passen Sie verschiedene Protokollformatobjekte an und binden Sie sie dann an verschiedene Handler-Objekte, um die Protokollformate verschiedener Handler zu steuern

    Handler: Protokolle empfangen und das Drucken an verschiedene Orte steuern, FileHandler wird zum Drucken in Dateien verwendet, StreamHandler wird verwendet zum Drucken auf dem Terminal

      '''
      critical=50
      error =40
      warning =30
      info = 20
      debug =10
      '''
      
      
      import logging
      
      # 1、logger对象:负责产生日志,然后交给Filter过滤,然后交给不同的Handler输出
      logger = logging.getLogger(__file__)
      
      # 2、Filter对象:不常用,略
      
      # 3、Handler对象:接收logger传来的日志,然后控制输出
      h2 = logging.FileHandler('t1.log')  # 打印到文件
      h3 = logging.FileHandler('t2.log')  # 打印到文件
      sm = logging.StreamHandler()  # 打印到终端
      
      # 4、Formatter对象:日志格式
      formmater1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                                     datefmt='%Y-%m-%d %H:%M:%S %p',)
      
      formmater2 = logging.Formatter('%(asctime)s :  %(message)s',
                                     datefmt='%Y-%m-%d %H:%M:%S %p',)
      
      formmater3 = logging.Formatter('%(name)s %(message)s',)
      
      
      # 5、为Handler对象绑定格式
      h2.setFormatter(formmater1)
      h3.setFormatter(formmater2)
      sm.setFormatter(formmater3)
      
      # 6、将Handler添加给logger并设置日志级别
      logger.addHandler(h2)
      logger.addHandler(h3)
      logger.addHandler(sm)
      
      # 设置日志级别,可以在两个关卡进行设置logger与handler
      # logger是第一级过滤,然后才能到handler
      logger.setLevel(30)
      h2.setLevel(10)
      h3.setLevel(10)
      sm.setLevel(10)
      
      # 7、测试
      logger.debug('debug')
      logger.info('info')
      logger.warning('warning')
      logger.error('error')
      logger.critical('critical')
    • 2. High-End-Protokollierung

      1. Konfigurieren Sie die Protokolldatei
    • Die oben genannten drei Protokollversionen dienen nur dazu, zu unserer folgenden Protokollkonfigurationsdatei zu führen

      import os
      import logging.config
      
      # 定义三种日志输出格式 开始
      standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
                        '[%(levelname)s][%(message)s]'  # 其中name为getLogger()指定的名字;lineno为调用日志输出函数的语句所在的代码行
      simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
      id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
      # 定义日志输出格式 结束
      
      logfile_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  # log文件的目录,需要自定义文件路径 # atm
      logfile_dir = os.path.join(logfile_dir, 'log')  # C:\Users\oldboy\Desktop\atm\log
      
      logfile_name = 'log.log'  # log文件名,需要自定义路径名
      
      # 如果不存在定义的日志目录就创建一个
      if not os.path.isdir(logfile_dir):  # C:\Users\oldboy\Desktop\atm\log
          os.mkdir(logfile_dir)
      
      # log文件的全路径
      logfile_path = os.path.join(logfile_dir, logfile_name)  # C:\Users\oldboy\Desktop\atm\log\log.log
      # 定义日志路径 结束
      
      # log配置字典
      LOGGING_DIC = {
          'version': 1,
          'disable_existing_loggers': False,
          'formatters': {
              'standard': {
                  'format': standard_format
              },
              'simple': {
                  'format': simple_format
              },
          },
          'filters': {},  # filter可以不定义
          'handlers': {
              # 打印到终端的日志
              'console': {
                  'level': 'DEBUG',
                  'class': 'logging.StreamHandler',  # 打印到屏幕
                  'formatter': 'simple'
              },
              # 打印到文件的日志,收集info及以上的日志
              'default': {
                  'level': 'INFO',
                  'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
                  'formatter': 'standard',
                  'filename': logfile_path,  # 日志文件
                  'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M  (*****)
                  'backupCount': 5,
                  'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
              },
          },
          'loggers': {
              # logging.getLogger(__name__)拿到的logger配置。如果''设置为固定值logger1,则下次导入必须设置成logging.getLogger('logger1')
              '': {
                  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
                  'handlers': ['default', 'console'],
                  'level': 'DEBUG',
                  'propagate': False,  # 向上(更高level的logger)传递
              },
          },
      }
      
      
      
      def load_my_logging_cfg():
          logging.config.dictConfig(LOGGING_DIC)  # 导入上面定义的logging配置
          logger = logging.getLogger(__name__)  # 生成一个log实例
          logger.info('It works!')  # 记录该文件的运行状态
          
          return logger
      
      
      if __name__ == '__main__':
          load_my_logging_cfg()

      2
      import time
      import logging
      import my_logging  # 导入自定义的logging配置
      
      logger = logging.getLogger(__name__)  # 生成logger实例
      
      
      def demo():
          logger.debug("start range... time:{}".format(time.time()))
          logger.info("中文测试开始。。。")
          for i in range(10):
              logger.debug("i:{}".format(i))
              time.sleep(0.2)
          else:
              logger.debug("over range... time:{}".format(time.time()))
          logger.info("中文测试结束。。。")
      
      
      if __name__ == "__main__":
          my_logging.load_my_logging_cfg()  # 在你程序文件的入口加载自定义logging配置
          demo()
    • 3. Django-Protokollkonfigurationsdatei
    • # logging_config.py
      # 学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
      LOGGING = {
          'version': 1,
          'disable_existing_loggers': False,
          'formatters': {
              'standard': {
                  'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'
                            '[%(levelname)s][%(message)s]'
              },
              'simple': {
                  'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
              },
              'collect': {
                  'format': '%(message)s'
              }
          },
          'filters': {
              'require_debug_true': {
                  '()': 'django.utils.log.RequireDebugTrue',
              },
          },
          'handlers': {
              # 打印到终端的日志
              'console': {
                  'level': 'DEBUG',
                  'filters': ['require_debug_true'],
                  'class': 'logging.StreamHandler',
                  'formatter': 'simple'
              },
              # 打印到文件的日志,收集info及以上的日志
              'default': {
                  'level': 'INFO',
                  'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,自动切
                  'filename': os.path.join(BASE_LOG_DIR, "xxx_info.log"),  # 日志文件
                  'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M
                  'backupCount': 3,
                  'formatter': 'standard',
                  'encoding': 'utf-8',
              },
              # 打印到文件的日志:收集错误及以上的日志
              'error': {
                  'level': 'ERROR',
                  'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,自动切
                  'filename': os.path.join(BASE_LOG_DIR, "xxx_err.log"),  # 日志文件
                  'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M
                  'backupCount': 5,
                  'formatter': 'standard',
                  'encoding': 'utf-8',
              },
              # 打印到文件的日志
              'collect': {
                  'level': 'INFO',
                  'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,自动切
                  'filename': os.path.join(BASE_LOG_DIR, "xxx_collect.log"),
                  'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M
                  'backupCount': 5,
                  'formatter': 'collect',
                  'encoding': "utf-8"
              }
          },
          'loggers': {
              # logging.getLogger(__name__)拿到的logger配置
              '': {
                  'handlers': ['default', 'console', 'error'],
                  'level': 'DEBUG',
                  'propagate': True,
              },
              # logging.getLogger('collect')拿到的logger配置
              'collect': {
                  'handlers': ['console', 'collect'],
                  'level': 'INFO',
              }
          },
      }
      
      
      # -----------
      # 用法:拿到俩个logger
      
      logger = logging.getLogger(__name__)  # 线上正常的日志
      collect_logger = logging.getLogger("collect")  # 领导说,需要为领导们单独定制领导们看的日志

    Das obige ist der detaillierte Inhalt vonSo verwenden Sie das Protokollierungsmodul in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen