在项目中添加日志功能-Python logging模块新手入门

news2025/1/13 6:29:02

Python Logging 日志模块新手入门

       这也是规划里的一篇工具文章,在写项目代码的时候不但要考虑代码的架构代码的后期维护和调试等也是一个比较关键的问题,之前写代码的时候日志这块的代码直接是任务驱动简单搜了一下就用了,但是秉持着打好基础的精神在这里也是总结一篇基础向的文档。在一个项目中在写代码时,除了要将训练代码运行起来运行稳定,也需要通过日志来记录,程序运行期间发生的事件,以便于了解系统活动和诊断。然后我也是参考总结了Python官方的文档和RealPython进行总结然后加上自己的理解得到的。

文章目录

  • Python Logging 日志模块新手入门
  • 1.简单了解Logging模块
  • 2.Logging模块的基础配置
  • 3.设计Logging的输出格式
  • 4.给日志信息添加一个动态变量
  • 5.让提交的日志信息同时记录在文件中且输出在控制台上并分别自定义输出格式-handler操作使用
  • 结束

1.简单了解Logging模块


       Logging库是python的一个自带库,也就是不需要安装就能直接使用的库,因此可以直接在程序的开头直接导入logging库即可使用无需安装。

import logging

       导入了logging之后你可以使用一个叫logger的东西去提交你想用的日志信息,在使用logger之前需要知道在logger提交默认情况下有五种表示不同严重程度的日志信息,官方文档中级别解释的表格如下。
在这里插入图片描述
       下面是我结合自己的理解手动翻译的,如果有问题欢迎交流讨论。

严重等级Level何时使用
DEBUG一些细节信息,只有当诊断一些运行问题的时候有用
INFO证实一些流程已经按照预期进行了
WARING表明了一些意外的发生,或者表明将要发生的一些问题,但这些问题不会让软件停止运行
ERROR由于一些严重的问题软件已经不能使用某些功能
CRITICAL一个很严重的问题,这个问题让系统或者代码直接停止运行了。

接下来使用logger来提交五种信息。

import 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')

运行结果如下。
在这里插入图片描述

WARNING:root:This is a warning message
ERROR:root:This is an error message
CRITICAL:root:This is a critical message

       首先默认状态下日志的输出格式为严重等级:用户名:信息,这个后期可以自己设置,然后能注意到.dubug().info()两种方法的输出没有显示在控制台上,因为logging模块有一个参数表示进行相应的最低的严重程度当当前严重程度等于超过logging中设置的最低严重程度时候,才会响应这个日志提交并在控制台中打印出来,在不进行配置的情况下logging模块的最低的严重程为Wraning

2.Logging模块的基础配置


我们可以通过basicConfig()方法来配置logging,下面是一些常用的参数:

  • level:设置日报配置模块响应的最低严重等级
  • filename:记录日志信息的文件名称
  • filemode:用于配置filename的记录方式默认是a也就是不断追加的模式(配置该参数需要先配置filename参数)。
  • format:提交的日志信息的格式。

首先给出第一个参数level运行的例子程序

import logging

logging.basicConfig(level=logging.DEBUG)
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')

对比发现之前不相应的INFODEBUG这俩给略低的严重程度已经被响应了。
在这里插入图片描述
接下来后学习后三个参数的例子代码如下:

import logging

logging.basicConfig(filename='app.log', filemode='w', format='%(name)s - %(levelname)s - %(message)s')
logging.warning('This will get logged to a file')

运行之前项目文件夹的情况如下:
在这里插入图片描述
运行之后,控制台没有输出,但是项目列表下生成了一个app.log文件。
在这里插入图片描述
打开日志文件,日志信息已经保存到了里面。
在这里插入图片描述

3.设计Logging的输出格式


       由于实际的业务场景中可能需要对logging的format格式做更详细的以及进一步的调整,因此再来了解一下format格式的其他属性,在format格式中自定义变量的方法,这里举几个简单的例子。


  • 例子一:
import logging

logging.basicConfig(format='%(process)d-%(levelname)s-%(message)s')
logging.warning('This is a Warning')

运行结果如下,其中%(process)d表示的是进程号31156,%(levelname)s表示消息的严重程度等级,%(message)s表示警告信息:

31156-WARNING-This is a Warning
  • 例子二:
import logging

logging.basicConfig(format='%(asctime)s - %(message)s', level=logging.INFO)
logging.info('Admin logged in')

结果如下%(asctime)s为响应时间,%(message)s为提示信息。

2024-04-26 10:10:33,052 - Admin logged in
  • 例子三:

还可以通过datefmt调整响应%(asctime)s的格式

import logging

logging.basicConfig(format='%(asctime)s - %(message)s', datefmt='%d-%b-%y %H:%M:%S')
logging.warning('Admin logged out')

输出结果,中间的变为了英文月份。

26-Apr-24 10:20:07 - Admin logged out

       这里的关键在每一个属性的格式都是用%(属性)字母,例如%(asctime)s有基础的同学或者工程师朋友,应该也可以知道括号后面的字母是数据的格式,例如asctime为字符串格式所以后面使用的字母为s,process进程号为整数所以后面跟的是d。那这里怎么知道每个属性是什么类型和实际的含义,官方给了一张所有属性的表,可以查,官方表的链接如下,用到的时候去插一下就可以了。

https://docs.python.org/3/library/logging.html#logrecord-attributes
在这里插入图片描述

4.给日志信息添加一个动态变量


除了这些已经有的属性之外,我还想让日志监测一个动态变量,官方方式如下。

import logging

name = 'John'

logging.error('%s raised an error', name)
ERROR:root:John raised an error

或者在字符串前面加f来格式化字符串,我比较喜欢这种,这种格式需要在python3.6之后的版本才可以使用。

import logging

name = 'John'

logging.error(f'{name} raised an error')

5.让提交的日志信息同时记录在文件中且输出在控制台上并分别自定义输出格式-handler操作使用


       在logging模块中需要用到一个概念handler操作器,通过这个东西,你可以通过配置不同的日志记录器,并根据你配置的操作器的格式通过不同方式发送你的日志信息。

       以下代码实现了配置两种操作器,一种是控制台输出的操作器,一种是输出在自定义的日志文件中,然后两个操作器设置的最低响应级别和输出格式都实现了自己的单独的配置。

import logging

logger = logging.getLogger(__name__)

c_handler = logging.StreamHandler()    #控制台输出操作器  
f_handler = logging.FileHandler('file.log', mode='a', encoding='utf-8')  #文件记录操作器
c_handler.setLevel(logging.WARNING) #设置控制台操作器最低响应等级
f_handler.setLevel(logging.ERROR)   #设置文件记录操作器最低响应等级

c_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s')     #设置控制台输出操作器日志格式
f_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')  #文件记录器操作器日志格式
c_handler.setFormatter(c_format)   #加载控制台输出操作器输出的日志格式
f_handler.setFormatter(f_format)   #加载文件记录操作器日志格式

logger.addHandler(c_handler)       #加载控制台输出操作器 
logger.addHandler(f_handler)       #加载文件记录操作器 

logger.warning('This is a warning')
logger.error('This is an error')

运行前:
在这里插入图片描述
运行后,第一次运行左侧多了一个日志文件:
在这里插入图片描述
日志文件的内容如下:
在这里插入图片描述

结束

  • 日志记录器可以跨文件使用,在一个文件中初始化了日志记录器的配置logger,将logger传给其他程序也可以使用,将不通文件中的提交的日志信息记录在一个日志文件中

下面是两个参考内容。

官方文档地址:https://docs.python.org/3/library/logging.html
在这里插入图片描述
realpython教程地址:https://realpython.com/python-logging/
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1635475.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

十八、Java解析XML文件

1、XML文档语法和DTD约束 1)XML定义 XML即可扩展的标记语言,可以定义语义标记(标签),是元标记语言。XML不像超文本标记语言HTML,HTML只能使用规定的标记,对于XML,用户可以定义自己需要的标记。 XML(Extensible Markup Language)和HTML(Hyper Text Markup Language)师出同…

智能体可靠性的革命性提升,揭秘知识工程领域的参考架构新篇章

引言:知识工程的演变与重要性 知识工程(Knowledge Engineering,KE)是一个涉及激发、捕获、概念化和形式化知识以用于信息系统的过程。自计算机科学和人工智能(AI)历史以来,知识工程的工作流程因…

救护员证学习笔记

第一节 红十字运动基础知识 红十字运动的优势 197个主权国家、191个红十字会 四次获得诺贝尔和平奖 红十字运动的组成 红十字运动七项准则 红十字运动的标志 新中国红十字运动宗旨 保护人的生命与健康 维护人的尊严 发扬人道主义精神 促进和平事业进步 红十字会的主要工作 …

VGG16简单部署(使用自己的数据集)

一.注意事项 1.本文主要是引用大佬的文章(侵权请联系,马上删除),做的工作为简单补充 二.介绍 ①简介:VGG16是一种卷积神经网络模型,由牛津大学视觉几何组(Visual Geometry Group)开…

【错题集-编程题】组队竞赛(排序 + 贪心)

牛客对应题目链接:组队竞赛_牛客笔试题_牛客网 (nowcoder.com) 一、分析题目 运用 贪心 思想: 先将数组排好序。总和最大 -> 每个小组的分数尽可能大。最大的数拿不到,只能退而求其次拿到倒数第⼆个⼈的分数,再补上一个小的数…

shell脚本-监控系统内存和磁盘容量

监控内存和磁盘容量除了可以使用zabbix监控工具来监控,还可以通过编写Shell脚本来监控。 #! /bin/bash #此脚本用于监控内存和磁盘容量,内存小于500MB且磁盘容量小于1000MB时报警#提取根分区剩余空间 disk_size$(df / | awk /\//{print $4})#提取内存剩…

西圣发布全新磁吸无线充电宝:打破传统,让充电更加高效、便捷

手机作为日常生活中最不能离开的数码单品之一,出门在外,电量情况总是让人担忧,一款靠谱的移动电源简直就是救星!近日,西圣品牌推出了一款集高效、安全、便携于一体的无线充电宝——西圣PB无线磁吸充电宝,以…

Maven解决找不到依赖项

报错如图 方案一&#xff1a;Maven的Setting文件中添加albaba的镜像文件 1.下载maven &#xff1a;Maven – Download Apache Maven 2. 配置镜像 更改成这个&#xff1a; <mirror> <id>alimaven</id> <name>aliyun maven</name> <url&g…

webpack 常用插件

clean-webpack-plugin 这个插件的主要作用是清除构建目录中的旧文件&#xff0c;以确保每次构建时都能得到一个干净的环境。 var { CleanWebpackPlugin } require("clean-webpack-plugin") const path require("path");module.exports {mode: "de…

第十五届蓝桥杯省赛第二场C/C++B组H题【质数变革】题解

解题思路 首先&#xff0c;我们考虑一下整个数组都是由质数构成的情况。 当我们要将质数 x x x 向后移 k k k 个时&#xff0c;如果我们可以知道质数 x x x 在质数数组的下标 j j j&#xff0c;那么就可以通过 p r i m e s [ j k ] primes[j k] primes[jk] 来获取向后…

牛客NC279 二叉树的下一个结点【中等 二叉树中序遍历 C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/9023a0c988684a53960365b889ceaf5e 思路 思路&#xff1a;我们首先要根据给定输入中的结点指针向父级进行迭代&#xff0c; 直到找到该树的根节点&#xff1b;然后根据根节点进行中序遍历&#xff0c;当遍历到和…

Java学习第01天-Java基本内容

目录 注释 注释 单行注释 public class note {public static void main(String[] args) {// 单行注释} }多行注释 public class note {public static void main(String[] args) {/* 多行注释多行注释*/} }文档注释&#xff08;GPT生成&#xff09; /*** 计算两个整数…

webpack3升级webpack4遇到的各种问题汇总

webpack3升级webpack4遇到的各种问题汇总 问题1 var outputNamecompilation.mainTemplate.applyPluginWaterfull(asset-path,outputOptions.filename,{......)TypeError: compilation.mainTemplate.applyPluginsWaterfall is not a function解决方法 html-webpack-plugin 版…

可重构柔性装配产线:AI边缘控制技术的崭新探索

在信息化和智能化浪潮的推动下&#xff0c;制造业正面临着前所未有的转型升级挑战。其中&#xff0c;可重构柔性装配产线以其独特的AI边缘控制技术&#xff0c;为制造业的智能化转型提供了新的解决方案。 可重构柔性装配产线是基于AI工业控制与决策平台打造的智能化生产系统。…

WSL及UBUNTU及xfce4安装

如何拥有Linux服务器&#xff1f; wsl 是适用于 Linux 的 Windows 子系统&#xff08;Windows Subsystem for Linux&#xff09;。是一个为在Windows 10和Windows Server 2019上能够原生运行Linux二进制可执行文件&#xff08;ELF格式&#xff09;的兼容层&#xff0c;可让开发…

从车规传感器发展的正反面,看智驾发展的“胜负手”

北京车展进程过半&#xff0c;雷军和周鸿祎成为车展新晋“网红”的同时&#xff0c;智能驾驶成为观众讨论最务实的话题之一。端到端自动驾驶、城市NOA这些炙手可热的话题&#xff0c;占据了大部分的关注度。 但在高阶智能驾驶之外&#xff0c;智能驾驶同样具有频繁使用需求的低…

Leetcode—2639. 查询网格图中每一列的宽度【简单】

2024每日刷题&#xff08;121&#xff09; Leetcode—2639. 查询网格图中每一列的宽度 实现代码 class Solution { public:int func(int num) {if(num 0) {return 1;}int len 0;while(num ! 0) {len;num / 10;}return len;}vector<int> findColumnWidth(vector<ve…

实验14 MVC

二、实验项目内容&#xff08;实验题目&#xff09; 编写代码&#xff0c;掌握MVC的用法。【参考课本 例1 】 三、源代码以及执行结果截图&#xff1a; example7_1.jsp&#xff1a; <% page contentType"text/html" %> <% page pageEncoding "ut…

【重磅开源】MapleBoot项目开发规范

基于SpringBootVue3开发的轻量级快速开发脚手架 &#x1f341;项目简介 一个通用的前、后端项目模板 一个快速开发管理系统的项目 一个可以生成SpringBootVue代码的项目 一个持续迭代的开源项目 一个程序员的心血合集 度过严寒&#xff0c;终有春日&#xff…

WEB攻防-PHP特性-piwigoCMS审计实例

前置知识&#xff1a;PHP函数缺陷 测试环境 &#xff1a;piwigo CMS 漏洞URL&#xff1a; 漏洞文件位置&#xff1a;\include \functions_rate.inc.php 漏洞产生入口文件&#xff1a;/picture.php picture.php中接受了一个GET方法action参数&#xff0c;作为switch...case.…