zoukankan      html  css  js  c++  java
  • day 24笔记

    一、logging 模块

    import logging

    logging.basicConfig(
    # 1、日志输出位置:1、终端 2、文件
    filename='access.log', # 不指定,默认打印到终端

    # 2、日志格式
    format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',

    # 3、时间格式
    datefmt='%Y-%m-%d %H:%M:%S %p',

    # 4、日志级别
    # critical => 50
    # error => 40
    # warning => 30
    # info => 20
    # debug => 10
    level=10,
    )

    logging.debug('调试debug') # 10
    logging.info('消息info') # 20
    logging.warning('警告warn')# 30
    logging.error('egon提现失败') # 40
    logging.critical('严重critical') # 50

    """
    日志配置字典LOGGING_DIC
    """
    # 1、定义三种日志输出格式,日志中可能用到的格式化串如下
    # %(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用户输出的消息

    # 2、强调:其中的%(name)s为getlogger时指定的名字
    standard_format = '%(asctime)s - %(threadName)s:%(thread)d - 日志名字:%(name)s - %(filename)s:%(lineno)d -'
    '%(levelname)s - %(message)s'

    simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'

    test_format = '%(asctime)s] %(message)s'

    # 3、日志配置字典
    LOGGING_DIC = {
    'version': 1, #版本
    'disable_existing_loggers': False, #禁用现有的记录器
    'formatters': { #定制不同的日志格式对象,绑定给不同的handler对象使用
    'standard': {
    'format': standard_format
    },
    'simple': {
    'format': simple_format
    },
    'test': {
    'format': test_format
    },
    },
    'filters': {}, #过滤日志的对象
    # handlers是日志的接收者,不同的handler会将日志输出到不同的位置
    'handlers': {
    #打印到终端的日志
    'console': {
    'level': 'DEBUG',
    'class': 'logging.StreamHandler', # 打印到屏幕
    'formatter': 'simple'
    },
    'default': {
    'level': 'DEBUG',
    'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,日志轮转
    'maxBytes': 1024*1024*5, # 日志大小 5M
    'backupCount': 5, # 备份计数
    'filename': 'a1.log', # os.path.join(os.path.dirname(os.path.dirname(__file__)),'log','a2.log')
    'encoding': 'utf-8',
    'formatter': 'standard',
    },
    #打印到文件的日志,收集info及以上的日志
    'other': {
    'level': 'DEBUG',
    'class': 'logging.FileHandler', # 保存到文件
    'filename': 'a2.log', # os.path.join(os.path.dirname(os.path.dirname(__file__)),'log','a2.log')
    'encoding': 'utf-8',
    'formatter': 'test',

    },
    },
    # loggers是日志的产生者,产生的日志会传递给handler然后控制输出
    'loggers': {
    #logging.getLogger(__name__)拿到的logger配置 #name是loggers子子典当中的key
    'kkk': {
    'handlers': ['console','other'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
    'level': 'DEBUG', # loggers(第一层日志级别关限制)--->handlers(第二层日志级别关卡限制)
    'propagate': False, # 默认为True,向上(更高level的logger)传递,通常设置为False即可,否则会一份日志向上层层传递
    },
    '终端提示': {
    'handlers': ['console',],
    'level': 'DEBUG',
    'propagate': False,
    },
    '': {
    'handlers': ['default', ],
    'level': 'DEBUG',
    'propagate': False,
    },
    },
    }
    # 4、应用
    import settings

    # 1、logging是一个包,需要使用其下的config、getLogger,可以如下导入
    # from logging import config
    # from logging import getLogger

    # 2、也可以使用如下导入
    import logging.config # 这样连同logging.getLogger都一起导入了,然后使用前缀logging.config.

    # 3、加载配置
    logging.config.dictConfig(settings.LOGGING_DIC)

    # 4、拿到日志的产生者即loggers来产生日志
    # logger1=getLogger('kkk')
    # logger1.info('这是一条info日志')

    # logger2=getLogger('终端提示')
    # logger2.info('logger2产生的info日志')

    # logger3=getLogger('用户交易')
    # logger3.info('logger3产生的info日志')

    # logger4=getLogger('用户常规') #当getLogger取不到对象是,默认使用key=''的配置
    # logger4.info('logger4产生的info日志')


    # 5、补充两个重要额知识
    # 1、日志名的命名
    # 日志名是区别日志业务归属的一种非常重要的标识

    # 2、日志轮转
    # 日志记录着程序员运行过程中的关键信息,所以不能随意删,为了避免放在同一个日志文件中造成文件过大,加载缓慢,
       需要一种设定,超出限制后会将之前的内容写到另一个文件中,当前文件只剩新内容
    (实际上老文件是做了重命名用来保存老内容,然后再生成一个新的空文件,命名为原名,保存新内容)
    re正则匹配:

    import re

    # print(re.findall('Aalex',' alexis alex sb')) ==>[] 字符串开头是空格
    #
    # print(re.findall('sb',' alexis alexsb sb'))
    #
    # print(re.findall('sb',"""alex
    # alexis
    # alex
    # sb
    # """)) ==> [] 只匹配到换行前的结束字符串

    # print(re.findall('sb$',"""alex
    # alexis
    # alex
    # sb
    # """)) ==> ['sb']

    # print(re.findall('^alex$','alexis alex sb'))
    # print(re.findall('^alex$','al ex'))
    # print(re.findall('^alex$','alex')) ==>混用时必须完全一样才能匹配

    # 重复匹配:| . | * | ? | .* | .*? | + | {n,m} |

    # 1、.:匹配除了 之外任意一个字符,指定re.DOTALL之后才能匹配换行符
    # print(re.findall('a.b','a1b a2b a b abbbb a b a b a*b'))
    # a.b
    # ['a1b','a2b','a b','abb','a b','a*b']
    # print(re.findall('a.b','a1b a2b a b abbbb a b a b a*b',re.DOTALL))

    # 2、*:左侧字符重复0次或无穷次,性格贪婪
    # print(re.findall('ab*','a ab abb abbbbbbbb bbbbbbbb'))
    # ab*
    #['a','ab','abb','abbbbbbbb']

    # 3、+:左侧字符重复1次或无穷次,性格贪婪
    # print(re.findall('ab+','a ab abb abbbbbbbb bbbbbbbb'))
    # ab+

    # 4、?:左侧字符重复0次或1次,性格贪婪
    # print(re.findall('ab?','a ab abb abbbbbbbb bbbbbbbb'))
    # ab?
    # ['a','ab','ab','ab']

    # 5、{n,m}:左侧字符重复n次到m次,性格贪婪
    # {0,} => *
    # {1,} => +
    # {0,1} => ?
    # {n}单独一个n代表只出现n次,多一次不行少一次也不行

    # print(re.findall('ab{2,5}','a ab abb abbb abbbb abbbbbbbb bbbbbbbb'))
    # ab{2,5}
    # ['abb','abbb','abbbb','abbbbb]

    # print(re.findall('d+.?d*',"asdfasdf123as1111111.123dfa12adsf1asdf3"))
    # d+.?d* d+.?d+


    # []匹配指定字符一个
    # print(re.findall('adb','a1111111b a3b a4b a9b aXb a b a b',re.DOTALL)) ['a3b', 'a4b', 'a9b']
    # print(re.findall('a[501234]b','a1111111b a3b a4b a9b aXb a b a b',re.DOTALL)) ['a3b', 'a4b']
    # print(re.findall('a[0-9a-zA-Z]b','a1111111b axb a3b a1b a b a b',re.DOTALL)) ['axb', 'a3b', 'a1b', ]
    # print(re.findall('a[^0-9a-zA-Z]b','a1111111b axb a3b a1b a0b a4b a9b aXb a b a b',re.DOTALL)) ['a b', 'a b'] ^表示非
    # print(re.findall('a[-0-9 ]b','a-b a0b a1b a8b aXb a b a b',re.DOTALL)) ['a-b', 'a0b', 'a1b', 'a8b', 'a b']

  • 相关阅读:
    Kubernetes 集成研发笔记
    Rust 1.44.0 发布
    Rust 1.43.0 发布
    PAT 甲级 1108 Finding Average (20分)
    PAT 甲级 1107 Social Clusters (30分)(并查集)
    PAT 甲级 1106 Lowest Price in Supply Chain (25分) (bfs)
    PAT 甲级 1105 Spiral Matrix (25分)(螺旋矩阵,简单模拟)
    PAT 甲级 1104 Sum of Number Segments (20分)(有坑,int *int 可能会溢出)
    java 多线程 26 : 线程池
    OpenCV_Python —— (4)形态学操作
  • 原文地址:https://www.cnblogs.com/Jicc-J/p/12616349.html
Copyright © 2011-2022 走看看