31天Python入门——第15天:日志记录

|----------------|
| 你好,我是安然无虞。 |

文章目录

日志记录

日志记录是一种重要的应用程序开发和维护技术, 它用于记录应用程序运行时的关键信息和事件.

通过适当的日志记录, 我们可以追踪应用程序的行为、排查问题和监控系统状态.

Python 提供了内置的 logging 模块, 使得日志记录变得简单而强大, 日志记录是将应用程序运行时的关键信息写入日志文件或输出到控制台.

它有以下主要目的和优势:

  • 问题排查:当应用程序出现错误或异常时, 日志记录提供了有关问题的关键信息, 有助于快速定位和修复错误.
  • 系统监控:通过记录应用程序的运行状态、资源使用情况和性能指标, 日志记录可以帮助我们监控系统的健康状况.
  • 运行分析:日志记录允许我们跟踪应用程序的执行流程和事件, 以便进行性能分析、行为分析和用户行为分析.

python的日志记录模块

Python 提供了内置的 logging 模块, 它是一个强大而灵活的日志记录工具.要使用 logging 模块, 先导入, 然后创建日志记录器

python 复制代码
 import logging
 # 创建日志记录器
 logger = logging.getLogger('my_logger')

设置日志级别

日志级别决定了哪些日志消息会被记录下来.logging 模块定义了以下几个日志级别(从低到高):

  • DEBUG: 详细的调试信息, 适用于开发环境.
  • INFO: 普通的信息消息, 用于确认应用程序的正常运行.
  • WARNING: 警告消息, 表示潜在的问题或不合适的使用.
  • ERROR: 错误消息, 表示应用程序遇到可恢复的错误.
  • CRITICAL: 严重错误消息, 表示应用程序遇到无法恢复的错误.

可以设置日志记录器的级别, 以决定哪些级别的日志消息会被记录.默认情况下, 日志记录器的级别是 WARNING, 这意味着只有 WARNINGERRORCRITICAL 级别的消息会被记录.

python 复制代码
 logger.setLevel(logging.DEBUG)
python 复制代码
import logging

# 创建日志记录器.
logger = logging.getLogger('my_logger')

logger.debug(f'这是一条 debug 日志信息.')
logger.info(f'这是一条 info 日志信息.')
logger.warning(f'这是一条 warning 日志信息.')
logger.error(f'这是一条 error 日志信息.')
logger.critical(f'这是一条 critical 日志信息.')

# 输出结果:
这是一条 warning 日志信息.
这是一条 error 日志信息.
这是一条 critical 日志信息.

创建日志处理程序并配置输出格式

日志处理程序是 logging 模块用于处理和输出日志消息的组件.我们可以为日志记录器添加一个或多个处理程序, 以决定日志消息的输出位置.

python 复制代码
# 输出到控制台.
handler = logging.StreamHandler()
# 配置输出格式
formatter = logging.Formatter('%(asctime)s [%(levelname)s] %(message)s')
handler.setFormatter(formatter)

将处理程序添加到日志记录器.

python 复制代码
 logger.addHandler(handler)
将日志内容输出到控制台
python 复制代码
import logging

# 创建日志记录器.
logger = logging.getLogger('my_logger')
# 设置日志记录的级别
logger.setLevel(logging.INFO)
# 输出到控制台. 创建一个日志处理程序.
handler = logging.StreamHandler()
# 设置日志处理器级别 - 程序中设置的日志级别必须不低于日志处理器级别才能记录
handler.setLevel(logging.INFO)
# 配置日志输出的格式.
formatter = logging.Formatter('[%(name)s] %(asctime)s [%(levelname)s] %(message)s')
# 将输出的格式添加到handler里面来.
handler.setFormatter(formatter)
# 将日志处理程序添加到logger.
logger.addHandler(handler)

logger.debug(f'这是一条 debug 日志信息.')
logger.info(f'这是一条 info 日志信息.')
logger.warning(f'这是一条 warning 日志信息.')
logger.error(f'这是一条 error 日志信息.')
logger.critical(f'这是一条 critical 日志信息.')


# 显示如下内容:

[my_logger] 2025-03-23 15:38:52,264 [INFO] 这是一条 info 日志信息.
[my_logger] 2025-03-23 15:38:52,264 [WARNING] 这是一条 warning 日志信息.
[my_logger] 2025-03-23 15:38:52,264 [ERROR] 这是一条 error 日志信息.
[my_logger] 2025-03-23 15:38:52,264 [CRITICAL] 这是一条 critical 日志信息.
将日志写入到文件

要将日志写入到文件只需要将创建日志处理程序的StreamHandler 更换为FileHandler

python 复制代码
 file_handler = logging.FileHandler('my_logger.log')

将日志记录内容既输出到控制台又输出到文件中:

python 复制代码
import logging

# 创建日志记录器.
# logging.basicConfig()
logger = logging.getLogger(__name__)
# 设置日志记录的级别
logger.setLevel(logging.INFO)
# 输出到控制台. 创建一个日志处理程序.
handler = logging.StreamHandler()
file_handler = logging.FileHandler('my_logger.log', encoding='utf8')
# 配置日志输出的格式.
formatter = logging.Formatter('[%(name)s] %(asctime)s [%(levelname)s] %(message)s')
# 将输出的格式添加到handler里面来.
handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
# 将日志处理程序添加到logger.
logger.addHandler(handler)
logger.addHandler(file_handler)


logger.debug(f'这是一条 debug 日志信息.')
logger.info(f'这是一条 info 日志信息.')
logger.warning(f'这是一条 warning 日志信息.')
logger.error(f'这是一条 error 日志信息.')
logger.critical(f'这是一条 critical 日志信息.')

如果仅仅想让日志内容输出到文件中, 可以把之前创建的输出到控制台的handler删除(只保留输出到文件中的handler)即可:

python 复制代码
import logging

# 创建日志记录器.
# logging.basicConfig()
logger = logging.getLogger(__name__)
# 设置日志记录的级别
logger.setLevel(logging.INFO)
# 输出到控制台. 创建一个日志处理程序.
file_handler = logging.FileHandler('my_logger.log', encoding='utf8')
# 配置日志输出的格式.
formatter = logging.Formatter('[%(name)s] %(asctime)s [%(levelname)s] %(message)s')
# 将输出的格式添加到handler里面来.
file_handler.setFormatter(formatter)
# 将日志处理程序添加到logger.
logger.addHandler(file_handler)

logger.debug(f'这是一条 debug 日志信息.')
logger.info(f'这是一条 info 日志信息.')
logger.warning(f'这是一条 warning 日志信息.')
logger.error(f'这是一条 error 日志信息.')
logger.critical(f'这是一条 critical 日志信息.')

logging更简单的一种使用方式

这种使用方式较上面的使用方式更简单:

python 复制代码
logging.basicConfig(
  level=logging.DEBUG,
  format='[%(name)s] %(asctime)s [%(levelname)s] %(message)s',
 )
logger = logging.getLogger('my_name')
python 复制代码
import logging

logging.basicConfig(
    level=logging.INFO,
    format='[%(name)s] %(asctime)s [%(levelname)s] %(message)s',
    handlers=[
        logging.StreamHandler(),
        logging.FileHandler('my_logger.log', encoding='utf8')
    ]
)
logger = logging.getLogger('my_name')


# 模拟用户名校验.
def check_username(username):
    """
    1. 长度不能小于5.
    2. 只能包含字符.
    3. 禁止使用系统用户名. admin, root.
    :param username: 传入的用户名.
    :return: None.
    """
    logger.debug(f'正在备校验{username}')
    if username in ['admin', 'root']:
        raise ValueError('禁止使用系统用户名')
    if len(username) < 5:
        raise ValueError('用户名长度小于5')
    if not username.isalpha():
        raise ValueError('用户名只能包含字符')
    # 如果上面的3个判断都没进, 就会走到这里.
    logger.info(f'{username}校验成功.')

try:
    username = input("请输入用户名:")
    logger.debug(f'准备校验{username}')
    check_username(username)
except ValueError as e:
    # 此处username发出黄色警告, 我在视频中是故意不讲的, 因为已经讲过很多次了.
    # 希望大家自己动手解决一下此处username发出黄色警告的问题.
    logger.error(f'用户名{username}校验失败: 失败原因{e}')

|----------------------|
| 遇见安然遇见你,不负代码不负卿。 |
| 谢谢老铁的时间,咱们下篇再见~ |

相关推荐
万才博客2 分钟前
【AI编程学习之Python】第一天:Python的介绍
python·学习·ai编程
gjc5925 分钟前
MySQL源码学习系列(二)--面试高频问题:general log、slowlog记录顺序
数据库·学习·mysql·面试·职场和发展
三生暮雨渡瀟瀟17 分钟前
Python之函数
开发语言·python
敖正炀32 分钟前
JVM字节码详解
后端
残轩33 分钟前
是时候考虑用uv管理你的python项目及依赖了
python·rust
独行soc35 分钟前
2025年渗透测试面试题总结-某快手-安全工程师(题目+回答)
网络·数据库·python·安全·面试·职场和发展·红蓝攻防
敖正炀39 分钟前
JVM类文件结构
后端
敖正炀40 分钟前
类加载过程
后端
Asthenia04121 小时前
面试复盘:Collections.synchronizedList的实现与同步策略分析
后端