python日志处理logging

news2025/2/5 17:15:27

python日志处理logging

在项目开发中,日志信息是程序中必不可少的组成部分。每一种语言都有相应的日志模块,如java中log4j,而python中是通过logging模块来提供日志功能。

日志要哪些本质功能?

在分享日志logging模块之前,先来思考下我们需要哪些的日志信息?或者日志信息给我们提供什么样的价值?

  • 基本功能1.首先:日志应该包含程序运行的基本信息,比如运行时间,**运行的位置信息(哪个文件,哪行)**等,这些信息可以帮助我们观测程序的运行的基本情况,以便更好的分析你需要的输出的信息所代表的含义;
  • 基本功能2.接着:日志最重要的功能是在程序功能中输出一些信息数据,以便更好的了解程序的运行情况。而我们需要输出的信息太多了,在不同的开发阶段需要的信息也不同,如一些流程必要的基本信息调试的过程信息错误信息告警信息;这么多信息要展示,日志信息会显得杂乱,不能突出重点,同时这些信息又都能在不同场景使用(通常我们在调试完程序后,调试一些信息可以删除,但是出现bug后,又有调试的时候,就会出现重复劳动的问题);所以日志模块需要提供日志筛选和过滤的功能,通常是对日志信息进行等级分类,并设置需要显示的最低等级。这样我们需要调试的时候就开启调试的日志,不需要的时候开启更高等级的日志信息,更加灵活
  • 基本功能3.另外,日志应该支持输出到多种途径,比如直接终端显示,一般线上系统需要输出到日志文件,便于排查问题

以上就是日志必须要有的功能3个模块。

logging基本使用

python的logging模块也提供了上面说的3个基本模块,也是我们最经常使用的(别的花哨的功能可以查看API咯);

import logging
logging.basicConfig()
print(__name__)
logger = logging.getLogger(__name__)

logger.setLevel(logging.DEBUG)
logger.debug("this is a debug")
logger.info('this is a info')
logger.warning('this is a warn')
logger.critical('this is a critical')
logger.error('this is a error')

# __main__
# DEBUG:__main__:this is a debug
# INFO:__main__:this is a info
# WARNING:__main__:this is a warn
# CRITICAL:__main__:this is a critical
# ERROR:__main__:this is a error

logging中的日志等级可以分为5个,从低到高分别是:

    1. DEBUG:调试
    1. INFO: 基本信息
    1. WARNING: 非错误,警告类信息
    1. ERROR: 异常错误信息
    1. CRITICAL:严重问题如硬件问题等,基本很少使用

默认的是WARNING等级,当在WARNING或WARNING之上等级的才记录日志信息。

上面我们了解了logging的基本的使用:

  • 导入logging, 默认情况下回进行基本配置
  • 获取日志记录器logger
  • 设置日志等级
  • 利用日志记录器logger进行日志输出

logging进阶

logging主要由四个模块组成:

  • 记录器 loggers: 记录日志主要信息,一般通过logger.getLogger(“name”), 可以设置名字来创建不同日志记录器,默认不设置为root记录器,记录器可以设置日志等级,对应日志基本功能2
  • 句柄 handlers; 设置日志的输出的形式,正常是文件输出和屏幕流输出,对应日志基本功能3
  • 过滤器 Filters:很少用,过滤日志信息
  • 格式化Formatters:设置日志输出的格式(如时间,文件名等), 对应日志基本功能1

下面给出完整的例子:

import logging
def get_root_logger(logger_name='log', log_level=logging.INFO, log_file=None):
    logger = logging.getLogger(logger_name)
    logger.setLevel(level=log_level)
    format_str = '%(asctime)s [ %(name)s ] %(filename)s - line:%(lineno)d %(levelname)s: %(message)s'
    # if the logger has been initialized, just return it
    if logger.hasHandlers():
        return logger

    if log_file is not None:
        file_handler = logging.FileHandler(log_file, 'w')
        file_handler.setFormatter(logging.Formatter(format_str))
        file_handler.setLevel(log_level)
        logger.addHandler(file_handler)
    else:
        sh = logging.StreamHandler()
        sh.setFormatter(logging.Formatter(format_str))
        sh.setLevel(log_level)
        logger.addHandler(sh)

    return logger

logger = get_root_logger("mylog")
logger.info('this is a info')
logger.warning('this is a warn')
logger.critical('this is a critical')
logger.error('this is a error')

# 2022-09-10 22:47:08,611 [ mylog ] log.py - line:24 INFO: this is a info
# 2022-09-10 22:47:08,611 [ mylog ] log.py - line:25 WARNING: this is a warn
# 2022-09-10 22:47:08,611 [ mylog ] log.py - line:26 CRITICAL: this is a critical
# 2022-09-10 22:47:08,614 [ mylog ] log.py - line:27 ERROR: this is a error

从上面可以知道,handler需要设置日志格式和日志等级。

基本格式:

  • asctime 时间
  • name 日志名称
  • filename 日志信息所在文件
  • lineno: 日志信息坐在文件行号
  • levelname:日志等级
  • message 日志内容

logging注意事项

  • 单例模式
    logging.getLogger是单例模式,所以同一个名字的logger在不同的文件或者模块中使用都是调用的是同一个logger。

    这个在多模块中使用通过一个logger特别实用。

  • 避免多个句柄输出相同的内容
    由于一个logger可以有多个句柄handler,如果出现输出相同日志信息的情况,可以检查下是否多个句柄。注意logging.basicConfig()默认会创建一个屏幕流句柄。

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

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

相关文章

【大模型】AI 辅助编程操作实战使用详解

目录 一、前言 二、AI 编程介绍 2.1 AI 编程是什么 2.1.1 为什么需要AI辅助编程 2.2 AI 编程主要特点 2.3 AI编程底层核心技术 2.4 AI 编程核心应用场景 三、AI 代码辅助编程解决方案 3.1 AI 大模型平台 3.1.1 AI大模型平台代码生成优缺点 3.2 AI 编码插件 3.3 AI 编…

RK3566-移植5.10内核Ubuntu22.04

说明 记录了本人使用泰山派(RK3566)作为平台并且成功移植5.10.160版本kernel和ubuntu22.04,并且成功配置&连接网络的完整过程。 本文章所用ubuntu下载地址:ubuntu-cdimage-ubuntu-base-releases-22.04-release安装包下载_开源…

从零开始实现一个双向循环链表:C语言实战

文章目录 1链表的再次介绍2为什么选择双向循环链表?3代码实现:从初始化到销毁1. 定义链表节点2. 初始化链表3. 插入和删除节点4. 链表的其他操作5. 打印链表和判断链表是否为空6. 销毁链表 4测试代码5链表种类介绍6链表与顺序表的区别7存储金字塔L0: 寄存…

51单片机 06 定时器

51 单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 作用:1、用于计时;2、替代长时间的Delay,提高CPU 运行效率和处理速度。 定时器个数:3个(T0、T1、T2)&#xf…

【C++】P1957 口算练习题

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述输入格式:输出格式: 💯我的做法代码实现: 💯老师的做法代码实现: 💯对比分析&am…

Workbench 中的热源仿真

探索使用自定义工具对移动热源进行建模及其在不同行业中的应用。 了解热源动力学 对移动热源进行建模为各种工业过程和应用提供了有价值的见解。激光加热和材料加工使用许多激光束来加热、焊接或切割材料。尽管在某些情况下,热源 (q) 不是通…

CCF-GESP 等级考试 2023年12月认证C++八级真题解析

2023年12月真题 一、单选题(每题2分,共30分) 正确答案:C 考察知识点:数学问题 解析:本题可抽象为分类计数问题,应使用加法原理,而不是乘法原理。答案为 ACB 的方案数 2 加上 ADB 的…

vscode搭建git

vscode搭建git 一、安装git二、vscode上搭建git(1) 先创建本地仓库再上传到远程仓库,远程仓库名是根据本地仓库名一致(2) 先创建远程仓库,再将本地仓库上传到指定远程仓库 一、安装git 网络教程很多,在此就不赘述了 参考:git安装…

解决Mac安装软件的“已损坏,无法打开。 您应该将它移到废纸篓”问题

mac安装软件时,如果出现这个问题,其实很简单 首先打开终端,输入下面的命令 sudo xattr -r -d com.apple.quarantine 输入完成后,先不要回车,点击访达--应用程序--找到你无法打开的app图标,拖到终端窗口中…

ChatGPT-4o和ChatGPT-4o mini的差异点

在人工智能领域,OpenAI再次引领创新潮流,近日正式发布了其最新模型——ChatGPT-4o及其经济实惠的小型版本ChatGPT-4o Mini。这两款模型虽同属于ChatGPT系列,但在性能、应用场景及成本上展现出显著的差异。本文将通过图文并茂的方式&#xff0…

读书笔记--分布式架构的异步化和缓存技术原理及应用场景

本篇是在上一篇的基础上,主要对分布式应用架构下的异步化机制和缓存技术进行学习,主要记录和思考如下,供大家学习参考。大家知道原来传统的单一WAR应用中,由于所有数据都在同一个数据库中,因此事务问题一般借助数据库事…

BUU10 [极客大挑战 2019]LoveSQL1

万能用户名(密码随便) 登录进去以后发现是这个东西,然而并没有什么卵用 然后就开始爆破数据库名字--表名--列名 注意:这道题需要将所有的表名都爆出来,需要在payload里头写 group_concat(),否则页面只会显…

tomcat核心组件及原理概述

目录 1. tomcat概述 1.1 概念 1.2 官网地址 2. 基本使用 2.1下载 3. 整体架构 3.1 核心组件 3.2 从web.xml配置和模块对应角度 3.3 如何处理请求 4. 配置JVM参数 5. 附录 1. tomcat概述 1.1 概念 什么是tomcat Tomcat是一个开源、免费、轻量级的Web服务器。 Tomca…

冰蝎v4.0.5 来啦

webshell始终是渗透测试的热门,上次护网写冰蝎检测规则,加密流量,有点压力,今天终于有空来复现一下,我知道玩知乎的大佬很多,轻一点喷,学习新知识不丢人~ ailx10 1949 次咨询 4.9 …

【C++】B2120 单词的长度

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述💯我的做法代码实现:思路解析: 💯老师的第一种做法代码实现:思路解析: 💯老师的…

使用线性回归模型逼近目标模型 | PyTorch 深度学习实战

前一篇文章,计算图 Compute Graph 和自动求导 Autograd | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 使用线性回归模型逼近目标模型 什么是回归什么是线性回归使用 PyTorch 实现线性回归模型代码执行结…

深入浅出:频谱掩码 Spectral Masking —— 噪音消除利器

在语音处理领域,噪声是一个常见的敌人。无论是语音通话、语音识别,还是语音合成,噪声都会大大降低语音的质量和可理解性。为了解决这个问题,Spectral Masking(频谱掩码) 模型应运而生。它通过从带噪信号的频…

C++ Primer 多维数组

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…

Mac M1 ComfyUI 中 AnyText插件安装问题汇总?

Q1:NameError: name ‘PreTrainedTokenizer’ is not defined ? 该项目最近更新日期为2024年12月,该时间段的transformers 版本由PyPI 上的 transformers 页面 可知为4.47.1. A1: transformers 版本不满足要求,必须降级transformors &#…

C++基础(2)

目录 1. 引用 1.1 引用的概念和定义 1.2 引用的特性 1.3 引用的使用 2. 常引用 3. 指针和引用的关系 4. 内联函数inline 5. nullptr 1. 引用 1.1 引用的概念和定义 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开…