python日志处理logging

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()默认会创建一个屏幕流句柄。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入解析“legit”的地道用法——从俚语到正式表达:Sam Altman用来形容DeepSeek: legit invigorating(真的令人振奋)

深入解析“legit”的地道用法——从俚语到正式表达 一、引言 在社交媒体、科技圈甚至日常对话中,我们经常会看到或听到“legit”这个词。比如最近 Sam Altman 在 X(原 Twitter)上发的一条帖子中写道: we will obviously deliver …

物联网领域的MQTT协议,优势和应用场景

MQTT(Message Queuing Telemetry Transport)作为轻量级发布/订阅协议,凭借其低带宽消耗、低功耗与高扩展性,已成为物联网通信的事实标准。其核心优势包括:基于TCP/IP的异步通信机制、支持QoS(服务质量&…

【Hadoop】Hadoop的HDFS

这里写目录标题 HDFS概述HDFS产出背景及定义HDFS产生背景HDFS定义 HDFS优缺点HDFS优点HDFS缺点 HDFS组成架构HDFS文件块大小 HDFS的Shell操作常用命令实操准备工作上传下载HDFS直接操作 HDFS的API操作客户端环境准备HDFS的API案例实操HDFS文件上传HDFS文件下载HDFS文件更名和移…

二、面向对象

一、结构体类型 结构体类型是一种自定义类型&#xff0c;用于创建我们游戏或者实际业务中的自定义类型. 代码中变量有通用的&#xff0c;可以使用结构体&#xff0c;包裹起来。 1、成员变量 /// <summary> /// 英雄结构体 /// </summary> struct Hero {//成员p…

基于机器学习的布伦特原油价格的分析与研究

项目&#xff1a;基于机器学习的布伦特原油价格的分析与研究 摘 要 布伦特原油期货及现货市场所构成的布伦特原油定价体系&#xff0c;最多时竟涵盖了世界原油交易量的80%&#xff0c;即使在纽约原油价格日益重要的今天&#xff0c;全球仍有约65%的原油交易量&#xff0c;是以…

excel实用问题:提取文字当中的数字进行运算

0、前言&#xff1a; 这里汇总在使用excel工作过程中遇到的问题&#xff0c;excel使用wps版本&#xff0c;小规模数据我们自己提取数据可行&#xff0c;大规模数据就有些难受了&#xff0c;因此就产生了如下处理办法。 需求&#xff1a;需要把所有文字当中的数字提取出来&…

贝叶斯-概率

起点&#xff1a;玩猜硬币游戏中发现贝叶斯定理貌似有很强的预测功能&#xff0c;细看还真有那么回事&#xff0c;因此研究研究。当然&#xff0c;看起来学精后不止可用来猜硬币&#xff0c;也可猜其它玩艺。 贝叶斯统计的基础是贝叶斯定理&#xff0c;贝叶斯定理的基础是条件…

信息安全专业2025最新毕业设计选题汇总:课题精选

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光&#xff0c;一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理…

[LeetCode]day13 19.删除链表的倒数第n个结点

19. 删除链表的倒数第 N 个结点 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&a…

2024年终总结来了

忘记发CSDN的年度总结了&#xff0c;今天补上吧 说实话&#xff0c;今年过得不是特别好&#xff0c;感觉遇到了瓶颈&#xff0c;人生变得迷茫起来。不知道大家有没有同样的感受 刚毕业的时候人生充满了憧憬&#xff0c;慢慢的随着年龄变大后&#xff0c;就会觉得一事无成&…

Haproxy+keepalived高可用集群,haproxy宕机的解决方案

Haproxykeepalived高可用集群&#xff0c;允许keepalived宕机&#xff0c;允许后端真实服务器宕机&#xff0c;但是不允许haproxy宕机&#xff0c; 所以下面就是解决方案 keepalived配置高可用检测脚本 &#xff0c;master和backup都要添加 配置脚本 # vim /etc/keepalived…

树莓派pico入坑笔记,故障解决:请求 USB 设备描述符失败,故障码(43)

今天心血来潮&#xff0c;拿出吃灰的pico把玩一下&#xff0c;打开thonny&#xff0c;上电&#xff0c;然后...... 上电识别不到端口&#xff0c;windows报错&#xff0c;请求 USB 设备描述符失败&#xff0c;故障码&#xff08;43&#xff09; 一开始以为是坏了&#xff08;磕…

从Transformer到世界模型:AGI核心架构演进

文章目录 引言:架构革命推动AGI进化一、Transformer:重新定义序列建模1.1 注意力机制的革命性突破1.2 从NLP到跨模态演进1.3 规模扩展的黄金定律二、通向世界模型的关键跃迁2.1 从语言模型到认知架构2.2 世界模型的核心特征2.3 混合架构的突破三、构建世界模型的技术路径3.1 …

2025年01月25日Github流行趋势

项目名称&#xff1a;it-tools 项目地址url&#xff1a;https://github.com/CorentinTh/it-tools项目语言&#xff1a;Vue历史star数&#xff1a;25298今日star数&#xff1a;212项目维护者&#xff1a;CorentinTh, apps/renovate, cgoIT, sharevb, marvin-j97项目简介&#xf…

鸿蒙Harmony-双向数据绑定MVVM以及$$语法糖介绍

鸿蒙Harmony-双向数据绑定MVVM以及$$语法糖介绍 1.1 双向数据绑定概念 在鸿蒙&#xff08;HarmonyOS&#xff09;应用开发中&#xff0c;双向数据改变&#xff08;或双向数据绑定&#xff09;是一种让数据模型和UI组件之间保持同步的机制&#xff0c;当数据发生变化时&#x…

【DeepSeek背后的技术】系列二:大模型知识蒸馏(Knowledge Distillation)

目录 1 引言2 操作步骤和公式说明2.1 准备教师模型&#xff08;Teacher Model&#xff09;和学生模型&#xff08;Student Model&#xff09;2.2 生成软标签&#xff08;Soft Labels&#xff09;2.3 定义蒸馏损失函数2.4 训练学生模型2.5 调整超参数2.6 评估与部署 3 其他知识蒸…

【BUUCTF杂项题】后门查杀、webshell后门

前言&#xff1a;Webshell 本质上是一段可在 Web 服务器上执行的脚本代码&#xff0c;通常以文件形式存在于 Web 服务器的网站目录中。黑客通过利用 Web 应用程序的漏洞&#xff0c;如 SQL 注入、文件上传漏洞、命令执行漏洞等&#xff0c;将 Webshell 脚本上传到服务器&#x…

SPI(Serial Peripheral Interface)串行外围设备接口

SPI概述&#xff1a; SPI协议最初由Motorola公司&#xff08;现为NXP Semiconductors的一部分&#xff09;在20世纪80年代中期开发。最初是为了在其68000系列微控制器中实现高速、高效的串行通信。该协议旨在简化微控制器与外围设备之间的数据传输。 1980年代&#xff1a;SPI协…

深度学习 Pytorch 基础网络手动搭建与快速实现

为了方便后续练习的展开&#xff0c;我们尝试自己创建一个数据生成器&#xff0c;用于自主生成一些符合某些条件、具备某些特性的数据集。 导入相关的包 # 随机模块 import random# 绘图模块 import matplotlib as mpl import matplotlib.pyplot as plt# 导入numpy import nu…

10分钟快速上手DeepSeek!

DeepSeek 是一款基于命令行和配置文件的数据处理工具&#xff0c;支持多种数据格式&#xff08;如 CSV、JSON、SQL 等&#xff09;和多种数据源&#xff08;如本地文件、数据库、API 等&#xff09;。 它的核心功能包括&#xff1a; 数据导入与导出&#xff1a;支持从多种数据…