zoukankan      html  css  js  c++  java
  • Python的学习之旅———logging模块

    日志模块的级别

    critical=50
    error=40
    warning=30
    info=20
    debug=10
    notset=0

    1 import logging #默认的日志级别是:warning,默认的输出目标是:终端
    2 
    3 logging.debug('debug')
    4 logging.info('info')
    5 logging.warning('warn123')
    6 logging.error('error')
    7 logging.critical('critical')

    logging模块的主要部分

    1logger=logging.getLogger()  l

    ogger:日志对象,logging模块中最基础的对象,用logging.getLogger(name)方法进行初始化,name可以不填。通常logger的名字我们对应模块名,如聊天模块、数据库模块、验证模块等。

    2 Handler 对象

    3 Formatter

    4 Filter

     1 import logging
     2 #一:Logger对象:负责产生日志信息
     3 logger=logging.getLogger('root')
     4 
     5 
     6 #二:Filter对象:略
     7 
     8 
     9 #三:Handler对象:负责接收Logger对象传来的日志内容,控制打印到终端or文件
    10 h1=logging.FileHandler('t1.log')
    11 h2=logging.FileHandler('t2.log')
    12 h3=logging.StreamHandler()
    13 
    14 
    15 #四:formmater对象
    16 #给文件
    17 formatter1=logging.Formatter(
    18     '%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
    19     datefmt='%Y-%m-%d %H:%M:%S %p',
    20 )
    21 
    22 #给终端
    23 formatter2=logging.Formatter(
    24     '%(asctime)s - %(message)s',
    25     datefmt='%Y-%m-%d %H:%M:%S %p',
    26 )
    27 
    28 #五:为handler对象绑定日志格式,设置日志级别
    29 #给文件:绑定到Filehandler对象
    30 h1.setFormatter(formatter1)
    31 h2.setFormatter(formatter1)
    32 #给终端:绑定到Streamhandler对象
    33 h3.setFormatter(formatter2)
    34 
    35 #设置日志级别
    36 h1.setLevel(30)
    37 h2.setLevel(30)
    38 h3.setLevel(30)
    39 
    40 
    41 #六:把h1,h2,h3都add给logger,这样logger对象才能把自己的日志交给他们三负责输出
    42 logger.addHandler(h1)
    43 logger.addHandler(h2)
    44 logger.addHandler(h3)
    45 logger.setLevel(20) #括号的数字一定要<=Hanlder对象的数字
    46 
    47 
    48 #七:测试
    49 # logger.debug('debug')
    50 # logger.info('info')
    51 # logger.warning('warn123') #30
    52 # logger.error('error')
    53 # logger.critical('critical')

     用法推荐:

    使用字典配置的方法

    将配置文件写成字典的形式.

    使用 

    导入logging

    导入logging.config

    将写好的字典传给logging.config.dicConfig()

    配置字典

     1 """
     2 logging配置
     3 """
     4 
     5 import os
     6 import logging.config
     7 
     8 # 定义三种日志输出格式 开始
     9 
    10 standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' 
    11                   '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字
    12 
    13 simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
    14 
    15 id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
    16 
    17 # 定义日志输出格式 结束
    18 
    19 logfile_dir = os.path.dirname(os.path.abspath(__file__))  # log文件的目录
    20 
    21 logfile_name = 'all2.log'  # log文件名
    22 
    23 # 如果不存在定义的日志目录就创建一个
    24 if not os.path.isdir(logfile_dir):
    25     os.mkdir(logfile_dir)
    26 
    27 # log文件的全路径
    28 logfile_path = os.path.join(logfile_dir, logfile_name)
    29 
    30 # log配置字典
    31 LOGGING_DIC = {
    32     'version': 1,
    33     'disable_existing_loggers': False,
    34     'formatters': {
    35         'standard': {
    36             'format': standard_format
    37         },
    38         'simple': {
    39             'format': simple_format
    40         },
    41     },
    42     'filters': {},
    43     'handlers': {
    44         #打印到终端的日志
    45         'console': {
    46             'level': 'DEBUG',
    47             'class': 'logging.StreamHandler',  # 打印到屏幕
    48             'formatter': 'simple'
    49         },
    50         #打印到文件的日志,收集info及以上的日志
    51         'default': {
    52             'level': 'DEBUG',
    53             'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
    54             'formatter': 'standard',
    55             'filename': logfile_path,  # 日志文件
    56             'maxBytes': 1024*1024*5,  # 日志大小 5M
    57             'backupCount': 5,
    58             'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
    59         },
    60     },
    61     'loggers': {
    62         #logging.getLogger(__name__)拿到的logger配置
    63         '': {
    64             'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
    65             'level': 'DEBUG',
    66             'propagate': True,  # 向上(更高level的logger)传递
    67         },
    68     },
    69 }
    70 
    71 
    72 def load_my_logging_cfg():
    73     logging.config.dictConfig(LOGGING_DIC)  # 导入上面定义的logging配置
    74     logger = logging.getLogger(__name__)  # 生成一个log实例
    75     logger.info('It works!')  # 记录该文件的运行状态
    76 
    77 if __name__ == '__main__':
    78     load_my_logging_cfg()
    79 
    80 logging配置文件
    logging

     logger=logging.getLogger(name) 获取logger

    此处的name对应的是字典中loggers选项 ,如下

     1  'loggers': {
     2         #logging.getLogger(__name__)拿到的logger配置
     3         # l1=logging.getLogger('collect')拿到的logger配置
     4         # l2=logging.getLogger('l1')拿到的logger配置
     5         '': {
     6             'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
     7             'level': 'DEBUG',
     8             'propagate': True,  # 向上(更高level的logger)传递
     9         },
    10         'collect': {
    11             'handlers': ['collect', ],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
    12             'level': 'DEBUG',
    13             'propagate': False,  # 向上(更高level的logger)传递
    14         },

    这个字典一个选项默认是空.这样你传入的参数可以使用name=__name__ 的形式传入参数.这么传入参数的逻辑是传入的参数

    1 是'__main__' 或者是代码所在的文件名.无论哪种,在字典中都没有对应的值,logging模块做了一个判断,获取的是字典中' '的选项

    2 传入的是字典中对应的名字 'collect'那就获取了对应的配置选项.

  • 相关阅读:
    敏捷实践-学习实践资料汇总
    从数据仓库到数据湖—浅谈数据架构演进
    JVM知识点汇总备忘
    Protobuf的使用和原理
    kafka数据定时导入hive便于后续做数据清洗
    Mybatis Mapper接口动态代理实现原理及二次开发
    软考论文-写作大纲-备考思路总结
    css3另一个属性写法
    css3动画效果
    jquery点击鼠标后关闭图片
  • 原文地址:https://www.cnblogs.com/surehunter/p/7725361.html
Copyright © 2011-2022 走看看