Python日志模块Logging使用指北

作者:SkyXZ

CSDN:SkyXZ~-CSDN博客

博客园:SkyXZ - 博客园

Logging模块是Python中一个很重要的日志模块,它提供了灵活的日志记录功能,广泛应用于调试、运行状态监控、错误追踪以及系统运维中。相比于简单的print()打印调试,Logging支持不同的日志级别(如DEBUGINFOWARNINGERRORCRITICAL),可将日志输出到不同位置(如控制台、文件、网络等),还能自定义日志格式和处理方式,从而更好地满足实际项目中的日志管理需求。

相信各位小伙伴在平时比赛或者项目中写Python代码的时候,肯定会遇到代码出现莫名其妙的报错,而我们一时半会无法快速定位到问题出在哪里。这时候,相信很多同学都会使用 print() 函数在代码的不同地方插入打印输出来不断调试、缩小问题范围。虽然这种方式简单粗暴,在小项目或调试时确实能派上用场,但随着项目复杂度的提高,print()调试法就显得力不从心了。比如,你可能想区分调试信息和错误信息,或者只在生产环境中输出关键日志,还可能需要将日志写入文件供后续分析抑或是在找到问题之后还需手动删除各处的调试 print() 函数,这不仅麻烦,而且很容易遗漏,甚至可能将调试信息带到线上环境,造成信息泄露或日志污染。

因此,学会使用专业的日志工具显得尤为重要。在Python中,logging 模块正是官方推荐用于记录日志的强大工具。它不仅支持不同的日志等级(如 DEBUGINFOWARNINGERRORCRITICAL),还允许我们将日志灵活地输出到控制台、文件,甚至远程服务器。此外,logging 还支持自定义日志格式和多种处理器组合,能很好地适配各种复杂应用场景。接下来,我们就从最基础的用法入手,带你一步步掌握 logging 模块的强大功能,写出更专业、更易维护的Python代码!!!

首先我们要知道,在Logging模块中日志根据作用以及重要程度从小到大依次被分为了如下五个等级,具体如下表:

日志等级(level) 描述
DEBUG 调试信息,通常在诊断问题的时候使用
INFO 普通信息,确认程序按照预期运行
WARNING 警告信息,表示发生意想不到的事,或者指示接下来可能会出现一些问题,但是程序还是继续运行
ERROR 错误信息,程序运行中出现了一些问题,程序某些功能可能不能执行
CRITICAL 危险信息,一个严重的错误,导致程序无法继续运行

知道了这些,那我们具体该如何在代码中实现日志管理呢?我们接着往下讲,首先我们肯定是要在代码中导入我们的logging模块,这个模块是Python内置的,无需额外安装,接着我们要引入logging模块中的basicConfig函数,这个是配置日志系统最常用、最简单的一种方式,我们可以通过它来设置最低显示的日志等级、日志的显示格式、日志输出位置(默认是终端)以及写入文件的文件名和编码,接着我们结合示例来给大家演示一下:

  • 最低显示的日志等级:

从下面的代码中我们可以看到,我们可以使用level参数来设置日志的最低显示的等级,而当我们在basicConfig中将最低显示的日志等级level设置为WARNING的时候,只有大于 WARNING的消息才会被显示出来

import logging
logging.basicConfig(
level=logging.WARNING,
)
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")

  • 日志的显示格式:

除了设置最低显示的日志等级之外,我们还可以使用format参数来对我们的日志显示格式进行设置,format有很多可供选择的占位符,具体的见下表:

format占位符 含义说明
%(asctime)s 日志事件发生的时间(默认格式可自定义)
%(levelname)s 日志级别名称(如 INFO、DEBUG 等)
%(message)s 日志内容主体(你传入的日志消息)
%(name)s 日志器的名称(Logger对象的名字)
%(filename)s 当前执行代码的文件名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 输出日志的代码行号
%(pathname)s 当前执行代码的完整路径
%(module)s 模块名
%(threadName)s 线程名称(在多线程应用中常用)
%(process)d 进程 ID(在多进程应用中常用)
import logging
logging.basicConfig(
level=logging.WARNING,
format="时间:%(asctime)s-日志名称:%(name)s-日志级别:%(levelname)s-日志信息:%(message)s-文件名:%(filename)s-行号:%(lineno)d" )
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")

  • 日志输出位置:

除了将日志信息打印到终端(默认行为)以外,我们还可以通过 filename 参数将日志写入到指定的文件中。这样一来,我们就可以保存程序运行过程中的所有重要信息,便于后续排查问题或对系统进行日志分析。 我们还可以指定文件的编码方式,比如使用 utf-8,以避免中文乱码等问题。下面我们通过一个示例将日志写入文件中:

import logging
logging.basicConfig(
level=logging.WARNING,
format = '[%(name)s] [%(asctime)s.%(msecs)03d] [%(levelname)s] %(message)s',
filename='my_log.log',
encoding="utf-8"
)
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")

可以看到,运行了这段代码之后终端没有输出了,而在同路径下生成了一个我们指定的my_log.log文件,这个文件里就有我们需要的日志输出

如果想每次运行都重新生成日志文件,我们可以继续加上 filemode='w' 参数

import logging
logging.basicConfig(
level=logging.WARNING,
format = '[%(name)s] [%(asctime)s.%(msecs)03d] [%(levelname)s] %(message)s',
filename='my_log.log',
encoding="utf-8",
filemode='w'
)
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")

除此之外,我们也可以给当前的日志信息“命个名”,这在大型项目中非常有用!只需要通过 logging.getLogger("名字") 来创建一个具名 Logger,你可以根据模块、功能、组件的不同给它们起不同的名字,这样日志输出的时候就能快速定位日志是从哪个部分打印出来的,非常适合团队协作和大型工程的调试分析。

import logging
logging.basicConfig(
level=logging.WARNING,
format = '[%(name)s] [%(asctime)s.%(msecs)03d] [%(levelname)s] %(message)s',
)
logger = logging.getLogger("example")
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")

但是有同学就要问了:“哥们哥们,如果我既想让日志在终端显示,又想把日志写进文件保存下来,该怎么办呢?”这个问题非常常见!实际上,basicConfig 方式虽然简单方便,但它本质上是对根日志器(root logger)做一次性配置的,不支持同时配置多个输出目标(Handler)。也就是说,如果你想实现“同时输出到终端和文件”,就需要用更灵活的方式——自定义 Logger + Handler + Formatter 的组合配置

Handler 是什么呢?Handler logging 模块中的一个核心概念,它负责将日志消息输出到指定的目标,如控制台、文件、网络等。而 Formatter 则负责定义输出日志的格式。通过组合 LoggerHandlerFormatter,我们能够更加灵活地控制日志的输出方式和格式。我们可以用下图来进行理解

具体的示例如下,我们首先创建一个 logger 对象,并通过 getLogger 方法为其指定一个名称(在这里是 "example_logger")。接着,我们使用 setLevel 方法设置日志的最低输出级别为 DEBUG,这样所有级别(包括 DEBUGINFOWARNINGERRORCRITICAL)的日志都能被处理。然后,我们创建了两个 Handler:一个是 StreamHandler,用于将日志输出到控制台;另一个是 FileHandler,用于将日志写入名为 logfile.log 的文件。接着,我们使用 Formatter 设置日志输出的格式,包括日志器名称、日志时间、日志级别和日志信息,最后将这个 Formatter 配置应用到两个 Handler 上。最后,通过 addHandler 方法将这两个 Handler 添加到 logger 中,这样我们就能实现同时将日志输出到控制台和文件。

import logging

logger = logging.getLogger("example_logger")
logger.setLevel(logging.DEBUG) # 创建两个Handler,分别输出到控制台和文件
console_handler = logging.StreamHandler() # 输出到控制台
file_handler = logging.FileHandler("logfile.log", encoding="utf-8") # 输出到文件 # 创建Formatter并设置格式
formatter = logging.Formatter(
'[%(name)s] [%(asctime)s] [%(levelname)s] %(message)s'
)
console_handler.setFormatter(formatter) # 控制台Handler设置Formatter
file_handler.setFormatter(formatter) # 文件Handler设置Formatter # 将Handler添加到Logger中
logger.addHandler(console_handler)
logger.addHandler(file_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")

我们运行下这段代码可以发现不仅终端有输出,我们的日志文件里面也有记录:

我们的基础教学到这就结束啦!希望本篇Blogs可以帮到大家!

Python日志模块Logging使用指北的更多相关文章

  1. python日志模块logging

    python日志模块logging   1. 基础用法 python提供了一个标准的日志接口,就是logging模块.日志级别有DEBUG.INFO.WARNING.ERROR.CRITICAL五种( ...

  2. python日志模块logging学习

    介绍 Python本身带有logging模块,其默认支持直接输出到控制台(屏幕),或者通过配置输出到文件中.同时支持TCP.HTTP.GET/POST.SMTP.Socket等协议,将日志信息发送到网 ...

  3. 【python】【logging】python日志模块logging常用功能

    logging模块:应用程序的灵活事件日志系统,可以打印并自定义日志内容 logging.getLogger 创建一个log对象 >>> log1=logging.getLogger ...

  4. Python 日志模块logging

    logging模块: logging是一个日志记录模块,可以记录我们日常的操作. logging日志文件写入默认是gbk编码格式的,所以在查看时需要使用gbk的解码方式打开. logging日志等级: ...

  5. Python日志模块logging用法

    1.日志级别 日志一共分成5个等级,从低到高分别是:DEBUG INFO WARNING ERROR CRITICAL. DEBUG:详细的信息,通常只出现在诊断问题上 INFO:确认一切按预期运行 ...

  6. Python日志模块logging简介

    日志处理是项目的必备功能,配置合理的日志,可以帮助我们了解系统的运行状况.定位位置,辅助数据分析技术,还可以挖掘出一些额外的系统信息. 本文介绍Python内置的日志处理模块logging的常见用法. ...

  7. Python 日志模块 logging通过配置文件方式使用

    vim logger_config.ini[loggers]keys=root,infoLogger,errorlogger [logger_root]level=DEBUGhandlers=info ...

  8. Python日志模块logging&JSON

    日志模块的用法 json部分 先开一段测试代码:注意  str可以直接处理字典   eval可以直接将字符串转成字典的形式 dic={'key1':'value1','key2':'value2'} ...

  9. python日志模块---logging

    1.将日志打印到屏幕 import logging logging.debug('This is debug message---by liu-ke') logging.info('This is i ...

  10. 『无为则无心』Python日志 — 64、Python日志模块logging介绍

    目录 1.日志的作用 2.为什么需要写日志 3.Python中的日志处理 (1)logging模块介绍 (2)logging模块的四大组件 (3)logging日志级别 1.日志的作用 从事与软件相关 ...

随机推荐

  1. 3090 cuda环境配置杂记

    实验室新配了3090的电脑,cuda环境配置上出了些问题,百度很久才找到解决方法,因此记录下来. 主要参考:(6条消息) 服务器Linux环境配置cuda(非管理员)_@@Lynn的博客-CSDN博客 ...

  2. 解锁数据潜力,天翼云TeleDB为企业数智蝶变添力赋能!

    近日,第15届中国数据库技术大会(DTCC2024)在北京召开.大会以"自研创新 数智未来"为主题,重点围绕向量数据库与向量检索技术实践.数据治理与数据资产管理.云原生数据库开发与 ...

  3. 什么是Lambda架构?

    一.简介 Lambda架构(Lambda Architecture)是由Twitter工程师南森·马茨(Nathan Marz)提出的大数据处理架构. 这一架构的提出基于马茨在BackType和Twi ...

  4. 【杂谈】主键ID如何选择——自增数 OR UUID?

    1.生成位置如何影响选择? 数据库往返时间 使用自增数时,ID是由数据库在执行INSERT操作时生成的:而UUID则可以在应用层生成. 考虑这样的场景: 一个方法需要插入A和B两个实体.其中B的数据需 ...

  5. AI如何改变数据驱动决策的方式

    导语 在这个信息爆炸的时代,数据成为了企业和组织最为宝贵的资源.然而,单纯的数据堆积并没有太大价值,只有通过分析和挖掘,才能真正发挥数据的潜力.随着AI技术的飞速发展,我们正见证着数据驱动决策方式发生 ...

  6. 川崎机器人维修kasawaki维护注意事项

    为确保川崎机械臂的正确安全操作.防止人员伤害和财产损失,请遵守下述方框符号表达的安全信息. --注意事项 在进行Kasawaki川崎机器人维修操作前,请注意如下事项以确保安全. 1. 在开始检查之前, ...

  7. sprintf用法详解

    sprintf 将字串格式化. 在头文件 #include< stdio.h >中 语法: int sprintf(string format, mixed [args]...); 返回值 ...

  8. 机器学习 | 强化学习(2) | 动态规划求解(Planning by Dynamic Programming)

    动态规划求解(Planning by Dynamic Programming) 动态规划概论 动态(Dynamic):序列性又或是时序性的问题部分 规划(Programming):最优化一个程序(Pr ...

  9. CF2029C New Rating

    思路(二分 + 数据结构优化DP) 大致题意为:一个值 \(x\) 初始为 \(0\),然后有一个数组 \(a\),遍历一次数组. 如果 \(a_i > x\),则 \(x + 1\). 如果 ...

  10. 一个nginx + vue下二级路径版本化方案

    PS: 尽量不要做版本化!尽量不要做版本化!尽量不要做版本化! 过程说明: 1.arg_appver表示读取url上appver参数 2.对appver参数做变量映射得到alias_party1_te ...