【Python日志功能】一.日志基础与基本配置
文章目录
- 相关链接
- 第一篇:日志基础与基本配置
- 1 日志的概念与用途
- 2 Python logging 模块介绍
- 3 日志级别
- 4 配置日志格式和输出位置
- 4.1 配置日志格式
- 4.2 配置输出位置
- 5 实验:基本日志配置和输出
- 实验1:基本日志配置
- 实验2:使用配置文件配置日志
- 6 文章总结
相关链接
- 【Python日志功能】一.日志基础与基本配置
- 官方文档:logging — Python 的日志记录工具 — Python 3.12.6 文档
- 个人博客:issey的博客 - 愿无岁月可回首
第一篇:日志基础与基本配置
在开发和维护应用程序的过程中,日志是一个非常重要的工具。它不仅可以帮助开发者了解程序的运行状态,还能帮助定位和解决问题。本文将详细介绍日志的概念、Python中 logging 模块的基本使用、日志级别以及如何配置日志格式和输出位置,并通过实际示例展示这些配置的效果。
1 日志的概念与用途
日志是一种用于记录程序运行过程中重要事件的工具。通过日志,开发者可以:
- 了解程序的运行状态和进程。
- 发现和定位程序中的错误和异常。
- 分析和优化程序性能。
- 记录系统或应用程序的使用情况和用户行为。
2 Python logging 模块介绍
Python 的 logging 模块是标准库的一部分,提供了灵活和强大的日志记录功能。它允许开发者将日志消息发送到多个目标,如控制台、文件、网络等。logging 模块支持不同的日志级别、格式化和处理器,使得日志记录更加方便和可控。
3 日志级别
日志级别用于指定日志消息的重要性。Python logging 模块定义了五个标准日志级别,每个级别都有对应的数值:
- DEBUG (10): 详细的信息, 通常只在诊断问题时使用。
- INFO (20): 确认程序按预期工作的信息。
- WARNING (30): 表示某些非严重问题,警告可能会出现问题。
- ERROR (40): 由于更严重的问题,程序已不能执行某些功能。
- CRITICAL (50): 严重错误,表明程序可能无法继续运行。
4 配置日志格式和输出位置
logging 模块允许开发者配置日志格式和输出位置。日志格式定义了日志消息的显示方式,而输出位置定义了日志消息的存储位置(如控制台、文件等)。
4.1 配置日志格式
日志格式可以通过 format 参数进行设置,例如:
format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s' # 定义日志消息的格式
4.2 配置输出位置
输出位置可以通过设置处理器(Handler)来配置。例如,可以将日志消息输出到控制台或文件:
import logging# 输出到控制台
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO) # 当日志级别等于或高于INFO时,会输出到控制台。 # 输出到文件
file_handler = logging.FileHandler('app.log')
file_handler.setLevel(logging.WARNING) # 当日志级别等于或高于WARNING时,会输出到文件。
5 实验:基本日志配置和输出
在这一部分,我们将通过实际的代码示例来演示如何配置日志并查看输出结果。
实验1:基本日志配置
创建一个简单的 Python 脚本 basic_logging.py:
import logging
import os# 获取当前脚本的目录
current_directory = os.path.dirname(os.path.abspath(__file__))# 日志文件的完整路径
log_file_path = os.path.join(current_directory, 'app_1.log')# 配置基本的日志设置
logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',handlers=[logging.StreamHandler(), logging.FileHandler(log_file_path)])logger = logging.getLogger(__name__)# 记录不同级别的日志
logger.debug('这是一个DEBUG级别的日志')
logger.info('这是一个INFO级别的日志')
logger.warning('这是一个WARNING级别的日志')
logger.error('这是一个ERROR级别的日志')
logger.critical('这是一个CRITICAL级别的日志')
运行脚本后,你将看到以下输出:
控制台输出:
2024-07-25 07:50:36,800 - __main__ - INFO - 这是一个INFO级别的日志
2024-07-25 07:50:36,800 - __main__ - WARNING - 这是一个WARNING级别的日志
2024-07-25 07:50:36,801 - __main__ - ERROR - 这是一个ERROR级别的日志
2024-07-25 07:50:36,801 - __main__ - CRITICAL - 这是一个CRITICAL级别的日志
文件 app_1.log 输出:
2024-07-25 07:50:36,800 - __main__ - INFO - 这是一个INFO级别的日志
2024-07-25 07:50:36,800 - __main__ - WARNING - 这是一个WARNING级别的日志
2024-07-25 07:50:36,801 - __main__ - ERROR - 这是一个ERROR级别的日志
2024-07-25 07:50:36,801 - __main__ - CRITICAL - 这是一个CRITICAL级别的日志
在这个实验中,DEBUG 级别的日志不会输出到控制台和文件,因为StreamHandler 和 FileHandler 的日志等级没有单独设置,它们会默认继承根记录器(root logger)的日志等级,即 logging.basicConfig 中设置的等级INFO。
实验2:使用配置文件配置日志
创建一个 YAML 配置文件 logging_config.yaml:
version: 1 # 配置文件的版本formatters: # 定义日志格式化器simple: # 名为simple的格式化器format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s' # 日志消息的格式,包括时间、记录器名称、日志级别和消息内容handlers: # 定义日志处理器console: # 名为console的处理器,输出到控制台class: logging.StreamHandler # 使用StreamHandler类level: DEBUG # 处理器的日志级别为DEBUGformatter: simple # 使用名为simple的格式化器stream: ext://sys.stdout # 输出到标准输出,即控制台file: # 名为file的处理器,输出到文件class: logging.FileHandler # 使用FileHandler类level: WARNING # 处理器的日志级别为WARNINGformatter: simple # 使用名为simple的格式化器filename: path/to/app_2.log # log文件绝对路径loggers: # 定义日志记录器__main__: # 针对主模块的记录器level: DEBUG # 记录器的日志级别为DEBUGhandlers: [console, file] # 使用console和file两个处理器propagate: no # 不向更高层次的记录器传递日志消息root: # 根记录器,适用于所有模块level: DEBUG # 记录器的日志级别为DEBUGhandlers: [console, file] # 使用console和file两个处理器
创建一个 Python 脚本 logging_with_config.py 来加载这个配置文件:
import logging.config
import yaml
import os# 获取当前脚本的目录
current_directory = os.path.dirname(os.path.abspath(__file__))# 日志文件的完整路径
cfg_file_path = os.path.join(current_directory, './logging_config.yaml')with open(cfg_file_path, 'r') as f:config = yaml.safe_load(f.read())logging.config.dictConfig(config)logger = logging.getLogger(__name__)# 记录不同级别的日志
logger.debug('这是一个DEBUG级别的日志')
logger.info('这是一个INFO级别的日志')
logger.warning('这是一个WARNING级别的日志')
logger.error('这是一个ERROR级别的日志')
logger.critical('这是一个CRITICAL级别的日志')
运行脚本后,你将看到以下输出:
控制台输出:
2024-07-25 08:04:02,433 - __main__ - DEBUG - 这是一个DEBUG级别的日志
2024-07-25 08:04:02,433 - __main__ - INFO - 这是一个INFO级别的日志
2024-07-25 08:04:02,433 - __main__ - WARNING - 这是一个WARNING级别的日志
2024-07-25 08:04:02,434 - __main__ - ERROR - 这是一个ERROR级别的日志
2024-07-25 08:04:02,434 - __main__ - CRITICAL - 这是一个CRITICAL级别的日志
文件 app_2.log 输出:
2024-07-25 08:04:02,433 - __main__ - WARNING - 这是一个WARNING级别的日志
2024-07-25 08:04:02,434 - __main__ - ERROR - 这是一个ERROR级别的日志
2024-07-25 08:04:02,434 - __main__ - CRITICAL - 这是一个CRITICAL级别的日志
console处理器的等级为INFO,而file处理器的等级为WARNING。所以控制台会输出所有信息,即等级等于或大于DEBUG的信息,但文件中只会记录等级等于或大于WARNING的记录。
6 文章总结
在本篇文章中,我们学习了Python logging 模块的基础内容,包括日志级别、基本配置以及如何将日志输出到控制台和文件。这为我们搭建了日志系统的基本框架,使我们能够了解程序的运行状态和关键事件。
接下来,我们将在第二篇文章中深入探讨更高级的配置内容,重点介绍日志处理器(Handlers)、日志格式器(Formatters)和日志过滤器(Filters)。我们将通过模拟实践,配置不同类型的处理器(如StreamHandler、FileHandler、RotatingFileHandler等),并自定义日志格式和过滤规则,从而更灵活地控制日志的输出目标、格式和内容。
通过这些高级配置,我们可以更好地满足不同应用场景下的日志需求,如限制日志文件大小、按时间轮转日志文件、以及只记录特定级别的日志信息。
相关文章:
【Python日志功能】一.日志基础与基本配置
文章目录 相关链接第一篇:日志基础与基本配置1 日志的概念与用途2 Python logging 模块介绍3 日志级别4 配置日志格式和输出位置4.1 配置日志格式4.2 配置输出位置 5 实验:基本日志配置和输出实验1:基本日志配置实验2:使用配置文件…...
深圳铨顺宏科技展邀您体验前沿人工智能技术
我们诚挚地邀请您参加即将举行的展会,探索RFID技术在资产与人员管理中的广泛应用。这些展会将为您提供一个深入了解前沿技术和创新解决方案的机会。 东莞台湾名品博览会(东莞台博会)展会时间:9月5日至8日。此次展会展示了来自台湾…...
Lombok:Java开发者的代码简化神器【后端 17】
Lombok:Java开发者的代码简化神器 在Java开发中,我们经常需要编写大量的样板代码,如getter、setter、equals、hashCode、toString等方法。这些代码虽然基础且必要,但往往占据了大量开发时间,且容易在属性变更时引发错误…...
[linux]GCC G++官方源码国内下载地址汇总
【GCC介绍】 GCC(GNU Compiler Collection,GNU编译器套件)是由GNU项目开发的一套编程语言编译器,也是GNU计划的关键部分。它最初作为GNU C Compiler(GNU C语言编译器)出现,但随着时间的推移&…...
部署opengauss5.0.3,细节满满
部署opengauss5.0.3 1.关闭安全服务 修改/etc/selinux/config文件中的“SELINUX”值为“disabled”。临时关闭selinux setenforce 0 查看selinux状态 getenforce2.host配置 [rootcentos79 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 local…...
面试题总结(四) -- STL与算法篇
面试题总结(四) – STL与算法篇 文章目录 面试题总结(四) -- STL与算法篇<1> 请列举 C STL 中常用的容器(如 vector、list、map 等)及其特点。<2> 如何在 C 中使用 STL 算法(如排序、查找等)?<3> 解…...
HashSet及其实现原理
目录 一、Set二、HashSet三、HashSet的实现原理四、HashSet的线程安全与顺序1、线程安全2、有序性 一、Set Set 接口是 java.util 包下的一个集合接口,它继承自 Collection 接口。Set 接口定义了一个不允许包含重复元素的集合。Set 接口的实现类主要有 HashSet、Lin…...
反序列化漏洞练习1
根据代码可以看出来sis类只是接收了参数cmd,下边是通过get获得cmd的值,所以可以在序列化过程中直接为cmd赋值。 根据源码编写序列化代码 <?php class sis{public $cmdsystem("whoami");?>;public function __wakeup(){eval($this-&g…...
树莓派Pico2(RP2350)开发环境搭建
树莓派Pico2(RP2350)开发环境搭建 文章目录 树莓派Pico2(RP2350)开发环境搭建1、RP2350介绍2、开发环境搭建3、工程编译4、固件下载Raspberry Pi再次通过推出RP2350 MCU突破了微控制器设计的界限。这款微控制器是之前RP2040的重大升级,带来了更强大的性能、高级安全功能,…...
vue 路由中使用keepAlive在这个组件中使用onActivated
onMounted: 在组件挂载时触发一次。onActivated: 当 keep-alive 组件从缓存中被激活时触发。如果你将当前组件包裹在 keep-alive 中,激活时会调用此钩子。onDeactivated: 当 keep-alive 组件被缓存时触发。 注意事项 onActivated 只在组件从 keep-alive 缓存中恢复…...
医学数据分析实训 项目一 医学数据采集
项目一 医学数据采集 一、实践目的 了解医学数据的特点;熟悉常见的医学公共数据库的使用方法;掌握获取医学数据的方法; 二、实践平台 操作系统:Windows10 及以上Python 版本:3.8.x 及以上PyCharm 或 Anoconda 集成…...
《Oracle(一)- 基础》
文章目录 一、Oracle简介(一)什么是ORACLE(二)ORACLE 体系结构1.数据库2.实例3.数据文件(dbf)4.表空间5.用户 二、ORACLE 安装与配置(一)VMware 挂载 windows server 2003࿰…...
Unity Resource System 优化笔记
Unity Resources System 定义 Resources System允许开发者在项目中的Resources文件夹下存放一个或多个资源文件夹,并且可以在Unity运行时通过Unity提供的API对资源和对象进行加载和卸载。 如果Resources中的文件结构复杂,内容多,会给应用常…...
Flutter之SystemChrome全局设置
一、简介 SystemChrome作为一个全局属性,很像 Android 的 Application,功能很强大。 二、使用详解 2.1 setPreferredOrientations 设置屏幕方向 在我们日常应用中可能会需要设置横竖屏或锁定单方向屏幕等不同要求,通过 setPreferredOrien…...
Windows11 WSL2的ubuntu 22.04中拉取镜像报错
问题描述 在windows11 WSL2的ubuntu 22.04中拉取镜像报错。错误为: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting header…...
【Linux】多线程:线程同步、条件变量
目录 一、同步的概念 为什么需要同步呢? 二、条件变量 条件变量的相关概念 1、条件变量的初始化:静态初始化、动态初始化 2、条件变量的等待:pthread_cond_wait函数 工作原理及流程【重要!】 关键点总结 3、条件变量的激…...
【Android Studio】使用雷电模拟器调试
文章目录 进入开发者模式使雷电模拟器adb连接PC测试 进入开发者模式 多次点击版本号 -开区USB调试 使雷电模拟器adb连接PC 写cmd脚本 雷电模拟器端口为5555 ,脚本内容如下: adb.exe connect 127.0.0.1:5555双击bat脚本文件 测试...
你必须知道的C语言问题(9)
问:如下代码,两个结构体类型成员变量相同,只是成员顺序不同,为什么大小不同? #include <stdio.h> #include <stdint.h> #include <string.h> #include <stdlib.h>typedef struct _test1{uint…...
如何通过网络找到自己想要的LabVIEW知识?
学习LabVIEW或其他编程技术时,无法依赖某一篇文章解决所有问题。重要的是通过多种途径获取灵感,并学会归纳总结,从而逐渐形成系统性的理解。这种持续学习和总结的过程是技术提升的基础。通过网络找到所需的LabVIEW知识可以通过以下几个步骤进…...
SCRM电商管理后台Axure高保真原型 源文件
在电商行业蓬勃发展的今天,企业急需一个全面的客户关系管理(CRM)系统来优化他们的电商运营。我们的Scrm电商管理后台应运而生,它不仅是一个集中化的管理平台,更是企业提升客户互动和销售业绩的得力助手。 预览地址 ht…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
