深入理解Python的logging模块:从基础到高级

在Python编程中,日志记录是一种重要的调试和错误追踪工具。Python的logging模块提供了一种灵活的框架,用于发出日志消息,这些消息可以被发送到各种输出源,如控制台、文件、HTTP GET/POST位置等。本文将深入探讨Python的logging模块,包括其基本用法、高级特性以及如何将其应用到实际项目中。

首先,我们来看一下logging模块的基本用法。logging模块的主要功能是提供一种灵活的框架,用于发出日志消息。这些消息可以被发送到各种输出源,如控制台、文件、HTTP GET/POST位置等。logging模块的核心是Logger类,它提供了应用程序可直接使用的接口。Logger实例化后,可以设置其日志级别(DEBUG, INFO, WARNING, ERROR, CRITICAL),并可以通过其方法来发出日志消息。

例如,以下是一个简单的logging模块的使用示例:

import logging# 创建一个logger
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log')
fh.setLevel(logging.DEBUG)# 定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)# 给logger添加handler
logger.addHandler(fh)# 记录一条日志
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')

在这个示例中,我们首先创建了一个名为’my_logger’的logger,并设置了其日志级别为DEBUG。然后,我们创建了一个handler,用于将日志消息写入到’test.log’文件中。我们还定义了handler的输出格式,包括时间戳、logger的名字、日志级别和日志消息。最后,我们将这个handler添加到logger中,并发出了几条不同级别的日志消息。

除了基本的用法,logging模块还提供了许多高级特性,如过滤器、格式化器、处理器等。过滤器可以根据日志消息的内容或级别来决定是否应该处理这条消息。格式化器可以定义日志消息的输出格式。处理器则负责将日志消息发送到指定的输出源。

例如,以下是如何使用过滤器和格式化器的示例:

import logging# 创建一个logger
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log')
fh.setLevel(logging.DEBUG)# 创建一个过滤器,只处理INFO级别及以上的日志消息
class MyFilter(logging.Filter):def filter(self, record):return record.levelno >= logging.INFO
filter = MyFilter()
fh.addFilter(filter)# 定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)# 给logger添加handler
logger.addHandler(fh)# 记录一条INFO级别的日志消息和一条DEBUG级别的日志消息
logger.info('This is an info message')
logger.debug('This is a debug message')  # 这条消息不会被处理,因为它的级别低于INFO

在这个示例中,我们首先创建了一个名为’my_logger’的logger,并设置了其日志级别为DEBUG。然后,我们创建了一个handler,用于将日志消息写入到’test.log’文件中。我们还创建了一个过滤器,只处理INFO级别及以上的日志消息。最后,我们将这个handler添加到logger中,并发出了两条不同级别的日志消息。由于我们的过滤器只处理INFO级别及以上的日志消息,所以DEBUG级别的日志消息不会被处理。

本专栏封装日志工具类供外部使用:

配置文件

BASE:log_level: "debug"fh_file_log_level: "debug"  #生产环境换成warninglog_extension: ".log"test:url: "http://119.3.246.198:64644"

配置文件调用代码更新

import os
from utils.YamlUtil import YamlReadercurrent = os.path.abspath(__file__)BASE_DIR = os.path.dirname(os.path.dirname(current))_config_path = BASE_DIR + os.sep + "config"
_config_file = _config_path + os.sep + 'conf.yml'_log_path = BASE_DIR + os.sep + "logs"
def get_config_path():return _config_pathdef get_config_file():return _config_filedef get_log_path():return _log_path
class ConfigYaml:def __init__(self):self.config = YamlReader(get_config_file()).data()def get_conf_url(self):return self.config['BASE']['test']['url']def get_conf_log_level(self):#获取日志级别return self.config['BASE']['log_level']def get_conf_fh_file_log_level(self):#获取日志文件级别return self.config['BASE']['fh_file_log_level']def get_conf_log_extension(self):#获取日志文件扩展名return self.config['BASE']['log_extension']

日志工具类封装

import logging
import datetime,os
from config import Conf
from config.Conf import ConfigYamllog_levels = {"info": logging.INFO,"debug": logging.DEBUG,"warning": logging.WARNING,"error": logging.ERROR,
}class Logger:def __init__(self, log_file, log_name, log_level, fh_file_log_level):self.log_file = log_fileself.log_name = log_nameself.log_level = log_levelself.fh_file_log_level = fh_file_log_levelself.logger = logging.getLogger(self.log_name)self.logger.setLevel(log_levels[self.log_level])if not self.logger.handlers:fh_stream = logging.StreamHandler()fh_stream.setLevel(log_levels[self.log_level])formatter = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s')fh_stream.setFormatter(formatter)fh_file = logging.FileHandler(self.log_file,encoding='utf-8')  #注意,此处不写encoding='utf-8',会出现导出日志中的中文乱码。fh_file.setLevel(log_levels[self.fh_file_log_level])fh_file.setFormatter(formatter)self.logger.addHandler(fh_stream)self.logger.addHandler(fh_file)log_path = Conf.get_log_path()
current_time = datetime.datetime.now().strftime("%Y-%m-%d")
conf_read = ConfigYaml()
log_extention = conf_read.get_conf_log_extension()
log_file =os.path.join(log_path,current_time+log_extention)
log_level = conf_read.get_conf_log_level()
fh_file_log_level = conf_read.get_conf_fh_file_log_level()def tester_log(log_name = __file__):return Logger(log_file=log_file, log_name=log_name, log_level=log_level, fh_file_log_level=fh_file_log_level).logger

这段代码是一个Python日志记录模块的实现。它使用了logging库来创建和管理日志记录器,并提供了自定义的日志级别和格式。

首先,导入了必要的模块:

  • logging:用于创建和管理日志记录器。
  • datetimeos:用于获取当前时间和构建文件路径。
  • ConfConfigYaml:从配置文件中读取配置信息。

然后,定义了一个名为Logger的类,用于创建和管理日志记录器。该类接受以下参数:

  • log_file:日志文件的路径。
  • log_name:日志记录器的名称。
  • log_level:日志记录器的级别。
  • fh_file_log_level:文件处理器的日志级别。

在类的构造函数中,首先根据传入的参数创建一个日志记录器对象,并设置其级别。然后,如果日志记录器没有处理程序(handler),则创建一个流处理器(StreamHandler)和一个文件处理器(FileHandler)。流处理器将日志输出到控制台,而文件处理器将日志写入指定的文件中。

接下来,定义了一些变量和常量:

  • log_path:日志文件所在的目录路径。
  • current_time:当前时间的字符串表示形式,格式为"YYYY-MM-DD"。
  • conf_read:一个ConfigYaml对象,用于读取配置文件中的配置信息。
  • log_extention:日志文件的扩展名。
  • log_file:完整的日志文件路径。
  • log_level:日志记录器的级别。
  • fh_file_log_level:文件处理器的日志级别。

最后,定义了一个名为tester_log的函数,用于创建并返回一个日志记录器对象。该函数接受一个可选参数log_name,默认值为当前文件的名称。

使用这个模块,你可以创建一个日志记录器对象,并通过调用其方法来记录不同级别的日志消息。例如,可以使用logger.info()logger.debug()logger.warning()logger.error()来记录不同级别的日志消息。

工具类应用

在requests封装类中对requests添加日志

import requests
from utils.LogUtil import tester_log
class Request:def __init__(self):self.log = tester_log()def requests_api(self, url, data=None, json=None, headers=None, cookies=None, method="get"):if method == "get":self.log.debug("发送get请求")r = requests.get(url, data=data, json=json, headers=headers, cookies=cookies)elif method == "post":self.log.debug("发送post请求")r = requests.post(url, data=data, json=json, headers=headers, cookies=cookies)code = r.status_codetry:body = r.json()except Exception as e:body = r.textres = dict()res["code"] = coderes["body"] = bodyreturn resdef get(self, url, **kwargs):return self.requests_api(url, method="get", **kwargs)def post(self, url, **kwargs):return self.requests_api(url, method="post", **kwargs)

调用效果

def login():conf_y = ConfigYaml()r = Request()url_path = conf_y.get_conf_url()url = url_path+'/prod-api/login'data = {"username":"test","password":"49e881218a48a363c35c5215fdc80d3f48d6a17ba0a1f9242c66aebc7ea29c626b26d7ef3bdae00ee9fde85bbf837dcce9f9e4e8f4371d74ff6eaf98ab53d7715996761ef56bff06461e74eb4b3f582949fb3b5281a89fc997a1de35f86a9aad35b87980dcf94e43191293"}res=r.requests_api(url,json=data,method="post")# r = requests.post(url,json=data)print(res)if __name__ == '__main__':login()

在这里插入图片描述在这里插入图片描述

总的来说,Python的logging模块提供了一种灵活的框架,用于发出日志消息。通过使用logging模块,我们可以方便地记录和管理程序的运行情况,从而更好地进行调试和错误追踪。虽然logging模块的基本用法相对简单,但其高级特性却非常强大,可以帮助我们更有效地使用日志记录。因此,对于任何使用Python进行开发的程序员来说,理解和掌握logging模块都是非常必要的。

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

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

相关文章

centos7安装java6_CentOS7.6安装jdk1.8

2、登录Linux服务器,通过rz命令将jdk导入服务器如果没有rz命令 需要先安装lrzszyum install lrzsz -y3、将jdk压缩包解压到指定路径 -C 指定路径4、配置环境变量编辑/etc/profile文件 在末尾加上以下内容 wq保存退出source /etc/profile文件 使配置文件生效export J…

人生苦短,我用python——当我在玩python的时候我玩些什么 -

程序的基本思路 用一个txt文件记录电脑的一天内累计使用时间累计使用时间超过若干小时就会自动关机程序开机自动运行 为什么我最后选择了python 想着怎么写、搜资料的时候就发现Java并不适合,虽然不是不能实现,但有好几个问题解决起来都有点麻烦。对我这…

Twisted入门教程(5)

2019独角兽企业重金招聘Python工程师标准>>> 第五部分:由Twited支持的诗歌下载服务客户端 你可以从这里从头开始阅读这个系列 抽象地构建客户端 在第四部分中,我们构建了第一个使用Twisted的客户端。它确实能很好地工作,但仍有提高…

**print('人生苦短 我爱Python')**

print(‘人生苦短 我爱Python’) 一、变量 **""" 1.代码自上而下执行 2_运算符和表达式.一行一句,不要把多个语句写到一行上,可读性不好 3中文只能出现在引号里,其他地方不能出现中文 4不能随意缩进 """**pr…

笔记本(华硕UL80VT)软件超频setFSB

Warning !!!If you are a beginner, do not use this software. This software is for power users only. Use "SetFSB.exe" at your own risk.试了setfsb各种版本,基本不能打开。还有官网的免费版,居然不能用,真是很奇怪。 官网&a…

Node.js~在linux上的部署

我们以centOS为例来说说如何部署node.js环境 一 打开centos,然后开始下载node.js包 curl --silent --location https://rpm.nodesource.com/setup_6.x | bash - yum -y install nodejs 二 安装gcc环境 yum install gcc-c make 安装完成! 三 安装nodejs的npm,这是一个包程序工具…

LeetCode题解-3-Longest Substring Without Repeating Characters

2019独角兽企业重金招聘Python工程师标准>>> 解题思路 首先要读懂题目,它要求的是找到最长的子串,并且子串中没有出现重复的字符。 我的想法,是用一个map存储每个字符最后出现的位置,还要有个变量start,它用…

java从哪学到哪_Java JVM怎么学习啊?从哪方面入手?

叮当猫咪一、 JVM的生命周期  1. JVM实例对应了一个独立运行的java程序它是进程级别  a) 启动。启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点  b) 运行。m…

JMeter处理Cookie与Session

cookie 和session 的区别: 1、cookie数据存放在客户的浏览器上,session数据放在服务器上。 2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 考虑到安全应当使用session。 3、session会在一定时间内保存在服务器上。当…

Maximum sum(poj 2479)

题意:给一段数列,将这个数列分成两部分,使两部分的最大子段和的和最大,输出和/*看数据没想到是(O)n的算法,求出从前向后的最大子段和和从后向前的最大子段和,然后枚举断点。 第一次提交不小心折在数组最小值…

蚂蚁分类信息系统 5.8 信息浏览量后台自定义设置

mymps 蚂蚁分类信息是一款基于PHPMySQL的建站系统,为在各种服务器上架设分类信息以及地方门户网站提供完美的解决方案. mymps5.8 下载 蚂蚁分类系统 5.8下载 蚂蚁分类系统下载 mymps下载 蚂蚁分类信息系统 5.8 原信息浏览量后台无法自定义,现增加后台自定义浏览量…

python编写四位数验证码

def verifycode(request):#引入绘图模块from PIL import Image, ImageDraw, ImageFont#引入随机函数模块import random#定义变量,用于画面的背景色、宽、高bgcolor (random.randrange(20, 100), random.randrange(20, 100), random.randrange(20, 100))width 100h…

php 计算数据偏离度,关于偏离度的测算方法

2015年6月技术总结——关于偏离度的测算方法研究院公用事业部 路璐引言《原理》中说“偏离度是指每一种偿债来源与财富创造能力的距离,所体现的是偿债来源对债务安全的保障程度,唯有通过揭示偿债来源与财富创造能力偏离度才能真正区别每一种偿债来源的风…

Django中celery配置总结

情景: 用户发起request,并等待response返回。在本些views中,可能需要执行一段耗时的程序,那么用户就会等待很长时间, 造成不好的用户体验,比如发送邮件、手机验证码等。 使用celery后,情况就不…

test.php.bak,MongoDB热备份工具:解决官方版备份缺陷

贺春旸,凡普金科DBA团队负责人,《MySQL管理之道:性能调优、高可用与监控》第一、二版作者,曾任职于中国移动飞信、安卓机锋网。致力于MariaDB、MongoDB等开源技术的研究,主要负责数据库性能调优、监控和架构设计。工具…

zookeeper工作原理、安装配置、工具命令简介

1 Zookeeper简介Zookeeper 是分布式服务框架,主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等等。 ZooKeeper是一个分布式的,开放源码的分布式应用程序…

流式大数据处理的三种框架:Storm,Spark和Samza

许多分布式计算系统都可以实时或接近实时地处理大数据流。本文将对三种Apache框架分别进行简单介绍,然后尝试快速、高度概述其异同。 Apache Storm 在Storm中,先要设计一个用于实时计算的图状结构,我们称之为拓扑(topology&#x…

linux_bash_shell_cheat_sheet(自译)

【说明】 发现错误或不足请务必联系我!!! linux_bash_shell_cheat_sheet.pdf (英文原本以及译本下载,链接失效请私信或邮箱联系) 转载于:https://www.cnblogs.com/15ho/p/5947534.html

热血街头Java,下载_我爱法语 V3.01 多国语言版_6z6z下载站

我爱法语是一款功能强大的法语电子词典工具。融合了法汉,汉法,法法,英法,法英,英汉,法意等各类词库。该工具使用灵活,操作简单,充分吸收了法汉、汉法、法法、英法、法英、英汉、法意…

BZOJ 1087 [SCOI2005]互不侵犯King ——状压DP

【题目分析】 沉迷水题&#xff0c;吃枣药丸。 【代码】 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define F(i,j,k) for (int ij;i<k;i) #define ll long long int cot[512],c1[512]…