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

So verwenden Sie das Protokollierungsmodul in Python

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Freigeben: 2023-05-12 18:10:06
nach vorne
1864 Leute haben es durchsucht

    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('严重错误信息')
    Nach dem Login kopieren

    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
    Nach dem Login kopieren

    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')
      Nach dem Login kopieren
    • 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()
      Nach dem Login kopieren

      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()
      Nach dem Login kopieren
    • 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")  # 领导说,需要为领导们单独定制领导们看的日志
      Nach dem Login kopieren

      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!

    Verwandte Etiketten:
    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
    Beliebte Tutorials
    Mehr>
    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage