Maison  >  Article  >  développement back-end  >  Comment utiliser le module de journalisation en Python

Comment utiliser le module de journalisation en Python

WBOY
WBOYavant
2023-05-12 18:10:061727parcourir

    1. Journalisation de configuration faible

    Le journal est divisé en cinq niveaux suivants, qui vont de bas en haut. Match debug-->info-->avertissement-->erreur-->critique Le niveau le plus bas par défaut est le niveau d'avertissement.

    1.v1

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

    WARNING : root : message d'avertissement
    ERROR : root : message d'erreur
    CRITICAL : root : erreur grave Informations La version

    v1 ne peut pas spécifier le niveau de journalisation ; elle ne peut pas spécifier le format de journal ; elle peut uniquement imprimer sur l'écran et ne peut pas écrire dans les fichiers. Par conséquent, il peut être modifié par le code suivant.

    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

    Vous pouvez modifier le comportement par défaut du module de journalisation via des paramètres spécifiques dans la fonction logging.basicConfig(). Les paramètres disponibles sont : #🎜🎜. ##🎜 🎜#

      filename : Créez un FileHandler avec le nom de fichier spécifié (le concept de gestionnaire sera expliqué en détail plus tard), afin que le journal soit stocké dans le fichier spécifié.
    • filemode : Mode d'ouverture de fichier, ce paramètre est utilisé lorsque le nom de fichier est spécifié. La valeur par défaut est "a" et peut également être spécifiée comme "w".
    • format : Spécifiez le format d'affichage du journal utilisé par le gestionnaire.
    • datefmt : Spécifiez le format de la date et de l'heure.
    • level : Définissez le niveau de journalisation de rootlogger (le concept spécifique sera expliqué plus tard)
    • stream : Utilisation spécifiée Le flux crée un StreamHandler. Vous pouvez spécifier la sortie vers sys.stderr, sys.stdout ou un fichier. La valeur par défaut est sys.stderr. Si les paramètres de nom de fichier et de flux sont répertoriés, le paramètre de flux sera ignoré.
    • Chaîne de formatage pouvant être utilisée dans le paramètre de format :

      %(name)s Logger Name
    • %(levelno)s niveau de journalisation sous forme numérique
    • %(levelname)s sous forme de texte Le niveau de journalisation de
    • %(pathname)s est le chemin d'accès complet du module qui appelle la fonction de sortie de journal, qui peut ne pas être
    • #🎜🎜 #

      # 🎜🎜#%(filename)s Le nom de fichier du module qui appelle la fonction de sortie de journal

    • %(module)s Le nom de le module qui appelle la fonction de sortie de journal

      # 🎜🎜#
    • %(funcName)s Le nom de la fonction pour appeler la fonction de sortie de journal

    • %(lineno)d L'instruction pour appeler la fonction de sortie du journal La ligne de code où

    • %(created)f l'heure actuelle est représentée par la norme UNIX nombre à virgule flottante représentant le temps

    • %(relativeCreated)d Le nombre de millisecondes depuis la création du Logger lors de la sortie des informations du journal

      #🎜🎜 #
    • %(asctime)s L'heure actuelle sous forme de chaîne. Le format par défaut est "2003-07-08 16:49:45,896". Ce qui suit la virgule est l'identifiant du fil de discussion
    • %(thread)d en milliseconde. Il se peut qu'il n'y ait pas de nom de fil de discussion
    • %(threadName). Il se peut qu'il n'y ait pas d'ID de processus
    • %(process)d. Il se peut qu'aucun message
    • %(message) ne soit émis par l'utilisateur
    • la version v2 ne peut pas spécifier codage des caractères ; vous pouvez uniquement imprimer dans des fichiers.
    • 3.v3

    • Le module de journalisation contient quatre rôles : enregistreur, filtre, objet Formateur, gestionnaire

    logger : l'objet qui génère les logs

      Filter : l'objet qui filtre les logs
    • Formatter object : peut être personnalisé L'objet de format de journal est ensuite lié à différents objets Handler pour contrôler le format de journal des différents gestionnaires
    • Handler : recevoir les journaux, puis contrôler l'impression vers différents Où, FileHandler est utilisé pour imprimer dans le fichier, et StreamHandler est utilisé pour imprimer sur le 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 Journalisation haut de gamme
    • 1. Fichier journal de configuration

    • Les trois versions de journaux ci-dessus visent simplement à conduire à notre fichier de configuration de journal ci-dessous
    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. . Profil du journal Django #🎜🎜 #
    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()

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer