• day20 logging模块、re模块


    今日内容:    
    1、logging模块
    2、re模块

    1、logging模块
    -- 什么是logging模块
    -- logging模块是用来进行记录日志的模块,主要作用是将想要输出的日志进行分级,然后以不同的形式呈现给用户或者记录在文件中
    -- logging日志的级别
    -- 在logging日志中,主要分为五个等级:
    debug: 最低的级别,用于记录默认的运行及调试信息,等级编号为 10
    info:信息级别,用于记录用户的日常使用信息,等级编号为 20
    warning:警告信息,用于记录程序中较为重要的信息,编号等级为 30
    error:错误信息,用于记录在程序中出现的错误信息,编号等级 40
    critical:致命错误信息,编号等级为 50
    -- 如何使用logging记录信息
    import logging
    
    logging.debug("debug")
    logging.info("info")
    logging.warning("warning")
    logging.error("error")
     logging.critical("critical")
            
    # 输出信息为:
    # WARNING:root:warning
    # ERROR:root:error
    # CRITICAL:root:critical
    # 在输出信息中没有输出前两个打印结果是因为打印的级别不够

    -- 如何自定义打印结果的格式及选择打印的位置?
    -- 我们发现,在进行打印时,信息的输出格式是固定的,且只能打印到控制台中,那么如何对打印信息进行格式化呢?
    -- logging.basicConfig() 方法
    logging.basicConfig(
    filename="aaa.log",
     filemode="at",
    datefmt="%Y-%m-%d %H:%M:%S %p",
     format="%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s",
     level=10
    )
                
    logging.debug("debug")
    logging.info("info")
    logging.warning("warning")
    logging.error("error")
    logging.critical("critical")
    -- 格式化输出的全部可用名称
    %(name)s:Logger的名字,并非用户名,详细查看
    %(levelno)s:数字形式的日志级别
    %(levelname)s:文本形式的日志级别
    %(pathname)s:调用日志输出函数的模块的完整路径名,可能没有
    %(filename)s:调用日志输出函数的模块的文件名
    %(module)s:调用日志输出函数的模块名
    %(funcName)s:调用日志输出函数的函数名
    %(lineno)d:调用日志输出函数的语句所在的代码行
    %(created)f:当前时间,用UNIX标准的表示时间的浮 点数表示
    %(relativeCreated)d:输出日志信息时的,自Logger创建以 来的毫秒数
    %(asctime)s:字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
    %(thread)d:线程ID。可能没有
    %(threadName)s:线程名。可能没有
    %(process)d:进程ID。可能没有
    %(message)s:用户输出的消息

    -- 定义了格式及输出位置之后,由于有时需要将同一份日志信息输出到不同的位置,此时,上面的方法是不能实现的此时需要进一步进行配置
    -- logging日志模块的四大组成部分
    -- 1.Logger 日志生成器 产生日志
    -- 2.Filter 日志过滤器 过滤日志
    -- 3.Handler 日志处理器 对日志进行格式化,并输出到指定位置(控制台或文件)
    -- 4.Formater 处理日志的格式
    -- 日志的工作周期及四部分的关系
    --> 首先一条日志通过日志生成器生成,并根据自己的level设置判断日志是否需要生成
    --> 通过日志生成器生成的日志交给到日志过滤器进行过滤(日志过滤器使用较少)
    --> 日志过滤器将通过的日志信息交给日志处理器,并使用formatter的格式对其进行格式化及将规定level的信息输出到不同的位置

    -- 创建具有多输出路径的日志生成器:此生成器可以进行使用,但是此方法过于简单,如果想要设置的较为复杂需要配置很多信息,使用起来较为复杂,

    
    
    # 创建日志生成器
    logger = logging.getLogger()
    
    # 创建句柄对象
    file_handler = logging.FileHandler("aaa.txt",encoding="utf-8")
    cmd_handler = logging.StreamHandler()
    
    # 创建格式化信息
    file_fmt = logging.Formatter(
        fmt="%(asctime)s - %(name)s - %(levelname)s:  %(message)s",
        datefmt="%m-%d %H:%M:%S %p"
    )
    cmd_fmt = logging.Formatter(
        fmt="%(asctime)s - %(levelname)s :  %(message)s",
        datefmt="%Y/%m/%d %H:%M:%S"
    )
    
    # 为生成器绑定句柄对象
    logger.addHandler(file_handler)
    logger.addHandler(cmd_handler)
    
    # 为句柄对象绑定输出的格式
    file_handler.setFormatter(file_fmt)
    cmd_handler.setFormatter(cmd_fmt)
    
    # 为句柄对象及生成器设置level
    logger.setLevel(10)
    file_handler.setLevel(20)
    cmd_handler.setLevel(40)
    
    logger.critical("logger生成的debug日志")
    
    
    -- 由于以上方法配置的信息较为简单,且不能完整的配置各种信息,为了能够完整的进行配置,logging提供了logging.get
    file_fmt = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' 
                  '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字
    
    cmd_fmt = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
    
    id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
    logfile_path = r"H:py8-studypracticeday20aaaa.txt" # 配置文件路径
    
    LOGGING_DIC = {
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {
            'file_fmt': {
                'format': file_fmt
            },
            'cmd_fmt': {
                'format': cmd_fmt
            },
        },
        'filters': {},
        'handlers': {
            #打印到终端的日志
            'cmd_handler': {
                'level': 'DEBUG',
                'class': 'logging.StreamHandler',  # 打印到屏幕
                'formatter': 'cmd_fmt'
            },
            #打印到文件的日志,收集info及以上的日志
            'file_handler': {
                'level': 'DEBUG',
                'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
                'formatter': 'file_fmt',
                'filename': logfile_path,  # 日志文件
                'maxBytes': 1024*1024*5,  # 日志大小 5M
                'backupCount': 5, #日志文件最大个数,超过后会覆盖之前的文件
                'encoding': 'utf-8',  # 日志文件的编码
            },
        },
        'loggers': {
            #logging.getLogger(__name__)拿到的logger配置
            'aa': {
                'handlers': ['cmd_handler', 'file_handler'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
                'level': 'DEBUG',
                'propagate': True,  # 向上(更高level的logger)传递
            },
        },
    }
    
    import logging.config
    
    def get_logger(name):
        logging.config.dictConfig(LOGGING_DIC)
        logger = logging.getLogger(name)
        return logger
    
    logger = get_logger("aa")
    logger.error("最终版打印的日志信息11111"
     
  • 相关阅读:
    MySQL 5.7以上 root用户默认密码问题
    Win10秘笈:两种方式修改网卡物理地址(MAC)
    Win10秘笈:两种方式修改网卡物理地址(MAC)
    MySQL——修改root密码的4种方法(以windows为例)
    每天一个linux命令:df 命令
    linux-Centos下磁盘管理(fdisk)
    我的云栖社区博客, 支持一下呗~~
    服务器操作系统应该选择 Debian/Ubuntu 还是 CentOS?
    服务器操作系统应该选择Debian/Ubuntu还是CentOS?
    经典网络还是VPC,开发者作何选择?
  • 原文地址:https://www.cnblogs.com/lice-blog/p/10841524.html
Copyright © 2020-2023  润新知