Python常用标准库logging-程序员宅基地

技术标签: python  linux  服务器  

​ logging是python标准库中的最常使用包的之一,可以放便我们进行问题排查,输出一下我们希望输出的内容信息,总结一些常用的方式,放便使用

包的引入

因为是Python标准库的内容,所以不需要进行再进行其他安装,只需要安装有Python就可以,直接import

import logging
配置日志打印格式

日志有6个级别:NOTSET<DEBUG < INFO < WARNING < ERROR < CRITICAL

一般使用如下示例的格式即可:【高于设定级别的信息都会输出,我们一般关心的都是ERROR的信息,但是有时侯我们会用info级别来输出一些内容帮助校验内容方法返回的内容,这些内容一般都设置为info内容的信息,所以建议用下面的格式即可】

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

log级别

图片是官网上对于级别的说明【官网地址:https://docs.python.org/3.11/library/logging.html#logging-levels】

包的常见使用

1.除了本身logging包会捕捉程序中的一些报错日志,我们也可以自己设定,来进行我们一些日志的输出

if State == 0:
    logging.info("任务初始化中================================================================")
elif State == 1:
    logging.info("任务进行中================================================================")
elif State == 3:
    logging.info("数据写入中================================================================")
elif State == 4:
    logging.info("任务排队中================================================================")
elif State == -1 or State == -3:
    logging.error(
        "任务失败或被删除")
    break  *#* *任务失败或被删除,跳出循环
*else:
    logging.error("未知的任务状态")

不同的日志级别调用不同方法上面使用到的是info()、error(),你也可以设置任意其他可选级别,但是如果你使用了低于info()级别的方法,想使其正常输出的话,上买logging.basicConfig(level=logging.INFO)级别也要对应修改

​ 另外这里只是对日志进行了打印,自己写的logging.error()不会中断代码的运行,如果你想在输出错误级别的日志时,阻断任务的继续进行,需要结合异常来进行

下面是一个使用ValueError来阻断的示例:

# @Time: 2024/4/11 15:31
# @Author shushan
import logging
import Mylib
logger = logging.getLogger(__name__)
# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def main():
    # 配置日志
    try:
        # 假设这里有一段可能会出错的代码
        raise ValueError("这里有一个错误。")
    except ValueError as e:
        logging.error(f"捕获到错误: {
      e}")
        # 选择性地,你可以在这里抛出异常或执行其他逻辑
        # raise
    print("Starting")

if __name__ == '__main__':
    main()

控制台输出结果:
控制台结果

拓展:
根据自己的喜好设置日志格式

​ 在logging.basicConfig()中有多个参数可以设置,可以根据自己的想法设定日志的,下面列出一些常见的日志参数

​ 以logging.basicConfig(level=logging.INFO, format=‘%(asctime)s - %(levelname)s - %(message)s’)为例

用到了两个参数:

​ **level:**设定日志输出的级别,高于这个级别的的日志都会被输出

​ **format:**设定日志的输出格式,比如format=‘%(asctime)s - %(levelname)s - %(message)s’)

这里的日志的输出格式为「时间+日志级别+日志信息」【参考上面图片的日志输出格式】,在 Python 的 logging 模块中,像 %(asctime)s 这样的参数被称为日志记录格式化字段。这些字段是在 logging 模块的 LogRecord 对象中定义的。LogRecord 对象自动为每一个日志事件创建,并包含了与该事件相关的所有信息,例如时间戳、日志级别和消息文本等,除了asctime、levelname、message外,还有很多参数可以用来规范格式例

可以查看官网:https://docs.python.org/3.11/library/logging.html#logrecord-objects

另外还有一些常用的参数:

​ **filename:**日志输出地址的文件名

datefmt: 规定日志输出时间的格式

​ **funcName:**输出打印日志所在的方法的名称,帮助定位出现报错的位置

更多的参数可以查看官方网站【注意要结合自己的python的具体版本,不同版本的标准库参数有所差异】:

https://docs.python.org/3.11/library/logging.html#logrecord-objects

如何每个方法使设置不同的日志级别

​ 我们使用logging.basicConfig(level=logging.INFO, format=‘%(asctime)s - %(levelname)s - %(message)s’)进行日志的格式设置之后,如果针对不同的方法中,我们想输出不同格式的日式,是不能实现的,因为logging.basicConfig()只会在第一次生效,有多次的logging.basicConfig()配置情况,都会被覆盖,那如果我们想在同一个模块的不同方法使用不同的日志格式,可以通过为每个函数或需要特定格式的代码块配置独立的日志处理器(logger)和格式器(formatter)来实现。

def function1():
    # 创建一个日志记录器
    logger1 = logging.getLogger('Function1')
    logger1.setLevel(logging.DEBUG)  # 设置日志级别
    # 创建一个日志处理器,这里使用控制台输出
    handler1 = logging.StreamHandler()
    # 创建并设置日志格式
    formatter1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    handler1.setFormatter(formatter1)
    # 添加处理器到日志记录器
    logger1.addHandler(handler1)
    # 使用日志记录器
    logger1.info("This is an info message from Function 1")

def function2():
    # 创建一个日志记录器
    logger2 = logging.getLogger('Function2')
    logger2.setLevel(logging.ERROR)  # 设置日志级别
    # 创建一个日志处理器,这里使用控制台输出
    handler2 = logging.StreamHandler()
    # 创建并设置另一种日志格式
    formatter2 = logging.Formatter('%(asctime)s - %(name)s - %(message)s')
    handler2.setFormatter(formatter2)
    # 添加处理器到日志记录器
    logger2.addHandler(handler2)
    # 使用日志记录器
    logger2.error("This is an error message from Function 2")
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_46401846/article/details/138133013

智能推荐

瞎想-电信IPTV如何做到真高清真4K直播_湖南电信iptv模糊-程序员宅基地

文章浏览阅读2.3w次。瞎想-电信IPTV如何做到真高清真4K直播前几天看电信IPTV,发现高清足球大镜头的时候,基本看不清球员号码,有时候球员的头都比较模糊。 我真的比较纳闷,电信都开始100M宽带起步了,为什么连10M的高清频道都无法展现好呢?我觉得IPTV肯定遇到了什么带宽瓶颈,但是具体瓶颈在哪,我不好说,也说不好。突然有个想法,IPTV是否能够参考广电的架构,完成高质量的直播呢? 甚至是4K直播。..._湖南电信iptv模糊

STM32寄存器开发-环境搭建_设计一个32位存储器模块的方法-程序员宅基地

文章浏览阅读1.9k次。From:http://bbs.elecfans.com/jishu_1102996_1_2.html概述 STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核,CM3采用了[url=]哈佛结构[/url][Ecube1] ,拥有独立的指令总线和数据总线,可以让取指与数据访问并行不悖。 _设计一个32位存储器模块的方法

umi命令行工具源码解读,umi build打包-程序员宅基地

文章浏览阅读1.3w次。以umi build为例,查看umi命令行工具的逻辑首先查看package.json文件的bin字段,找到umi可执行文件的位置: "bin": { "umi": "./bin/umi.js" },查看umi/bin/umi.js文件,实际逻辑是在umi/src/cli.js文件中,执行umi build// umi/src/cli.jsswitch (script) ..._umi build

Drools 7 用OOPath遍历嵌套类型的实体对象-程序员宅基地

文章浏览阅读1.1k次。Drools 7 基于XPath的OOPath用于简化对象或者内层嵌套的对象属性的遍历。这个话题很拗口,简单点讲就是一种带有筛选条件的访问实体或实体内部嵌套的实体及其属性的方式_oopath

你时间总不够用?请收下这套最佳的分配时间的方法-程序员宅基地

文章浏览阅读399次。有谁要是为了赚得更多的钱而加班加点、 更加卖力地去工作, 他就不会真正变得更加富有。 被牺牲掉的业余时间的价值必须从其更高收入中扣除, 而且被牺牲掉的这部分的价值通常比财务上得到的要高很多。为了赚更多的钱而牺牲掉您的业余时间, 靠这种方法您不可能实现真正的富有。 真正的富有是指具有由少变多的本事, 而并非必须为此做出同样程度的牺牲。真正的成功意味着: 您能够获得更高的收入, 但您的...

错误处理:MySQL报错解决:插入数据时发生错误-程序员宅基地

文章浏览阅读2.2k次。大家好,今天我来分享一下在Linux上运行MySQL服务时遇到的一个插入数据时的报错以及其解决方法。这个报错信息非常具体,相信很多开发者和运维人员都曾经遇到过。记得关注我的公众号“运维家”,获取更多实用技巧和经验分享。一、问题描述当你尝试向MySQL数据库中插入数据时,可能会遇到以下报错信息:“无法插入数据,因为字段不匹配”。这时候,你可能会感到困惑,因为你明明已经按照正确的格式提供了数据,为什么..._mysql数据添加数据报错

随便推点

使用oap切面导致controller被重复调用_joinpoint.proceed()报错-程序员宅基地

文章浏览阅读677次。在自测的时候发现某个很奇怪的问题,某个变量本该加1的变成了加2,debug后发现所有controller都被调用了两次,里面的方法也执行了两次。可以看到execution表达式定义了所有controller包,及改包下所有类的所有方法,joinPoint.proceed()后面经过排查发现写切面的时候,在环绕通知里调用了两次joinPoint.proceed()joinPoint.proceed()执行目标方法目标方法。修改原逻辑只执行一次joinPoint.proceed()......_joinpoint.proceed()报错

web前后端 http转https-程序员宅基地

文章浏览阅读2.3k次,点赞3次,收藏14次。1.转换前准备http转https需要一个证书、本文已ssl证书举例,只有认证的证书才能被认可。阿里云可以申请免费的证书, 但是生成证书需要域名。且域名要绑定ip。故ssl申请前需要域名。可上阿里云购买。2.证书申请...

用MATLAB解决实际数学问题,利用MATLAB解决高等数学问题.doc-程序员宅基地

文章浏览阅读3.4k次,点赞5次,收藏15次。利用MATLAB解决高等数学问题Matlab 大作业本人选择了利用MATLAB解决高等数学问题。极限计算limit(f,x,a): 求函数f在x趋于常数a时的极限;limit(f): 求函数f在x趋于0时的极限;limit(f,x,a,’right’): 求函数f在x趋于常数a时的右极限;limit(f,x,a,’left’): 求函数f在x趋于常数a时的左极限;具体计算如下:求极..._matlab7.0解决高等数学问题

vue使用UEditor富文本_vue富文本ueditor学习-程序员宅基地

文章浏览阅读428次。UEditor 使用_vue富文本ueditor学习

Android_8.1 Log 系统源码分析_liblog.so 源码包-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏6次。0x01 Android Log框架推荐1、 logger提供了一些格式化输出、美观// 添加依赖implementation 'com.orhanobut:logger:2.2.0'// 初始化Logger.addLogAdapter(new AndroidLogAdapter());// 使用Logger.d("hello,Android");2、timber基于原生L..._liblog.so 源码包

愉快地迁移到 Python 3-程序员宅基地

文章浏览阅读1.5k次。(点击上方公众号,可快速关注)编译: Python开发者 - 冲动老少年 英文:Alex Rogozhnikovhttp://python.jobbole.com/89031/为数据科学家准备的 Python 3 特性指南Python 已经成为机器学习和一些需处理大量数据的科学领域的主流语言。它支持了许多深度学习框架和其他已确立下来的数据处理和可视化的工具集。然而,Python 生态系统还处_如何迁移到python 3.x

推荐文章

热门文章

相关标签