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 logginglogging.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.rhkb.cn/news/41578.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

特殊行车记录仪DAT视频丢失的恢复方法

行车记录仪是一种常见的车载记录仪&#xff0c;和常见的“小巧玲珑”的行车记录仪不同&#xff0c;一些特种车辆使用的记录仪的外观可以用“笨重”来形容。下边我们来看看特种车载行车记录仪删除文件后的恢复方法。 故障存储: 120GB存储设备/文件系统:exFAT /簇大小:128KB 故…

机器学习——KNN数据均一化

在KNN&#xff08;K-近邻&#xff09;算法中&#xff0c;数据均一化&#xff08;归一化&#xff09;是预处理的关键步骤&#xff0c;用于消除不同特征量纲差异对距离计算的影响。以下是两种常用的归一化操作及其核心要点&#xff1a; 质押 一 、主要思想 1. 最值归一化&#…

Element UI实现表格全选、半选

制作如图所示的表格全选、半选&#xff1a; 父组件 <template><div id"app"><SelectHost :hostArray"hostArray" /></div> </template><script> import SelectHost from ./components/SelectHost.vue export default…

深度学习入门1 基于Python的理论与实现

torch.unsqueeze()将一维数据变为二维数据&#xff0c;torch只能处理二维数据 tensor不能反向&#xff0c;variable可以反向。variable.data.numpy()转换为numpy 第3章 神经网络 实现softmax函数时的注意事项&#xff1a;为防止e的指数运算造成溢出 矩阵的第 0 维是列方向,第…

vue响应式原理剖析

一、什么是响应式? 我们先来看一下响应式意味着什么?我们来看一段代码: m有一个初始化的值,有一段代码使用了这个值; 那么在m有一个新的值时,这段代码可以自动重新执行; let m = 20 console.log(m) console.log(m * 2)m = 40上面的这样一种可以自动响应数据变量的代码机…

UDP数据报套接字编程

1.DatagramSocket API Socket是操作系统中的一个概念 本质上是一种特殊的文件 Socket就属于是把"网卡"这个设备,抽象成文件了 往Socket文件中写数据,就相当于通过网卡发送数据 从Socket文件读数据,就相当于通过网卡接受数据 在Java中就使用DatagramSocket这个类…

逼用户升级Win11,微软开始给Win10限速

随着Windows10的支持时间越来越短&#xff0c;微软也加大了对Win10用户的驱赶力度。 最近&#xff0c;微软官宣了将要在今年6月份降低OneNote for Windows 10的同步速度。软件也将和Windows10在今年的10月14日一同停止支持和维护。 这将影响实时协作和多设备访问。 对OneNote…

NodeJs之http模块

一、概念&#xff1a; 1、协议&#xff1a;双方必须共同遵从的一组约定。 Hypertext Transfer Protocol&#xff1a;HTTP&#xff0c;超文本传输协议 2、请求&#xff1a; ① 请求报文的组成&#xff1a; 请求行请求头空行请求体 ② 请求行&#xff1a;

26考研——图_图的应用(6)

408答疑 文章目录 四、图的应用图的应用考查形式最小生成树最小生成树概念最小生成树的性质最小生成树中某顶点到其他顶点是否具有最短路径的分析构造最小生成树的算法Prim 算法Prim 算法概述Prim 算法的构建思想Prim 算法的步骤Prim 算法的示例Prim 算法的性质 Kruskal 算法Kr…

Photoshop 2025安装包下载及Photoshop 2025详细图文安装教程

文章目录 前言一、Photoshop 2025安装包下载二、Photoshop 2025安装教程1.解压安装包2.运行程序3.修改安装路径4.设安装目录5.开始安装6.等安装完成7.关闭安装向导8.启动软件9.安装完成 前言 无论你是专业设计师&#xff0c;还是初涉图像处理的小白&#xff0c;Photoshop 2025…

MySQL-存储过程

介绍 基本语法 创建 调用 查看 删除 变量 系统变量 查看 设置 用户定义变量 赋值 使用 局部变量 声明 赋值 流程控制 参数 条件结构 IF case 循环结构 while repeat loop 游标 条件处理程序 介绍 举个简单的例子&#xff0c;我们先select某数据&…

debug 笔记:llama 3.2 部署bug 之cutlassF: no kernel found to launch!

1 问题描述 按照官方的写法 import torch from transformers import pipeline import os os.environ["HF_TOKEN"] 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 model_id "meta-llama/Llama-3.2-3B"pipe pipeline("text-generation", modelmode…

《Python实战进阶》No34:卷积神经网络(CNN)图像分类实战

第34集&#xff1a;卷积神经网络&#xff08;CNN&#xff09;图像分类实战 摘要 卷积神经网络&#xff08;CNN&#xff09;是计算机视觉领域的核心技术&#xff0c;特别擅长处理图像分类任务。本集将深入讲解 CNN 的核心组件&#xff08;卷积层、池化层、全连接层&#xff09;…

【银河麒麟系统常识】命令:uname -m(查看系统架构)

命令&#xff1a; uname -m 功能 常用的 Linux/Unix 终端命令&#xff0c;用于显示当前系统的硬件架构&#xff1b; 返回 返回系统的CPU架构类型&#xff0c;用于判断软件兼容性&#xff1b; 输出结果架构说明常见设备x86_64Intel/AMD 64位 CPU主流 PC、服务器aarch64ARM 64位 …

游戏引擎学习第183天

回顾和今天的计划 我对接下来的进展感到非常兴奋。虽然我们可能会遇到一些问题&#xff0c;但昨天我们差不多完成了将所有内容迁移到新的日志系统的工作&#xff0c;我们正在把一些内容整合进来&#xff0c;甚至是之前通过不同方式记录时间戳的旧平台层部分&#xff0c;现在也…

Redisson 实现分布式锁简单解析

目录 Redisson 实现分布式锁业务方法&#xff1a;加锁逻辑LockUtil 工具类锁余额方法&#xff1a;工具类代码枚举代码 RedisUtil 工具类tryLock 方法及重载【分布式锁具体实现】Supplier 函数式接口调用分析 Redisson 实现分布式锁 业务方法&#xff1a; 如图&#xff0c;简单…

鸿蒙Flutter实战:19-Flutter集成高德地图,跳转页面方式

前言 在之前的文章现有Flutter项目支持鸿蒙II中&#xff0c;介绍了如何使用第三方插件&#xff0c;同时给出了非常多的使用案例&#xff0c;如 flutter_inappwebview&#xff0c;video_player, image_picker 等&#xff0c;本文将开始介绍如何集成高德地图。 整体方案 通过 …

26考研——图_图的代码实操(6)

408答疑 文章目录 五、图的代码实操图的存储邻接矩阵结构定义初始化插入顶点获取顶点位置在顶点 v1 和 v2 之间插入边获取第一个邻接顶点获取下一个邻接顶点显示图 邻接表结构定义初始化图插入顶点获取顶点位置在顶点 v1 和 v2 之间插入边获取第一个邻接顶点获取下一个邻接顶点…

力扣32.最长有效括号(栈)

32. 最长有效括号 - 力扣&#xff08;LeetCode&#xff09; 代码区&#xff1a; #include<stack> #include<string> /*最长有效*/ class Solution { public:int longestValidParentheses(string s) {stack<int> st;int ans0;int ns.length();st.push(-1);fo…

Node.js 下载安装及环境配置教程、卸载删除环境配置超详细步骤(附图文讲解!) 从零基础入门到精通,看完这一篇就够了

Node.js 安装 一、进入官网地址下载安装包 Node.js — Download Node.js 选择对应你系统的Node.js版本&#xff0c;这里我选择的是Windows系统、64位 Tips&#xff1a;如果想下载指定版本&#xff0c;点击【以往的版本】&#xff0c;即可选择自己想要的版本下载 二、安装程序…