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. Goh:一款Go语言的预编译快速模板引擎。(Benchmark排名第一)

    https://github.com/OblivionOcean/Goh Goh 是一款Go语言的预编译快速模板引擎. English | 简体中文 目录 特性 性能测试 安装 使用 语法 特性 预编 ...

  2. 2025苹果春季发布会前瞻:新品迭出,Apple Intelligence国行版即将上线!

    随着2025年的到来,苹果公司的春季发布会也渐行渐近.作为科技行业的领军企业,苹果每一次的新品发布都备受瞩目.本次春季发布会,苹果预计会带来一系列令人期待的新品,同时,国行Mac用户也将迎来一个重大更 ...

  3. macOS的PrivilegedHelperTools文件夹

    在 macOS 上,/Library/PrivilegedHelperTools 文件夹是一个特殊的位置,用于存放可以以更高权限运行的辅助工具或守护进程.这些工具通常由各种应用程序安装,以执行需要超出 ...

  4. FLink自定义Sink,生产的数据导出到mysql

    一.自定义生产数据 https://www.cnblogs.com/robots2/p/16048729.html 二.生产转化数据,导出到mysql 2.1 建表语句 CREATE TABLE `v ...

  5. Springboot 3.x 使用PageHelper实现MyBatis分页查询

    开发环境 SpringBoot 3.0.1 Maven 工程 JDK OpenJdk 17.0.6 引入pom依赖 <dependency> <groupId>com.gith ...

  6. sql server 新建用户数据库授权

    必须对数据库进行 db_owner 授权.

  7. Joe主题 更换评论框样式,填写QQ自动获取昵称邮箱

    前言: 由于为了美观感去除了画图模式,至于怎么加上画图模式会在文章最后给出详细教程. 同时也去除了填写网址选项,这个暂时无添加教程,关键没有合适的添加位子. 话不多说,直接开始教程! 下载文件包,解压 ...

  8. TVbox蜂蜜影视_v3.1.6:智能电视观影新选择,简洁界面与强大功能兼具

    蜂蜜影视是一款基于猫影视开源项目 CatVodTVJarLoader 开发的智能电视软件,专为追求简洁与高效观影体验的用户设计.该软件从零开始编写,界面清爽,操作流畅,特别适合在智能电视上使用.其最大 ...

  9. 面试题32 - I. 从上到下打印二叉树

    地址:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof/ <?php /** 从上到下打印出二 ...

  10. mysql 卸载安装教程链接

    https://blog.csdn.net/weixin_56952690/article/details/129678685 https://blog.51cto.com/u_16213646/70 ...