zoukankan      html  css  js  c++  java
  • day24

    日志功能使用

    log_settings.py

    """
    logging配置
    """
    
    import os
    
    # 1、定义三种日志输出格式,日志中可能用到的格式化串如下
    # %(name)s Logger的名字,是记录信息的key
    # %(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用户输出的消息
    
    # 2、强调:其中的%(name)s为getlogger时指定的名字   如#task_id:测试日志 或者 用户交易
    
    # 日志记录的格式1文件)
    standard_format = '[%(asctime)s][task_id:%(name)s][%(filename)s:%(lineno)d]' 
                      '[%(levelname)s][%(message)s]'
    # 日志记录的格式2(终端)
    simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
    
    # 日志记录的格式3(文件)
    test_format = '%(asctime)s] %(message)s'
    BASE_DIR = os.path.dirname(os.path.dirname(__file__))
    LOG_DIR = os.path.join(BASE_DIR, 'log')# log文件的目录
    BANK_PATH = os.path.join(LOG_DIR, 'bank.log')
    SYS_LOG1_PATH = os.path.join(LOG_DIR, 'system.log')
    SHOPPING_LOG1_PATH = os.path.join(LOG_DIR, 'shopping.log')
    
    # 3、日志配置字典
    LOGGING_DIC = {
        'version': 1,  # 版本,自定义的
        'disable_existing_loggers': False,  # 关闭已存在日志 #自定义的
        'formatters': {  # formatters:日志记录的格式分类,名字是固定的
            'standard': {  # 文件采用的日志格式,名字是自定定义的
                'format': standard_format  # format:日志记录的格式,名字是固定的
            },
            'simple': {  # 终端采用的日志格式,名字是自定定义的
                'format': simple_format
            },
            'test': {  # 文件采用的日志格式,名字是自定定义的
                'format': test_format
            },
        },
    
        'filters': {},  # 不用管
    
        # handlers是日志的接收者,不同的 handler会将日志输出到不同的位置(如终端或文件)
        'handlers': {
            # 1) 终端接收日志
            'console': {  # console是自定义的,它是接收日志的位置方式名字
                'level': 'DEBUG',  # 接收日志记录级别
                # 往哪里输,输出到哪个位置
                'class': 'logging.StreamHandler',  # 打印到屏幕
                # 日志记录格式
                'formatter': 'simple'
            },
    
            # 2) 文件接收日志,收集info及以上的日志(等级)
            'default': {  # default是自定义的, 它是接收日志的位置方式名字
                'level': 'DEBUG',  # 接收日志记录级别
                # 往哪里输,输出到哪个位置
                'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,日志轮转
                # 日志记录格式
                'formatter': 'standard',
                # 可以定制日志文件路径
                # BASE_DIR = os.path.dirname(os.path.abspath(__file__))  # log文件的目录
                # LOG_PATH = os.path.join(BASE_DIR,'a1.log')
                # 保存的日志文件的文件名
                # LOG_PATH = os.path.join(BASE_DIR,'a1.log')
                'filename': BANK_PATH,  # 银行日志文件  #这里应该放绝对路径
                # 日志文件大小
                'maxBytes': 1024 * 1024 * 5,  # 日志大小5M, 超过就会新建一个日志文件,将老的日志转到新建的文件中
                'backupCount': 5,  # 日志备份最多保存几份,超过的就会被删除
                'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
            },
    
            # 3) 其他自定义日志,文件接收
            'other': {
                'level': 'DEBUG',  # 接收日志记录级别
                # 往哪里输
                'class': 'logging.FileHandler',  # 保存到文件
                # 日志记录格式
                'formatter': 'test',
                # os.path.join(os.path.dirname(os.path.dirname(__file__)), 'a2.log')
                'filename': SYS_LOG1_PATH,  # 系统日志文件
                'encoding': 'utf-8',
            },
            # 4) 其他自定义日志,文件接收
            'other1': {
                'level': 'DEBUG',  # 接收日志记录级别
                # 往哪里输
                'class': 'logging.FileHandler',  # 保存到文件
                # 日志记录格式
                'formatter': 'test',
                # os.path.join(os.path.dirname(os.path.dirname(__file__)), 'a2.log')
                'filename': SHOPPING_LOG1_PATH,  #购物车日志文件
                'encoding': 'utf-8',
            },
        },
    
        # loggers 是日志的产生者,产生的日志会传递给 handler 然后控制输出
        'loggers': {
            # logging.getLogger(__name__)拿到的logger配置,即以下:
            # 日志产生配置 1
            'shopping': {  # 日志的产生者 1 (测试日志:是记录信息的 key)
                'handlers': ['other1', ],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
                # 记录日志级别
                'level': 'DEBUG',  # loggers(第一层日志级别关限制)--->handlers(第二层日志级别关卡限制),
                'propagate': False,  # 默认为True,向上(更高level的logger)传递,通常设置为False即可,否则会一份日志向上层层传递
            },
    
            # 日志产生配置 2
            '': {  # 日志的产生者 2 (用户交易:是记录信息的key)
                'handlers': ['default', ],
                # 记录日志级别
                'level': 'DEBUG',  # loggers(第一层日志级别关限制)--->handlers(第二层日志级别关卡限制)
                'propagate': False,  # 默认为True,向上(更高level的logger)传递,通常设置为False即可,否则会一份日志向上层层传递
            },
    
            # 日志产生配置 3 (针对不同场景,输出不同的记录关键字:这是在logging.getLogger(__name__)找不到__anme__ 时,会使用这个日志产生配置)
            'system': {  # 日志的产生者3  记录信息的key为:logging.getLogger(__name__)的__name__
                'handlers': ['other', ],# 只将日志打印到文件
                # 记录日志级别
                'level': 'DEBUG',  # loggers(第一层日志级别关限制)--->handlers(第二层日志级别关卡限制)
                'propagate': False,  # 默认为True,向上(更高level的logger)传递,通常设置为False即可,否则会一份日志向上层层传递
            },
        },
    }
    
    
    

    common.py

    import logging.config   #这样连同logging.getLogger都一起导入了,然后使用前缀logging.config.
    
    def log(func, flow):
        '''日志记录'''
        # 1、导入模块:config 和 getLogger
        # 2、加载配置
        logging.config.dictConfig(log_settings.LOGGING_DIC)
        # 3、拿到日志的产生者,即 loggers 来产生日志
        logger1 = logging.getLogger(f'{func}')  # 日志的方式(信息往哪里输入)
        # 4、输入日志记录内容
        logger1.info(flow)
    

    结果展示:

    #system.log
    '''
    2020-04-01 22:35:02,364] egon登录成功!
    2020-04-01 22:47:30,539] sean注册成功!
    '''
    
    #shopping.log
    '''
    2020-04-01 22:49:09,808] 用户egon购买商品飞机,数量:1, 共花费了2000元
    '''
    
    #bank.log
    '''
    [2020-04-01 22:35:09,525][task_id:还款][common.py:63][INFO][用户egon还款1000元]
    [2020-04-01 22:49:52,455][task_id:查看余额][common.py:63][INFO][用户egon查看余额]
    [2020-04-01 22:49:58,173][task_id:提现][common.py:63][INFO][用户egon提现了1000元]
    '''
    
  • 相关阅读:
    hdu 5366 简单递推
    hdu 5365 判断正方形
    hdu 3635 并查集
    hdu 4497 数论
    hdu5419 Victor and Toys
    hdu5426 Rikka with Game
    poj2074 Line of Sight
    hdu5425 Rikka with Tree II
    hdu5424 Rikka with Graph II
    poj1009 Edge Detection
  • 原文地址:https://www.cnblogs.com/xy-han/p/12616592.html
Copyright © 2011-2022 走看看