【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…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
