Python日志模块Logging使用指北
Python日志模块Logging使用指北
作者:SkyXZ
CSDN:SkyXZ~-CSDN博客
博客园:SkyXZ - 博客园
Logging模块是Python中一个很重要的日志模块,它提供了灵活的日志记录功能,广泛应用于调试、运行状态监控、错误追踪以及系统运维中。相比于简单的print()打印调试,Logging支持不同的日志级别(如DEBUG、INFO、WARNING、ERROR和CRITICAL),可将日志输出到不同位置(如控制台、文件、网络等),还能自定义日志格式和处理方式,从而更好地满足实际项目中的日志管理需求。
相信各位小伙伴在平时比赛或者项目中写Python代码的时候,肯定会遇到代码出现莫名其妙的报错,而我们一时半会无法快速定位到问题出在哪里。这时候,相信很多同学都会使用 print() 函数在代码的不同地方插入打印输出来不断调试、缩小问题范围。虽然这种方式简单粗暴,在小项目或调试时确实能派上用场,但随着项目复杂度的提高,print()调试法就显得力不从心了。比如,你可能想区分调试信息和错误信息,或者只在生产环境中输出关键日志,还可能需要将日志写入文件供后续分析抑或是在找到问题之后还需手动删除各处的调试 print() 函数,这不仅麻烦,而且很容易遗漏,甚至可能将调试信息带到线上环境,造成信息泄露或日志污染。
因此,学会使用专业的日志工具显得尤为重要。在Python中,logging 模块正是官方推荐用于记录日志的强大工具。它不仅支持不同的日志等级(如 DEBUG、INFO、WARNING、ERROR、CRITICAL),还允许我们将日志灵活地输出到控制台、文件,甚至远程服务器。此外,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 则负责定义输出日志的格式。通过组合 Logger、Handler 和 Formatter,我们能够更加灵活地控制日志的输出方式和格式。我们可以用下图来进行理解

具体的示例如下,我们首先创建一个 logger 对象,并通过 getLogger 方法为其指定一个名称(在这里是 "example_logger")。接着,我们使用 setLevel 方法设置日志的最低输出级别为 DEBUG,这样所有级别(包括 DEBUG、INFO、WARNING、ERROR 和 CRITICAL)的日志都能被处理。然后,我们创建了两个 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使用指北的更多相关文章
- python日志模块logging
python日志模块logging 1. 基础用法 python提供了一个标准的日志接口,就是logging模块.日志级别有DEBUG.INFO.WARNING.ERROR.CRITICAL五种( ...
- python日志模块logging学习
介绍 Python本身带有logging模块,其默认支持直接输出到控制台(屏幕),或者通过配置输出到文件中.同时支持TCP.HTTP.GET/POST.SMTP.Socket等协议,将日志信息发送到网 ...
- 【python】【logging】python日志模块logging常用功能
logging模块:应用程序的灵活事件日志系统,可以打印并自定义日志内容 logging.getLogger 创建一个log对象 >>> log1=logging.getLogger ...
- Python 日志模块logging
logging模块: logging是一个日志记录模块,可以记录我们日常的操作. logging日志文件写入默认是gbk编码格式的,所以在查看时需要使用gbk的解码方式打开. logging日志等级: ...
- Python日志模块logging用法
1.日志级别 日志一共分成5个等级,从低到高分别是:DEBUG INFO WARNING ERROR CRITICAL. DEBUG:详细的信息,通常只出现在诊断问题上 INFO:确认一切按预期运行 ...
- Python日志模块logging简介
日志处理是项目的必备功能,配置合理的日志,可以帮助我们了解系统的运行状况.定位位置,辅助数据分析技术,还可以挖掘出一些额外的系统信息. 本文介绍Python内置的日志处理模块logging的常见用法. ...
- Python 日志模块 logging通过配置文件方式使用
vim logger_config.ini[loggers]keys=root,infoLogger,errorlogger [logger_root]level=DEBUGhandlers=info ...
- Python日志模块logging&JSON
日志模块的用法 json部分 先开一段测试代码:注意 str可以直接处理字典 eval可以直接将字符串转成字典的形式 dic={'key1':'value1','key2':'value2'} ...
- python日志模块---logging
1.将日志打印到屏幕 import logging logging.debug('This is debug message---by liu-ke') logging.info('This is i ...
- 『无为则无心』Python日志 — 64、Python日志模块logging介绍
目录 1.日志的作用 2.为什么需要写日志 3.Python中的日志处理 (1)logging模块介绍 (2)logging模块的四大组件 (3)logging日志级别 1.日志的作用 从事与软件相关 ...
随机推荐
- Groove Intermediate pg walkthrough
80端口web站点 dirsearch 没发现啥有用信息 感觉就是让我们突破登录框进后台的 https://github.com/ChurchCRM/CRM/issues/137 上网查到默认密码 登 ...
- [SDOI2009] 晨跑 题解
每个点拆成入点和出点. 发现每个点.每条边都只能经过一次,所以所有边的容量都是 \(1\). #include<bits/stdc++.h> #define ll long long us ...
- 在Unity中玩转表达式树:解锁游戏逻辑的动态魔法
html { overflow-x: initial !important } :root { --bg-color: #ffffff; --text-color: #333333; --select ...
- flutter - [02] 基本语法
题记部分 一.注释 ///这是一个注释 //这也是个注释 /* 这还是个注释 */ void main(List<String> args) { print ('你好 dart'); } ...
- Docker 容器的数据卷 以及 数据卷容器
Docker 容器删除后,在容器中产生的数据还在吗? 答案是 不在 Docker 容器和外部机器可以直接交换文件吗? 在没有数据卷的情况下,答案是 不可以 如下图:外部机器:Windows系统(自己的 ...
- 公众号已上线 Ask AI 功能
Get新技能,给公众号接入AI智能体,没花一分钱. 不禁感慨这时代的进步也太快了,曾经科幻小说中描绘的未来已成现实! 下面是笔者在腾讯元宝中创建的智能体"鲸鱼小助手": 如果今后要 ...
- apache和nginx關聯php的過程
Nginx端 Nginx是一個服務器,同時也是一個功能強大的proxy服務器,除了進行http請求的代理,還可以進行其他協議請求代理(fastCgi協議),為了能使nginx理解fastCgi協議,n ...
- Manus爆火,是硬核还是营销?
相信这两天小伙伴们应该被Manus刷屏了,铺天盖地的体验解读文章接踵而来,比如「数字生命卡兹克」凌晨爆肝的热文:「一手体验首款通用Agent产品Manus」.从公众号.朋友圈.抖音.央媒,都能看到Ma ...
- rust学习笔记(7)
crate 中文是货箱,这是我们编写自己的库或者程序的方式 库 使用rustc可以把一个文件编译为lib rustc --crate-type=lib rary.rs 构建的方式选择lib 编译出来的 ...
- mac 触控板 三指拖动
1. 打开系统偏好设置 点击屏幕左上角的苹果图标(),选择"系统设置". 2. 打开指针控制 在系统偏好设置窗口左侧栏中,点击"辅助功能",然后在右侧列表中, ...