当前位置: 首页 > news >正文

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

在这里插入图片描述

你好,我是安然无虞。

文章目录

    • 日志记录
      • python的日志记录模块
      • 创建日志处理程序并配置输出格式
        • 将日志内容输出到控制台
        • 将日志写入到文件
      • logging更简单的一种使用方式

在这里插入图片描述

日志记录

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

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

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

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

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

python的日志记录模块

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

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

设置日志级别

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

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

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

 logger.setLevel(logging.DEBUG)
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 模块用于处理和输出日志消息的组件.我们可以为日志记录器添加一个或多个处理程序, 以决定日志消息的输出位置.

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

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

 logger.addHandler(handler)
将日志内容输出到控制台

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

 file_handler = logging.FileHandler('my_logger.log')

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

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)即可:

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更简单的一种使用方式

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

logging.basicConfig(
  level=logging.DEBUG,
  format='[%(name)s] %(asctime)s [%(levelname)s] %(message)s',
 )
logger = logging.getLogger('my_name')
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}')
遇见安然遇见你,不负代码不负卿。
谢谢老铁的时间,咱们下篇再见~

相关文章:

  • 深度学习入门1 基于Python的理论与实现
  • Photoshop 2025安装包下载及Photoshop 2025详细图文安装教程
  • 【LeetCode 题解】算法:8.字符串转换整数(atoi)
  • 自动化测试selenium(Java版)
  • CentOS 8 安装 Redis 全流程指南:从基础部署到远程安全配置
  • 音视频 三 看书的笔记 MediaPlayer的C/S架构
  • 数据库设计-笔记4
  • DeepSeek深度解析:AI在体育比分网中的应用场景与技术实践
  • Kali Linux 下安装 Sublime Text 详细教程
  • 各类神经网络学习:(五)LSTM 长短期记忆(上集),结构详解
  • 01 设计模式和设计原则
  • AI 在测试中的应用:从自动化到智能化的未来
  • Ubuntu下UEFI安全启动安装Nvdia驱动
  • JavaScript Fetch API
  • el-table + el-pagination 前端实现分页操作
  • secp256k1的模数P是如何选择的?
  • Java反射机制详解:原理、应用与最佳实践
  • Python内存管理探秘:让程序轻盈如羽的底层艺术
  • 畅享Mac桌面版TikTok!
  • 70. Linux驱动开发与裸机开发区别,字符设备驱动开发
  • 解放日报:这是一场需要定力和实力的“科技长征”
  • 发布亮眼一季度报后,东阿阿胶股价跌停:现金流隐忧引发争议
  • 鄂湘赣“中三角”,能否走向文旅C位?
  • 北京朝阳涉住宅组团地块126亿元成交
  • 4月份全国93个国家气象站日最高气温达到或突破极值
  • 马上评|“AI神医宇宙”欺诈,连演员都不请了