python 之logging 模块
1. python的垃圾回收(gc)2.python3 的八大数据类型3.Python 七类常见运算符4.python流程控制5.字符编码与字节流二进制补码形式6.python 之with open7.python 函数之传参8.python 函数之作用域、闭包9. python 装饰器10.递归、二分查找、冒泡排序11.三元表达式、列表、字典生成式、匿名函数12.迭代器和生成器、异常捕获13.python 常用的内置函数14.python模块的导入15.python 之 re (regexp expression)16.python 之时间模块17.python 随机模块random18.python json序列化模块19.hashlib 模块
20.python 之logging 模块
21.Python 深拷贝和浅拷贝详解22.面向对象编程之类和对象的定义23.面向对象编程之绑定方法、掩藏属性、装饰器24.面向对象之对象的三大特性25.python 魔术方法26.python 之反射27.Mixins机制和元类28.python 之http、tcp/ip29.基于tcp协议的socket编程30.python 并发编程之进程31.python 并发编程之线程32.GIL锁,互斥锁33.python并发编程之协程34.进程池和线程池35.MacOS13 m1 安装 mysql8.0.3236.mysql8 增删改查、约束条件37.mysql8 查询关键字、多表关系38.多表联合查询、脚本使用pymysql39.mysql8 索引、视图、事务、存储过程、触发器40.前端三剑客之HTML41.前端三剑客之CSS( position位置固定)42.前端三剑客之JavaScript 43.html 之 jQuery库、阻止二次提交44.html 之 Bootstrap45.python 安装pip3、虚拟环境、pip3下载离线包46.开发设计模式之单例模式47.celery 任务队列、双写一致性、异步秒杀48.py操作七牛云存储、minio、fastdfs49.支付宝支付50.路飞学城上线51.python之任务调度(APScheduler和schedule)52.命令行帮助信息、手动和交互执行53.python之csv、openpyxl/pandas54.python 并发整理一、日志的简单使用
1、什么是日志记录你的代码在执行过程中的一些变化 (记录的是一些有意义的变化)
2、日志的5个等级
1 2 3 4 5 6 7 8 9 10 11 | import logging logging.debug( 'debug message' ) # 10 logging.info( 'info message' ) # 20 logging.warning( 'warning message' ) # 30 logging.error( 'error message' ) # 40 logging.critical( 'critical message' ) # 50 |
3、日志的基本使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import logging # FileHandler 写入文件 file_handler = logging.FileHandler(filename = 'x1.log' , mode = 'a' , encoding = 'utf-8' , ) logging.basicConfig( format = '%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s' , datefmt = '%Y-%m-%d %H:%M:%S %p' , handlers = [file_handler, ], level = logging.ERROR ) # 调用日志级别为error logging.error( '你好' ) # 输出 # 2023-06-13 17:02:47 PM - root - ERROR -lianxi: 你好 |
4、配置参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | format 参数中可能用到的格式化串: % (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 用户输出的消息 |
二、日志的详细使用
1、日志的组成部分
- logger对象
- filter对象
- handler对象
- format对象
2、示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | import logging # 1.logger对象:负责产生日志 logger = logging.getLogger() # 获取logger对象 # 2.filter对象:负责过滤日志(直接忽略) # 3.handler对象:负责日志产生的位置 hd1 = logging.FileHandler( 'a1.log' , encoding = 'utf8' ) # 产生到文件的 hd2 = logging.FileHandler( 'a2.log' , encoding = 'utf8' ) # 产生到文件的 hd3 = logging.StreamHandler() # 产生在终端的 # 4.formatter对象:负责日志的格式 # 2023-06-13 11:49:53 - root - DEBUG -05 日志的详细使用: 写了半天 好累啊 好热啊 fm1 = logging.Formatter( fmt = '%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s' , datefmt = '%Y-%m-%d %H:%M:%S' , ) # 2023-06-13 - root 写了半天 好累啊 好热啊 fm2 = logging.Formatter( fmt = '%(asctime)s - %(name)s %(message)s' , datefmt = '%Y-%m-%d' , ) # 5.绑定handler对象 logger.addHandler(hd1) logger.addHandler(hd2) logger.addHandler(hd3) # 6.绑定formatter对象 hd1.setFormatter(fm1) hd2.setFormatter(fm2) hd3.setFormatter(fm1) # 7.设置日志等级 logger.setLevel( 10 ) # debug level # 8.记录日志 logger.debug( '写了半天 好累啊 好热啊' ) |
三、日志配置成字典的格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | import logging import logging.config standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \ '[%(levelname)s][%(message)s]' # 其中name为getlogger指定的名字 simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s' test_format = '%(asctime)s] %(message)s' logfile_path = 'a3.log' # log配置字典 LOGGING_DIC = { 'version' : 1 , 'disable_existing_loggers' : False , 'formatters' : { 'standard' : { 'format' : standard_format }, 'simple' : { 'format' : simple_format }, 'test' : { 'format' : test_format }, }, 'filters' : {}, # 过滤日志 '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乱码了 }, 'other' : { 'level' : 'DEBUG' , 'class' : 'logging.FileHandler' , # 保存到文件 'formatter' : 'test' , 'filename' : 'a2.log' , 'encoding' : 'utf-8' , }, }, 'loggers' : { # logging.getLogger(__name__)拿到的logger配置 空字符串作为键 能够兼容所有的日志 '': { 'handlers' : [ 'default' , 'console' ], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕 'level' : 'DEBUG' , 'propagate' : True , # 向上(更高level的logger)传递 }, # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置 'other' : { 'handlers' : [ 'other' , ], 'level' : 'DEBUG' , 'propagate' : False , }, }, } # 使用配置字典 logging.config.dictConfig(LOGGING_DIC) # 自动加载字典中的配置 logger1 = logging.getLogger( 'xxx' ) logger1.debug( '不忘初心,方得始终!' ) |
四、日志终极版
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | 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 = 30 , ) # 二:输出日志 logging.debug( '调试debug' ) logging.info( '消息info' ) logging.warning( '警告warn' ) logging.error( '错误error' ) logging.critical( '严重critical' ) ''' # 注意下面的root是默认的日志名字 WARNING:root:警告warn ERROR:root:错误error CRITICAL:root:严重critical ''' |