Python日志模块Logging
正文
- logging的日志等级(了解)
- logging的使用方法(了解)
- logging的高级应用(重点)
- 大型工程配置文件
logging日志等级
日志等级(level) | 描述 |
---|---|
DEBUG | 最详细的日志信息,典型应用场景是 问题诊断 |
INFO | 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作 |
WARNING | 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的 |
ERROR | 由于一个更严重的问题导致某些功能不能正常运行时记录的信息 |
CRITICAL | 当发生严重错误,导致应用程序不能继续运行时记录的信息 |
例子如下
1 2 3 4 5 6 7 | import logging logging.debug( "This is debug log" ) logging.info( "This is info log" )<br> # 默认的日志输出级别为warning,也就是只会输出下面3种 logging.warning( "This is warning log" ) logging.error( "This is error log" ) logging.critical( "This is critical log" ) |
输出结果
WARNING:root:This is warning log ERROR:root:This is error log CRITICAL:root:This is critical log
logging的使用方法
常用函数
函数 | 说明 |
---|---|
logging.debug(msg, *args, **kwargs) | 创建一条严重级别为DEBUG的日志记录 |
logging.info(msg, *args, **kwargs) | 创建一条严重级别为INFO的日志记录 |
logging.warning(msg, *args, **kwargs) | 创建一条严重级别为WARNING的日志记录 |
logging.error(msg, *args, **kwargs) | 创建一条严重级别为ERROR的日志记录 |
logging.critical(msg, *args, **kwargs) | 创建一条严重级别为CRITICAL的日志记录 |
logging.log(level, *args, **kwargs) | 创建一条严重级别为level的日志记录 |
logging.basicConfig(**kwargs) | 对root logger进行一次性配置 |
注意:不推荐使用basicConfig对日志等级进行自我创作,因为会影响代码的移植性,代码在别人那里容易起冲突
使用方法
日志输出方法
logging.basicConfig(level=logging.DEBUG) # 将日志的输出级别调节为debug logging.basicConfig(filename='demo.log',level=logging.DEBUG) # 将日志的输出到demo.log文件中 logging.basicConfig(filename='demo.log',filemote='w',level=logging.DEBUG) # 先清空再写入,也可以设置为继续写
常用的输出(字符串格式化输出)
logging.debug("姓名 %s, 年龄%d",name,age) logging.debug("姓名 %s, 年龄%d",% (name,age)) logging.debug("姓名 {}, 年龄{}".format(name,age)) logging.debug(f"姓名{name}, 年龄{age}")
添加公共信息
logging.basicConfig(format="%(asctime)s|%(levelname)s|%(filename)s:%(lineno)s|%(message)s",
datefmt='%Y-%m-%d %H:%M:%S',level=logging.DEBUG) name = "张三" age = 18 logging.debug("姓名 %s,年龄 %d",name,age) logging.warning("姓名 %s,年龄 %d",name,age)
# 输出结果
2023-06-17 19:52:07|DEBUG|practice.py:308|姓名 张三,年龄 18
2023-06-17 19:52:07|WARNING|practice.py:309|姓名 张三,年龄 18
logging的高级应用
logging模块采用了模块化设计,主要包含四种组件:
- Loggers:记录器,提供应用程序代码能直接使用的接口
- Handlers:处理器,将记录器产生的日志发送至目的地
- Filter:过滤器,提供更好的粒度控制,决定哪些日志会被输出
- Formatters:格式化器,设置日志内容的组成结构和消息字段
日志工作流程
Loggers记录器
1,提供应用程序的调用接口,logger是单例的
logger = logging.getLogger(__name__)
2,决定日志记录的级别
loggers.setLevel()
3,将日志内容传递到相关联的handlers中
logger.addHandler()
logger.removeHandler()
Handlers处理器
它们将日志分发到不同的目的地。可以是文件、标准输出、邮件、或者通过socke、http等协议发送到任何地方
StreamHandler
标准输出stdout(如显示器)分发器。创建方法:sh=logging.StreamHandler(stream=None)
FileHandler
将日志保存到磁盘文件的处理器。创建方法:fh=logging.FileHandler(filename,mode='a', encoding=None, delay=False)
setFormatter():设置当前handler对象使用消息格式
Rotating Filehandler
滚动的多日志输出,按照时间or其他方式去生成多个日志
Formatters格式
Formatters对象用来最终设置日志信息的顺序、结构和内容。
其构造方法为:
ft = logging.Formatter.__init__(fmt=None, datefmt=None, style=’%'
datefmt默认是%Y-%m-%d %H:%M:%S 样式的,style参数默认为百分符%,这表示%(<dictionary key>)s 格式的字符串
属性 | 格式 | 描述 |
---|---|---|
asctime | %(asctime)s | 日志产生的时间,默认格式为msecs2003-07-0816:49:45,896 |
msecs | %(msecs)d | 日志生成时间的亳秒部分 |
created | %(created)f | time.tme)生成的日志创建时间戳 |
message | %(message)s | 具体的日志信息 |
filename | %(filename)s | 生成日志的程序名 |
name | %(name)s | 日志调用者 |
funcname | %( funcname)s | 调用日志的函数名 |
levelname | %(levelname)s | 日志级別( DEBUG,INFO, WARNING, 'ERRORCRITICAL) |
levene | %( leveling)s | 日志级别对应的数值 |
lineno | %(lineno)d | 日志所针对的代码行号(如果可用的话) |
module | %( module)s | 生成日志的模块名 |
pathname | %( pathname)s | 生成日志的文件的完整路径 |
process | %( (process)d | 生成日志的进程D(如果可用) |
processname | (processname)s | 进程名(如果可用) |
thread | %(thread)d | 生成日志的线程D(如果可用) |
threadname | %( threadname)s | 线程名(如果可用) |
举例:
#记录器 logger = logging.getLogger('cn.cccb.applog') # 将默认的root替换成applog logger.setLevel(logging.DEBUG) # 必须设置为两个handler中级别更低的 #处理器handler consoleHandler = logging.StreamHandler() consoleHandler.setLevel(logging.DEBUG) #没有给handler指定日志级别,将使用记录器logger的级别 fileHandler = logging.FileHandler(filename='addDemo.log') consoleHandler.setLevel(logging.INFO) #formatter格式 formatter = logging.Formatter("%(asctime)s|%(levelname)8s|%(filename)10s%lineno)s|%(message)s") #里面的8,10实现了占位对齐 #给处理器设置格式,即文件和控制台输出内容格式一致 consoleHandler.setFormatter(formatter) fileHandler.setFormatter(formatter) #记录器要设置处理器 logger.addHandler(consoleHandler) logger.addHandler(fileHandler) #定义一个过滤器,将显示cn.cccb的日志 # flt = logging.Filter("cn.cccb") #关联过滤器 # logger.addFilter(flt) fileHandler.addFilter(flt) #打印日志的代码 #logging.debug()#不能使用这个了!!!会使用WARNING的版本,不会用之前的记录器 logger.debug("姓名 %s, 年龄%d",name,age) logger.debug("姓名 %s, 年龄%d",% (name,age)) logger.debug("姓名 {}, 年龄{}"。format(name,age)) logger.debug(f"姓名{name}, 年龄{age}")
大型工程的配置文件
使用字典可以进行过渡,不过需要找时间再去了解吧
#./logging.conf #记录器:提供应用程序代码直接使用的接口 #设置记录器名称,root必须存在!!! [loggers] keys=root,applog #处理器,将记录器产生的日志发送至目的地 #设置处理器类型 [handlers] keys=fileHandler,consoleHandler #格式化器,设置日志内容的组成结构和消息字段 #设置格式化器的种类 [formatters] keys=simpleFormatter #设置记录器root的级别与种类 [logger_root] level=DEBUG handlers=consoleHandler #设置记录器applog的级别与种类 [logger_applog] level=DEBUG handlers=fileHandler,consoleHandler #起个对外的名字 qualname=applog #继承关系 propagate=0 # 0表示不继承 #设置 [handler_consoleHandler] class=StreamHandler args=(sys.stdout,) level=DEBUG formatter=simpleFormatter [handler_fileHandler] class=handlers.TimedRotatingFileHandler #在午夜1点(3600s)开启下一个log文件,第四个参数0表示保留历史文件 args=('applog.log','midnight',3600,0) level=DEBUG formatter=simpleFormatter [formatter_simpleFormatter] format=%(asctime)s|%(levelname)8s|%(filename)s[:%(lineno)d]|%(message)s #设置时间输出格式 datefmt=%Y-%m-%d %H:%M:%S
引用配置文件
import logging import logging.config logging.config.fileConfig('logging.conf') #使用字典就能从任意格式文件进行配置,字典是一种接口格式 # logging.config.dictConfig({"loggers":"root,applog"}) rootLogger = logging.getLogger('applog') rootLogger.debug("This is root Logger, debug") logger = logging.getLogger('cn.cccb.applog') logger.debug("This is applog, debug")
# 例子 try: int(a) except Exception as e:
# logger.error(e) logger.exception(e) # 显示在日志里面
日志的使用方式
1,编程式使用日志
2,logging格式的配置文件
3,字典方式的配置
# get_logging.py
import logging import logging.config def getLogging(confName = "applog"): logging.config.fileConfig("logging.conf") return logging.getLogger(confName)
# 引用 from get_logging import getLogging logger = getLogging()
参考学习:https://www.cnblogs.com/kangsf2017/p/14700833.html#logging%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」