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'那就获取了对应的配置选项.

  • 相关阅读:
    跳出iframe
    leetcode 225. Implement Stack using Queues
    leetcode 206. Reverse Linked List
    leetcode 205. Isomorphic Strings
    leetcode 203. Remove Linked List Elements
    leetcode 198. House Robber
    leetcode 190. Reverse Bits
    leetcode leetcode 783. Minimum Distance Between BST Nodes
    leetcode 202. Happy Number
    leetcode 389. Find the Difference
  • 原文地址:https://www.cnblogs.com/surehunter/p/7725361.html
Copyright © 2011-2022 走看看