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')