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

news2025/3/31 0:02:51

在这里插入图片描述

你好,我是安然无虞。

文章目录

    • 日志记录
      • 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}')
遇见安然遇见你,不负代码不负卿。
谢谢老铁的时间,咱们下篇再见~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2322897.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用ucharts写的小程序,然后让圆环中间的空白位置变大

将ringWidth属性调小 extra: { ring: { ringWidth: 20, activeOpacity: 1.5, activeRadius: 10, offsetAngle: 0, labelWidth: 15, border: true, borderWidth: 0, borderColor: #F…

GPT-4o Image

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

C++:函数(通识版)

一、函数的基础 1.什么是函数&#xff1f;&#xff08;独立的功能单位&#xff09; 函数是C中封装代码逻辑的基本单元&#xff0c;用于执行特定任务。 作用&#xff1a;代码复用、模块化、提高可读性。 2、函数的基本结构 返回类型 函数名(参数列表) {// 函数体return 返回值…

无线安灯按钮盒汽车零部件工厂的故障告警与人员调度专家

在汽车零部件制造领域&#xff0c;生产线故障与物料短缺等问题往往引发连锁反应&#xff0c;导致停机损失与成本激增。传统人工巡检与纸质工单模式已难以满足高效生产需求&#xff0c;而无线安灯按钮盒的智能化应用&#xff0c;正成为破解这一难题的关键利器。 一、精准告警&am…

登录接口带验证码自动化(tesseract-OCR)

登录接口是很多网站和应用程序中必不可少的一部分。为了增加安全性&#xff0c;很多登录接口还会加入验证码的验证步骤&#xff0c;以防止恶意登录行为。 通常&#xff0c;遇到这样情况时有以下解决办法 1、使用万能验证码&#xff1a;如果遇到前台输入的是万能验证码&#xf…

【Python】pillow库学习笔记2-ImageFilter类和ImageEnhance类

PIL库的ImageFilter类和ImageEnhance类提供了过滤图像和增强图像的方法。 3.ImageFilter类 ImageFilter类共提供10种预定义图像过滤方法&#xff1a; 方法表示描述ImageFilter.BLUR图像的模糊效果ImageFilter.CONTOUR图像的轮廓效果ImageFilter.DETAIL图像的细节效果ImageFi…

3.Matplotlib:绘图参数文件和绘图的主要函数

一 绘图参数文件 1.绘图参数文件是什么 可以通过在程序中添加代码对参数进行配置&#xff0c;但是如果一个项日对于 Matplotlib 的特性参数总会设置相同的值&#xff0c;就没有必要在每次编写代码的时候都进行相同的配置。在代码之外使用一个永久的文件设定 Matplotlib 参数默认…

飞书只有阅读权限的文档下载,飞书文档下载没有权限的文件

wx搜索公zhong号&#xff1a;"狮心王"回复"飞书文档保存"下载chrome扩展文件 拿到扩展文件之后给chrome添加扩展

【开题报告+论文+源码】基于SpringBoot的智能安全与急救知识科普系统设计与实现

项目背景与意义 在全球范围内&#xff0c;安全与急救知识的普及已成为提升公众安全素养、减少意外伤害发生率、提高突发事件应对能力的重要举措。尤其是在当今社会&#xff0c;人们面临的生活、工作环境日益复杂&#xff0c;交通事故、火灾、溺水、突发疾病等各种意外事件的发生…

蓝桥杯 - 简单 - 布局切换

介绍 为了提高用户体验&#xff0c;网站有时需要多种浏览模式。现在特邀请你为蓝桥官网设计具有经典、浏览和工具三种布局模式。使用户可以根据具体情况选择合适的模式&#xff0c;以便更好地浏览网页内容。 本题需要在已提供的基础项目中使用 JS 完善代码实现布局的切换。 …

测试用例生成平台通过大模型升级查询功能,生成智能测试用例

在测试工作中&#xff0c;查询功能是各类系统的核心模块&#xff0c;传统的测试用例编写往往耗时且重复。如何让老旧平台焕发新活力&#xff1f;本文将结合大模型技术&#xff0c;通过用户输入的字段信息&#xff0c;自动化生成高效、精准的测试用例。同时&#xff0c;我们还将…

python每日十题(9)

外存储器的容量一般都比较大&#xff0c;而且大部分可以移动&#xff0c;便于在不同计算机之间进行信息交流。外存储器中数据被读入内存储器后&#xff0c;才能被CPU读取&#xff0c;CPU不能直接访问外存储器。本题答案为A选项。 进程是指一个具有一定独立功能的程序关于某个数…

macOS 制作dmg磁盘映像安装包

制作dmg磁盘影像安装包需要准备一下材料&#xff1a; 1. 导出的APP 2. 背景图片 3. 应用程序替身 前两种材料很容易得到。 下面介绍一下 应用程序替身制作过程&#xff1a; Finder —> 选中 应用程序 --> 找到顶部菜单栏中 的 前往 ----> 选择上层文件夹选中应用程…

Three.js 快速入门教程【十八】射线拾取模型——鼠标点击屏幕选中模型或物体

系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六】相机控件 Or…

如何下载 Postman?快速指南!

Postman 是一款非常受欢迎的 API 测试工具。它最初是作为一个 Chrome 插件发布&#xff0c;后来发展成为一款独立的跨平台软件&#xff0c;支持 Windows、Mac、Linux 等操作系统。 Postman 怎么下载教程&#xff08;2025最新版&#xff09;&#xff1f;

Shiro学习(一):Shiro介绍和基本使用

一、Shiro介绍 1、百科对shiro的定义如下&#xff1a; Apache Shiro 一个强大且易于使用的 Java 安全框架&#xff0c;它提供了身份验证、授权、加密和会话管理等功能。Shiro 的设计目标是简化企业级应用程序的安全性开发过程&#xff0c;同时保持代码的简洁和易于维护。 2、…

7.1 分治-快排专题:LeetCode 75. 颜色分类

1. 题目链接 LeetCode 75. 颜色分类 2. 题目描述 给定一个包含红色&#xff08;0&#xff09;、白色&#xff08;1&#xff09;和蓝色&#xff08;2&#xff09;的数组 nums&#xff0c;要求原地对数组进行排序&#xff0c;使得相同颜色的元素相邻&#xff0c;且按红、白、蓝…

开源软件许可证冲突的原因和解决方法

1、什么是开源许可证以及许可证冲突产生的问题 开源软件许可证是一种法律文件&#xff0c;它规定了软件用户、分发者和修改者使用、复制、修改和分发开源软件的权利和义务。开源许可证是由软件的版权所有者&#xff08;通常是开发者或开发团队&#xff09;发布的&#xff0c;它…

详解java体系实用知识总结

0.java技术能力框架 基础模块应用模块综合模块技术岗位与面试流程常用工具集系统架构设计计算机基础常用框架微服务架构jvm原理缓存容器化多线程队列云计算&#xff08;阿里云/aws&#xff09;设计模式数据库数据结构与算法 1.常用设计模式与应用场景 工厂模式&#xff1a;s…

【区块链安全 | 第二篇】区块链概念详解

文章目录 概述1. 区块链类型2 区块链五层架构3 账本模型4. 节点&#xff08;Node&#xff09;5. 区块&#xff08;Block&#xff09;6. 区块链&#xff08;Blockchain&#xff09;7. 区块链工作流程 核心技术1. 共识机制2. 智能合约 主要组件1. 交易&#xff08;Transaction&am…