python logging 详解
python logging 详解
- 1. 导入logging模块
- 2. 配置日志记录器
- 3. 记录日志消息
- 4. 自定义日志记录器
- 5. 日志轮换
- 6. 日志过滤器
- 7. 日志异常跟踪
- 8. 日志输出到控制台和文件
- 9. 使用配置文件
- 10. 使用第三方库
- 11. format格式详解
- 12. 总结
Python的logging模块提供了灵活的日志记录功能,可以记录各种级别的日志消息,并可以将日志消息输出到文件、控制台、网络等不同的位置。
下面是Python logging模块的详细使用方法:
1. 导入logging模块
import logging
2. 配置日志记录器
可以通过BasicConfig()方法来配置日志记录器的基本属性,例如日志级别、输出格式、输出位置等。
logging.basicConfig(level=logging.DEBUG,format='%(asctime)s %(levelname)s %(message)s',filename='myapp.log',filemode='w')
其中:
- level:设置日志级别,可以设置为DEBUG、INFO、WARNING、ERROR、CRITICAL。
- format:设置日志输出格式,可以自己定义输出格式,例如’%(asctime)s %(levelname)s %(message)s’,表示输出时间、日志级别和消息内容。
- filename:设置日志输出文件名,如果不设置则默认输出到控制台。
- filemode:设置日志输出文件的打开模式,可以设置为’w’表示覆盖写,'a’表示追加写。
3. 记录日志消息
可以使用logging模块提供的不同方法来记录不同级别的日志消息,例如:
logging.debug('This is a debug message')
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical message')
4. 自定义日志记录器
可以通过Logger类来自定义日志记录器,例如:
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
handler = logging.FileHandler('myapp.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')
其中:
- getLogger():获取日志记录器,可以设置记录器名称。
- setLevel():设置日志级别。
- FileHandler():设置日志输出位置,可以设置输出文件名。
- Formatter():设置日志输出格式。
- addHandler():添加处理器。
5. 日志轮换
可以使用logging模块提供的RotatingFileHandler或TimedRotatingFileHandler类来实现日志轮换,例如:
handler = logging.handlers.RotatingFileHandler('myapp.logmaxBytes=1024*1024, backupCount=5)
handler.setFormatter(formatter)
logger.addHandler(handler)
其中:
- RotatingFileHandler():创建日志轮换处理器,可以设置最大文件大小和备份数量。
- maxBytes:设置日志文件最大大小,超过这个大小就会自动创建新的日志文件。
- backupCount:设置备份数量,超过这个数量就会删除最早的日志文件。
TimedRotatingFileHandler类可以按照时间轮换日志文件,例如:
handler = logging.handlers.TimedRotatingFileHandler('myapp.log', when='midnight', backupCount=5)
handler.setFormatter(formatter)
logger.addHandler(handler)
其中:
- TimedRotatingFileHandler():创建按时间轮换的日志处理器。
- when:设置轮换时间,可以设置为’midnight’、‘H’、'M’等不同的时间间隔。
6. 日志过滤器
可以通过Filter类来设置日志过滤器,只有符合条件的日志消息才会被记录,例如:
class MyFilter(logging.Filter):def filter(self, record):return 'important' in record.getMessage()handler = logging.FileHandler('myapp.log')
handler.addFilter(MyFilter())
handler.setFormatter(formatter)
logger.addHandler(handler)logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is an important warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')
其中:
- Filter():创建日志过滤器。
- filter():实现过滤器的逻辑,返回True表示记录该日志消息,返回False表示忽略该日志消息。
7. 日志异常跟踪
可以通过exc_info参数来记录异常信息,例如:
try:raise ValueError('This is an exception message')
except ValueError:logger.error('Exception occurred', exc_info=True)
其中:
- exc_info=True:记录异常信息,包括异常类型、异常消息和异常堆栈。
以上就是Python logging模块的详细使用方法,通过灵活配置和使用,可以实现各种不同场景下的日志记录和管理。
8. 日志输出到控制台和文件
在默认情况下,日志信息只会输出到文件中,如果需要同时输出到控制台,可以添加StreamHandler处理器,例如:
import syshandler = logging.StreamHandler(sys.stdout)
handler.setFormatter(formatter)
logger.addHandler(handler)
其中:
- StreamHandler():创建输出到控制台的处理器,可以设置输出流。
- sys.stdout:设置输出流为标准输出。
9. 使用配置文件
可以通过配置文件来设置日志记录器的属性,例如:
[loggers]
keys=root,sampleLogger[handlers]
keys=consoleHandler,fileHandler[formatters]
keys=simpleFormatter[logger_root]
level=DEBUG
handlers=consoleHandler,fileHandler[logger_sampleLogger]
level=DEBUG
handlers=fileHandler
qualname=sampleLogger
propagate=0[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=simpleFormatter
args=('myapp.log', 'w')[formatter_simpleFormatter]
format=%(asctime)s %(levelname)s %(message)s
datefmt=%Y-%m-%d %H:%M:%S
其中:
- loggers:设置日志记录器的名称。
- handlers:设置日志处理器的名称。
- formatters:设置日志格式化器的名称。
- logger_*:设置日志记录器的属性,例如日志级别、处理器、传递性等。
- handler_*:设置日志处理器的属性,例如处理器类型、日志级别、格式化器等。
- formatter_*:设置日志格式化器的属性,例如输出格式、时间格式等。
可以通过fileConfig()方法来加载配置文件,例如:
import logging.configlogging.config.fileConfig('logging.conf')logger = logging.getLogger('sampleLogger')logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')
10. 使用第三方库
除了Python自带的logging模块之外,还有一些第三方库可以实现更多的功能和扩展,例如:
- loguru:提供了更加灵活和方便的日志记录方式。
- structlog:提供了更加可定制化和扩展性的日志记录方式。
- coloredlogs:提供了彩色输出和更加易读的日志信息。
- logbook:提供了更加高效和线程安全的日志记录方式。
这些第三方库都有其自己的特点和优势,可以根据具体需求选择适合的库来实现日志记录和管理。
11. format格式详解
logging模块中的format参数用于设置日志的格式化输出方式,可以自定义输出的内容和格式。下面是format参数的详解:
- %(asctime)s:日志记录时间,格式为“年-月-日 时:分:秒,毫秒”。
- %(name)s:日志记录器的名称。
- %(levelname)s:日志级别名称。
- %(message)s:日志消息内容。
- %(pathname)s:当前执行代码的路径。
- %(filename)s:当前执行代码的文件名。
- %(funcName)s:当前执行函数的名称。
- %(lineno)d:当前执行代码的行号。
- %(thread)d:当前执行线程的ID。
- %(threadName)s:当前执行线程的名称。
- %(process)d:当前执行进程的ID。
- %(processName)s:当前执行进程的名称。
例如,设置日志格式为’%(asctime)s %(levelname)s %(message)s’,表示输出时间、日志级别和消息内容。
还可以通过添加格式控制符来进一步定制输出格式,例如:
- %(levelname)-8s:设置日志级别名称的宽度为8个字符,左对齐。
- %(message).50s:设置日志消息内容的最大宽度为50个字符,超过部分截断。
- %(asctime)s,%(msecs)03d:设置日志记录时间的毫秒部分为3位数字,例如“2021-09-23 10:23:45,123”。
- %(filename)s:%(lineno)d:设置当前执行代码的文件名和行号,例如“test.py:20”。
通过灵活使用格式控制符,可以实现各种不同的输出格式和显示效果,方便日志记录和查看。
12. 总结
Python的logging模块提供了灵活的日志记录功能,可以记录各种级别的日志消息,并可以将日志消息输出到文件、控制台、网络等不同的位置。通过灵活配置和使用,可以实现各种不同场景下的日志记录和管理。在实际应用中,需要根据具体需求选择合适的日志记录方式和工具,以方便运维和调试。
相关文章:
python logging 详解
python logging 详解1. 导入logging模块2. 配置日志记录器3. 记录日志消息4. 自定义日志记录器5. 日志轮换6. 日志过滤器7. 日志异常跟踪8. 日志输出到控制台和文件9. 使用配置文件10. 使用第三方库11. format格式详解12. 总结Python的logging模块提供了灵活的日志记录功能&…...

( “树” 之 DFS) 687. 最长同值路径 ——【Leetcode每日一题】
687. 最长同值路径 给定一个二叉树的 root ,返回 最长的路径的长度 ,这个路径中的 每个节点具有相同值 。 这条路径可以经过也可以不经过根节点。 两个节点之间的路径长度 由它们之间的边数表示。 示例 1: 输入:root [5,4,5,1,1,5] 输出&…...
Elasticsearch解决不能修改索引、字段问题解决方案
问题1: 由于es索引不能删除,不能修改,在不影响原数据的情况下,并且生产服务不停机的情况下,怎么修改索引,并保留原索引内的数据? 基于kibanna的dev Tools执行参数,淘汰postman&…...
面试官在线改简历 | 只有6秒!程序员简历这样写才能抓住科技公司大佬的眼球
其实每一份简历 每一个瑞库特 可能也就平均花6秒钟的时间看一看 来进行一个快速的筛选 一份好的简历到底应该长什么样 同时呢在我们写简历的过程当中 应该避免什么样子的错误和误区 那我们今天呢来聊聊这个简历的事 大家知道 每次到了招聘高分期啊这些大的公司 像谷歌Facebook…...

IM即时通讯-7-如何设计通知提醒
本文大纲 本文从为什么做通知提醒, 以及如何设计通知提醒, 以及如何衡量通知提醒三方面解释了如何设计通知提醒。 对于重点的如何设计通知提醒, 通过拆分前台和后台, 前台采用自建或者二方通道, 后台采用厂商信令通道…...

赛狐ERP | 亚马逊选品方法与策略详解:如何挑选最优质的产品?
亚马逊作为全球电商巨头,其产品种类之丰富也是无人能及。然而,在如此繁杂的商品体系下,如何选品成为了摆在商家面前的一道难题。本文将从亚马逊选品的目标、方法、策略三个方面进行详细介绍。 一、选品的目标 在进行选择之前,必…...

【GCU体验】基于PyTorch + GCU跑通ResNet50模型并测试GCU性能
一、环境 地址:启智社区:https://openi.pcl.ac.cn/ 二、计算卡介绍 云燧T20是基于邃思2.0芯片打造的面向数据中心的第二代人工智能训练加速卡,具有模型覆盖面广、性能强、软件生态开放等特点,可支持多种人工智能训练场景。同时具备灵活的可…...

【机器视觉------标定篇(二)】三点成圆算法(求相机旋转中心)
应用场景 机器视觉项目应用中,相机安装在机器人上,并且需要定位产品返回坐标偏差以及角度偏差。 与九点标定配合使用,实现精准角度补偿。 算法输入 不共线的三点坐标 A(X₁,Y₁) ,B(X₂,Y₂&…...
AUTOSAR E2E详细介绍
E2E概述 E2E(End-To-End)是AUTOSAR为功能安全ISO26262提出的一个安全模块。这里的端(End)并不是指ECU与ECU之间,而是指通信ECU上的SW-C与SW-C之间。 在车载网络中,信息交换通常是从一个ECU发送信号,另一个ECU接收信号。对E2E而言,通常是从源SW-C生成信号,经过RTE(R…...
Dream 主题使用手册 - 基础篇
Dream 主题基于 Halo 博客系统开发,本文将介绍本主题一些功能的使用,文档将持续更新。 一、安装 & 更新 1.1 安装包安装 & 更新 进入主题 Release 界面:https://github.com/nineya/halo-theme-dream/releases 下载主题压缩包 halo…...

WSL下的Kafka开发容器:Docker搭建、API、整合
背景介绍 Kafka是一个分布式流处理平台,可以处理大规模数据流并支持实时数据流的处理。 本文介绍了如何在WSL下使用Docker搭建Kafka容器,并使用Python的kafka-python库和FastAPI框架实现了一个简单的API。同时,还将该服务整合到一个整体的d…...
cv2(OpenCV)下载安装
cv2对应库是OpenCV,官网下载链接:https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv 最好下载对应python版本的,通过pip命令安装可能会出现版本过高或者过低的问题,导致import cv2没问题,但是内部函数无法调用。 …...

【剑指 offer】旋转数组的最小数字
✨个人主页:bit me👇 ✨当前专栏:算法训练营👇 旋 转 数 组 的 最 小 数 字核心考点:数组理解,二分查找,临界条件 描述: 有一个长度为 n 的非降序数组,比如[1,2,3,4,5]…...
GB 9706.1-2020 医用电气设备第1部分:基本安全和基本性能的通用要求-1
这是份什么文件 这是一份中华人民共和国国家标准,具体为GB9706.1—2020,标准适用于医用电气设备,并规定了医用电气设备基本安全和基本性能的通用要求。主要涵盖了医疗电器设备与患者接触的各种要求,包括电气安全、机械防护、防护辐…...

认识C++《共、枚、指1》
目录 前言: 1.共用体的基本知识 2.匿名共用体 3.枚举 3.1设置枚举值 3.2枚举的应用场景 3.3枚举变量的取值范围 4.地址和自由存储空间 5.指针的思想 6.指针的声明和初始化 前言: 指针内容比较多,还需要再出一篇。久等了!!我看了我的…...
vim 一键配置
PS:本文是为了以后为了方便,做备忘的,今天用的时候找了半天很麻烦。 vim编辑器一键配置 在非root用户下执行上面的语句即可,不要在root用户下直接安装! 安装的时候需要输入root用户的密码,请找您的服主要一…...
如何成为一名成功的 PHP 开发者
当今的网络应用开发市场,PHP 一直是其中最受欢迎的语言之一,许多优秀的网络应用程序都是由 PHP 开发人员设计和开发的。如果你想成为一名成功的 PHP 开发者,以下是几个关键步骤: 1. 学习基础知识 首先,你需要掌握 PH…...

UHD安装教程
UHD Universal Hardware Driver,即USRP驱动。 UHD,Windows平台安装教程 uhd驱动安装 http://files.ettus.com/binaries/misc/erllc_uhd_winusb_driver.zip 安装LibUSBx http://files.ettus.com/binaries/uhd/latest_release 下载默认C盘 环境配置 将…...

Unity和UE有啥区别?哪个更适合游戏开发
游戏制作软件中最著名的两个游戏引擎是 Unity 和 Unreal Engine。从独立游戏到大型工作室,许多游戏开发商都在使用它们。如果你打算从事游戏行业工作,你肯定曾经问过自己“我的游戏应该使用 Unity 还是 Unreal Engine?” ” 让我们来了解和比…...

红队内网靶场
文章目录开篇介绍靶场介绍靶场下载以及配置Tomcat Get Shell突破DMZ防火墙拿下域内成员机器将内网机器上线到CS使用Adfind侦察子域信息控制子域DCRadmin登录子域进行权限维持(白银票据/ACL)子域bloodhound获取父域信息分析子域Krbtgt密钥创建跨域金票Dcsync父域PTH父域DC准备打…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...