python内置模块——logging
内置模块-logging
loging模块是python提供的内置模块,用来做日志处理。
日志等级:
| 等级 | 释义 | 级别数值 |
|---|---|---|
| CRITICAL(fatal) | 致命错误,程序根本跑不起来 | 50 |
| ERROR | 运行错误,程序运行发生错误的地方时就会退出程序 | 40 |
| WARNING | 运行警告,程序运行发生警告的地方时会显示警告提示,但是程序会继续往下执行 | 30 |
| INFO | 运行提示,一般的系统信息,并非日志 | 20 |
| DEBUG | 调试信息,排查故障时使用的低级别系统信息 | 10 |
logging的执行是多线程的。
1. 基本函数
| 函数 | 说明 |
|---|---|
| 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对日志等级进行自我创作,因为会影响代码的移植性,代码在别人那里容易起冲突。
2. 基本使用
logging模块的默认输出级别是warning。
import logging
logging.debug('This is a debug log.')
logging.info('This is a info log.')
logging.warning('This is a warning log.')
logging.error('This is a error log.')
logging.critical('This is a critical log.')
# 默认的日志输出级别是warning,
# 所以以上代码运行时结果是:
# WARNING:root:This is a warning log.
# ERROR:root:This is a error log.
# CRITICAL:root:This is a critical log.
basicConfig常见参数:
- level:设置日志级别
- filename:设置日志输出文件名
- filemode:设置日志输出模式
- format:设置日志格式
- datefmt:设置时间格式("%Y-%m-%d %H:%M:%S")
level:设置输出级别:
import logging
logging.basicConfig(level=logging.DEBUG)
# 将日志的输出级别设置为debug
filename:设置日志文件
默认日志的输出是在终端,
可通过指定文件名的方式将日志记录到文件中,默认是追加模式。
import logging
logging.basicConfig(level=logging.DEBUG, filename='demo.log')
# 将日志输出结果记录到文件demo.log中。(不存在则创建)
filemode:设置写入模式
通过filemode参数设置写入方式
import logging
logging.basicConfig(level=logging.DEBUG, filename='demo.log', filemode='w')
format:设置日志格式
logging.basicConfig(
filename='demo.log',
level=logging.DEBUG,
format="%(asctime)s|%(levelname)s|%(message)s|%(filename)s:%(lineno)s",
)
datefmt:设置日期格式
logging.basicConfig(
filename='demo.log',
level=logging.DEBUG,
format="%(asctime)s|%(levelname)s|%(message)s|%(filename)s:%(lineno)s",
datefmt="%Y-%m-%d %H:%M:%S",
)
3. 高级应用
3.1 相关组件
| 名称 | 作用 | 比喻 |
|---|---|---|
| Loggers | 记录器,提供应用程序代码直接使用的接口 | 记录的笔 |
| Handlers | 处理器,将记录器产生的日志发送至目的地 | 记录的材质(纸张) |
| Filters | 过滤器,提供更好的粒度控制,决定哪些日志会被输出 | 哪些需要写,哪些不需要写 |
| Formatters | 格式化器,设置日志内容的组成结构和消息字段 | 书写的格式 |

3.2 loggers
日志对象。
相当于创建一支笔。
import logging
# 创建一个Logger,名称是cn.cccb.applog
logger = logging.getLogger('cn.cccb.applog')
# 设置为日志输出级别
logger.setLevel(logging.WARNING)
3.3 Handlers
Handler是用于将日志分发到不同的目的地。
可以是终端(默认)、文件、邮件、或者通过 socket、http等协议发送到任何地方。
相当于不同的输出媒介。
以下是常见的Handler:
- StreamHandler:标准输出stout分发器
import logging
sh = logging.StreamHandler(stream=None)
- FileHandler:将日志保存到磁盘文件的处理器
import logging
fh = logging.FileHandler(filename,mode='a',encoding=None,delay=False)
- BaseRotatingHandler
- RotatingFileHandler:滚动的多日志输出,按照时间or其他方式去生成多个日志
- TimedRotatingFileHandler
以下Handler使用得较少
- SocketHandler
- DataaramHandler
- SmtpHandler
- SyslogHandler
- NteventlogHandler
- HttpHandler
- WatchedFileHandler
- QuteleHandler
- NullHandler
每一个handler都有一个setFormatter()方法,
用于设置当前Handler对象使用Formatter,以指定日志的输出格式。
3.4 Formatters格式
Formatter对象用来设置日志信息的结构和内容。
其构造方法是:
import logging
# 创建formatter,并设置formatter的格式
formatter = logging.Formatter("%(asctime)s|%(levelname)8s|%(filename)10s%(lineno)s|%(message)s")
| 属性 | 格式 | 描述 |
|---|---|---|
| asctime | %(asctime)s | 日志产生的时间,默认格式为:2003-07-08 16:49:45,896 |
| msecs | %(msecs)d | 日志生成时间的亳秒部分 |
| created | %(created)f | time.time()生成的日志创建时间戳 |
| message | %(message)s | 具体的日志信息 |
| filename | %(filename)s | 生成日志的程序名 |
| name | %(name)s | 日志调用者 |
| funcname | %(funcname)s | 调用日志的函数名 |
| levelname | %(levelname)s | 日志级別(DEBUG,INFO, WARNING, ERROR,CRITICAL) |
| levene | %(leveling)s | 日志级别对应的数值 |
| lineno | %(lineno)d | 日志所针对的代码行号(如果可用的话) |
| module | %(module)s | 生成日志的模块名 |
| pathname | %(pathname)s | 生成日志的文件的完整路径 |
| process | %(process)d | 生成日志的进程ID(如果可用) |
| processname | %(processname)s | 进程名(如果可用) |
| thread | %(thread)d | 生成日志的线程ID(如果可用) |
| threadname | %(threadname)s | 线程名(如果可用) |
3.5 案例
# 创建一个Logger,名称是cn.cccb.applog
logger = logging.getLogger('cn.cccb.applog')
# 设置为日志输出级别
logger.setLevel(logging.DEBUG)
# 创建终端Handler,并设置输出级别
consoleHandler = logging.StreamHandler()
consoleHandler.setLevel(logging.DEBUG)
# 创建文件Handler,并设置输出级别
fileHandler = logging.FileHandler(filename='addDemo.log')
fileHandler.setLevel(logging.INFO)
# 创建formatter,并设置formatter的格式
formatter = logging.Formatter("%(asctime)s|%(levelname)8s|%(filename)10s%(lineno)s|%(message)s")
#里面的8,10实现了占位对齐
# 给每个处理器设置格式
consoleHandler.setFormatter(formatter)
fileHandler.setFormatter(formatter)
# 给logger设置handler
logger.addHandler(consoleHandler)
logger.addHandler(fileHandler)
#定义一个过滤器,过滤logger的名称,以cn.cccb开头的才会被处理。
# flt = logging.Filter("cn.cccb")
# 关联过滤器
# logger.addFilter(flt) # 可以是给logger设置过滤器
# fileHandler.addFilter(flt) # 可以是给handler设置过滤器
name = 'zibuyu'
age = 18
# 打印日志的代码
# logging.debug() #不能使用这个了!!!会使用WARNING的版本,不会用之前的记录器
logger.debug("姓名 %s, 年龄%d" % (name, age))
logger.debug("姓名 {}, 年龄{}".format(name, age))
logger.debug(f"姓名{name}, 年龄{age}")
上面的案例中,logger、handler和formatter都可以设置日志的输出级别,它们之间的关系是逐层过滤。
4. 通过配置文件
logging.conf:
# 配置记录器名称:提供应用程序代码直接使用的接口
# 注意:root必须存在!!!
[loggers]
keys=root,applog
# 配置处理器名称,将记录器产生的日志发送至目的地
[handlers]
keys=fileHandler,consoleHandler
# 配置格式化器,设置日志内容的组成结构和消息字段
[formatters]
keys=simpleFormatter
# 设置记录器root的级别与种类
# 节点名称必须是logger_+上面配置的记录器名称
[logger_root]
level=DEBUG
handlers=consoleHandler
# 设置记录器applog的级别与种类
[logger_applog]
level=DEBUG
handlers=fileHandler,consoleHandler
#起个对外的名字
qualname=applog
#继承关系
propagate=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
# 通过文件配置创建logger
logging.config.fileConfig('logging.conf')
# 使用字典进行配置
# logging.config.dictConfig({"loggers":"root,applog"})
rootLogger = logging.getLogger()
rootLogger.debug("This is root Logger, debug")
logger = logging.getLogger('applog')
logger.debug("This is applog, debug")
try:
a = 'qwe'
int(a) # 故意出错。
except Exception as e:
logger.exception(e)
注意:配置文件的默认编码是gbk。
在python 3.10 版本,fileConfig新增了 encoding 形参,可以指定配置文件的编码。
5. Django配置
使用django进行开发时,对于日志的配置,写入系统的配置文件中即可。
继而就可以在任何文件中直接调用。
import logging
logger = logging.getLogger('django')
配置信息:
# 日志
LOGGING = {
'version': 1, # 日志模块的版本,目前官方提供的版本是1,为避免以后因官方升级而出现的版本问题,所以这里固定为1
'disable_existing_loggers': False, # 是否禁用其他的已经存在的日志功能。实际开发中常常设置为False。
'formatters': { # 日志格式设置,verbose或者simple都是自定义的。
'verbose': { # 详细格式,开发人员不在场情况下的日志记录。
# 格式定义:https://docs.python.org/3/library/logging.html#logrecord-attributes
# levelname 日志等级
# asctime 发生时间
# module 文件名
# process 进程ID
# thread 线程ID
# message 异常信息
'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
'style': '{', # 设置变量格式分隔符
},
'simple': { # 简单格式,开发人员在场情况下的终端输出
'format': '{levelname} {message}',
'style': '{',
},
},
'filters': { # 过滤器,调用django内置的过滤器
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'handlers': {
'console': {
'level': 'DEBUG', # 设置日志等级
'filters': ['require_debug_true'], # 设置过滤器
'class': 'logging.StreamHandler', # 设置当前handler的核心类,StreamHandler:把日志信息输出到终端下
'formatter': 'simple' # 设置日志格式
},
'file': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
# 日志文件存放位置,日志保存目录logs必须手动创建
'filename': BASE_DIR.parent / "logs/demo.log",
# 单个日志文件的最大值,这里我们设置300M
'maxBytes': 300 * 1024 * 1024,
# 备份日志文件的数量,设置最大日志数量为10
'backupCount': 10,
# 日志格式:详细格式
'formatter': 'verbose'
},
},
'loggers': { # 日志处理的命名空间
'django': { # logger取名为django。
'handlers': ['console', 'file'], # 当基于django命名空间写入日志时,调用console与file日志处理流程。
'propagate': True, # 是否在django命名空间对应的日志处理流程结束以后,冒泡通知其他的日志功能。True表示允许
},
}
}
python内置模块——logging的更多相关文章
- Python内置模块-logging
一.初识logging模块 import logging logging.debug("debug message") #级别最低,只有在诊断问题时才有兴趣的详细信息. loggi ...
- Python 入门之 内置模块 --logging模块
Python 入门之 内置模块 --logging模块 1.logging -- 日志 (1)日志的作用: <1> 记录用户信息 <2> 记录个人流水 <3> 记录 ...
- Python学习笔记【第八篇】:Python内置模块
什么时模块 Python中的模块其实就是XXX.py 文件 模块分类 Python内置模块(标准库) 自定义模块 第三方模块 使用方法 import 模块名 form 模块名 import 方法名 说 ...
- python 内置模块续(二)
目录 python 内置模块补充 1.hashlib模块 简易使用: 高级使用: 进阶使用: 加盐处理: 校验文件一致性 2.logging日志模块 日志等级 常用处理 "四大天王" ...
- Python之logging模块
一.引言 之前在写一些小程序的时候想把日志内容打到文件中,所以就自己写了一个logger.py的程序,如下: #!/usr/bin/python # -*- coding=utf-8 -*- impo ...
- python内置模块(4)
这一部分是python内置模块系列的最后一部分,介绍了一些小巧有用的内置模块. 目录: 1.random 2.shelve 3.getpass 4.zipfile 5.tarfile 6.bisect ...
- python模块 ---logging模块
摘要by crazyhacking: 与log4cxx一样,分为三个部分,logger, handler,formatter. 详细内容参考:1官网http://docs.python.org/2/h ...
- python的logging模块
python提供了一个日志处理的模块,那就是logging 导入logging模块使用以下命令: import logging logging模块的用法: 1.简单的将日志打印到屏幕上 import ...
- python 多进程 logging:ConcurrentLogHandler
python 多进程 logging:ConcurrentLogHandler python的logging模块RotatingFileHandler仅仅是线程安全的,如果多进程多线程使用,推荐 Co ...
- python的logging模块之读取yaml配置文件。
python的logging模块是用来记录应用程序的日志的.关于logging模块的介绍,我这里不赘述,请参见其他资料.这里主要讲讲如何来读取yaml配置文件进行定制化的日志输出. python要读取 ...
随机推荐
- python下的jstack - pystack
背景 python 多进程任务,卡在某个地方没有继续执行也没有报出异常,进程被hang住 日志没有捕获到相关信息,需要知道进程阻塞在哪里,为什么阻塞 jvm提供了jstack.jmap类工具进行性能分 ...
- Unity UGUI的InputField(输入框)组件的介绍及使用
UGUI的InputField(输入框)组件的介绍及使用 1. 什么是UGUI的InputField组件? UGUI的InputField组件是Unity中的一个用户界面组件,用于接收用户的输入.它可 ...
- MySql Workbench 迁移工具 migration 提示缺少pyodbc 2.1.8 的解决方法
想把公司的数据库转到MySQL,所以想装个MySQL测试,发现新版的MySQL(8.0.34)默认安装还是有不少问题, 一.譬如表.字段大小写的问题: lower_case_table_names=0 ...
- 浅谈API安全的应用
理论基础 API它的全称是Application Programming Interface,也叫做应用程序接口,它定义了软件之间的数据交互方式.功能类型.随着互联网的普及和发展,API 从早期的 ...
- ArcMap中矢量数据修改标注Label的方法
本文介绍在ArcMap软件中,修改图层标签(Label)所显示字段与具体显示内容的方法. 在之前的文章中,我们看到了ArcMap中修改图层标签的重要性:可是,如何自定义图层的标签内容呢? ...
- 文心一言 VS 讯飞星火 VS chatgpt (94)-- 算法导论9.2 3题
三.用go语言,给出 RANDOMIZED-SELECT的一个基于循环的版本. 文心一言: 在循环中实现 RANDOMIZED-SELECT 的一个版本可以如下所示.这个版本使用 Go 语言编写,利用 ...
- 用Rust手把手编写一个Proxy(代理), UDP绑定篇
用Rust手把手编写一个Proxy(代理), UDP绑定篇 项目 ++wmproxy++ gite: https://gitee.com/tickbh/wmproxy github: https:// ...
- vi命令使用详解
vi命令使用详解 1. 三种工作模式 命令模式:通过命令对文件进行常规操作 打开文件时进入命令模式 (vi的入口) 通过命令对文件进行常规操作,如定位.翻页.复制.粘贴.删除等在图形界面下通过鼠标或快 ...
- 记一次 .NET某新能源MES系统 非托管泄露
一:背景 1. 讲故事 前些天有位朋友找到我,说他们的程序有内存泄露,跟着我的错题集也没找出是什么原因,刚好手头上有一个 7G+ 的 dump,让我帮忙看下是怎么回事,既然找到我了那就给他看看吧,不过 ...
- 谱图论:Laplacian二次型和Markov转移算子
以下部分是我学习CMU 15-751: TCS Toolkit的课堂笔记.由于只是个人笔记,因此许多地方在推导上可能不那么严谨,还望理论大佬多多包涵. 1 问题定义 1.1 无向图\(G\) 在本文中 ...