配置字典

import logging
# 1.logger对象:产生日志(无包装的产品)
# logger = logging.getLogger('转账记录')
# # 2.filter对象:过滤日志(剔除不良品)
# '''
# 针对过滤功能完全可以不看 因为handler自带了基本的过滤操作
# '''
# # 3.handler对象:控制日志的输出位置(文件、终端...)(产品分类)
# hd1 = logging.FileHandler('a1.log', encoding='utf8')  # 输出到文件中
# hd2 = logging.FileHandler('a2.log', encoding='utf8')  # 输出到文件中
# hd3 = logging.StreamHandler()  # 输出到终端
# # 4.formatter对象:控制日志的格式(包装)
# fm1 = logging.Formatter(
#     fmt='%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s',
#     datefmt='%Y-%m-%d %H:%M:%S %p',
# )
# fm2 = logging.Formatter(
#     fmt='%(asctime)s - %(name)s: %(message)s',
#     datefmt='%Y-%m-%d',
# )
# # 5.给logger对象绑定handler对象
# logger.addHandler(hd1)
# logger.addHandler(hd2)
# logger.addHandler(hd3)
# # 6.给handler绑定formatter对象
# hd1.setFormatter(fm1)
# hd2.setFormatter(fm2)
# hd3.setFormatter(fm1)
# # 7.设置日志等级
# logger.setLevel(10)  # debug
# # 8.记录日志
# logger.debug('写了半天 好累啊 好热啊!!!')
import logging.config
import os
# 定义日志输出格式 开始
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
                  '[%(levelname)s][%(message)s]'
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
# 定义日志输出格式 结束
# 自定义文件路径
logfile_path = os.path.join(os.path.dirname(__file__), 'log',  'a1.log')
# log配置字典
LOGGING_DIC = {
    # 必选项,其值是一个整数值,表示配置格式的版本,当前惟一可用的值就是1
    'version': 1,
    # 可选项,默认值为True。该选项用于指定是否禁用已存在的日志器loggers,若是incremental的值为True则该选项将会被忽略
    'disable_existing_loggers': False,
    # 可选项,其值是一个字典对象,该字典对象每一个元素的key为要定义的格式器名称,value为格式器的配置信息组成的dict,如format和datefmt
    'formatters': {
        'standard': {
            'format': standard_format
        },
        'simple':  {
            'format': simple_format
        },
    },
    # 	可选项,其值是一个字典对象,该字典对象每一个元素的key为要定义的过滤器名称,value为过滤器的配置信息组成的dict,如name
    'filters': {},  # 过滤日志
    # 可选项,其值是一个字典对象,该字典对象每一个元素的key为要定义的处理器名称,value为处理器的配置信息组成的dcit,如class、level、formatter和filters,其中class为必选项,其它为可选项;其余配置信息将会传递给class所指定的处理器类的构造函数,以下面的handlers定义示例中的stream、filename、maxBytes和backupCount等
    'handlers': {
        # 打印到终端的日志
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',  # 打印到屏幕
            'formatter': 'simple'
        },
        # 打印到文件的日志,收集info及以上的日志
        'default': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
            'formatter': 'standard',
            'filename': logfile_path,  # 日志文件
            'maxBytes': 1024*1024*5,  # 日志大小 5M
            'backupCount': 5,
            'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
        },
    },
    # 可选项,其值是一个字典对象,该字典对象每一个元素的key为要定义的日志器名称,value为日志器的配置信息组成的dcit,如level、handlers、filters 和 propagate(yes
    'loggers': {
        # logging.getLogger(__name__)拿到的logger配置
        '': {
            'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
            'level': 'DEBUG',
            'propagate': True,  # 向上(更高level的logger)传递
        },  # 当键不存在的情况下(key设为空字符串)默认都会使用该k:v配置
        # '注册记录': {
        #   'handlers': ['console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
        #   'level': 'WARNING',
        #   'propagate': True,  # 向上(更高level的logger)传递
        # }, # 当键不存在的情况下(key设为空字符串)默认都会使用该k:v配置
    },
}

# root 可选项,这是root logger的配置信息,其值也是一个字典对象。除非在定义其它logger时明确指定propagate值为no,不然root logger定义的handlers都会被做用到其它logger上
# increment  可选项,这是root logger的配置信息,其值也是一个字典对象。除非在定义其它logger时明确指定propagate值为no,不然root logger定义的handlers都会被做用到其它logger上

# 使用日志字典配置
# logging.config.dictConfig(LOGGING_DIC)  # 自动加载字典中的配置
# logger1 = logging.getLogger('转账记录')
# logger2 = logging.getLogger('注册记录')
# logger1.debug('好好的 不要浮躁 努力就有收获')
# logger2.warning('尊敬的VIP客户 晚上好 您又来啦')

logging.config.dictConfig(LOGGING_DIC)  # 自动加载字典中的配置
logger1 = logging.getLogger('红浪漫顾客消费记录')
'''loggers配置中使用空字符串作为字典的键 兼容性最好'''
logger1.debug('fsdkfalkajsakljasd')
posted @ 2022-04-03 09:29  小金同学要加油  阅读(109)  评论(0)    收藏  举报