使用 Python 的 `logging` 模块实现自定义日志记录

在软件开发中,日志记录是一个至关重要的功能。它可以帮助我们追踪应用程序的运行状态、捕获错误信息以及调试程序。Python 提供了强大的 logging 模块,使得我们能够灵活地进行日志管理。本文将介绍如何通过自定义日志记录器来实现按天切分日志文件的功能,并将日志同时输出到控制台和文件中。

1. 环境准备

首先,确保你的 Python 环境已经配置好。接下来,我们将创建一个名为 CustomLogger 的类,该类将封装日志记录的相关功能。

2. 创建 CustomLogger

以下是 CustomLogger 类的完整代码:

import os
import logging
# TimedRotatingFileHandler 处理器允许按时间切分日志文件,用来每天生成一个新的日志文件
from logging.handlers import TimedRotatingFileHandlerclass CustomLogger:def __init__(self, log_dir='logs', log_name='app.log', level=logging.DEBUG):self.log_dir = log_dirself.log_name = log_nameself.level = level# 创建日志目录if not os.path.exists(self.log_dir):os.makedirs(self.log_dir)# 设置日志格式"""logging.Formatter 设置日志的输出格式%(asctime)s: 日志记录的时间。%(levelname)s: 日志级别(如INFO、ERROR等)。%(message)s: 日志内容。"""formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')# 创建控制台处理器"""StreamHandler 用于将日志输出到控制台setLevel 设置该处理器的日志级别,这样可以空值哪些级别的日志会被输出到控制台setFormatter 之前定义的格式应用于此处理器,以确保输出格式一致"""console_handler = logging.StreamHandler()console_handler.setLevel(self.level)console_handler.setFormatter(formatter)# 创建文件处理器,按天切分日志文件"""filename 指定完整的日志文件路径when 设置在午夜时切换到新的日志文件interval 每隔一天切换一次backupCount 如果值为0,则保存所有的日志encoding 设置文件的编码格式"""file_handler = TimedRotatingFileHandler(filename=os.path.join(self.log_dir, self.log_name),when='midnight',interval=1,backupCount=15,encoding='utf-8')file_handler.setFormatter(formatter)# 创建logger并添加处理器"""使用 getLogger() 方法创建一个名为 'CustomLogger' 的logger实例。用于获取一个日志记录器logger对象。参数CustomLogger就是记录器的名称如果指定的名称已经存在,则返回同名的记录器实例;如果不存在,则创建一个新的记录器实例。这样可以确保在整个应用程序中使用相同名称的日志记录器会共享一个实例使用 setLevel() 设置logger的级别,以控制其输出的最低级别。使用 addHandler() 方法将之前创建的控制台和文件处理器添加到logger中,这样logger就能同时向这两个目标输出日志。"""self.logger = logging.getLogger('CustomLogger')self.logger.setLevel(self.level)self.logger.addHandler(console_handler)self.logger.addHandler(file_handler)def get_logger(self):return self.logger# 使用示例
if __name__ == "__main__":logger = CustomLogger().get_logger()logger.info('This is an info message.')logger.error('This is an error message.')

代码解析

  1. 导入模块
    首先导入必要的模块,包括 osloggingTimedRotatingFileHandler

  2. 初始化日志记录器
    __init__ 方法中,定义了日志目录、日志文件名和日志级别。通过检查目录是否存在,若不存在则创建它。

  3. 设置日志格式
    使用 logging.Formatter 定义了日志的输出格式,包括时间戳、日志级别和日志内容。

  4. 创建控制台处理器
    使用 StreamHandler 创建控制台处理器,设置日志级别和格式,确保输出到控制台的日志符合预期。

  5. 创建文件处理器
    使用 TimedRotatingFileHandler 创建文件处理器,实现按天切分日志文件,保存最近 15 个日志文件。

  6. 设置 logger
    使用 getLogger 创建一个名为 'CustomLogger' 的 logger 实例,并添加之前创建的处理器。

  7. 获取日志实例
    提供一个 get_logger 方法来获取 logger 实例,方便在其他模块中调用。

3. 使用示例

__main__ 块中,我们实例化 CustomLogger 并记录了一条信息和一条错误日志。这些日志将被输出到控制台,同时也会保存在指定的日志文件中。

4. 总结

通过使用 Python 的 logging 模块和自定义日志记录器,我们可以方便地管理应用程序的日志记录。以上代码示例展示了如何实现按天切分日志文件的功能,并将日志信息输出到控制台和文件中。这种方法不仅使日志管理变得简单,同时也提高了日志的可读性和可追踪性。

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

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

相关文章

聊聊Web3D 发展趋势

随着 Web 技术的不断演进,Web3D 正逐渐成为各行业数字化的重要方向。Web3D 是指在网页中展示 3D 内容的技术集合。近年来,由于 WebGL、WebGPU 等技术的发展,3D 内容已经能够直接在浏览器中渲染,为用户提供更加沉浸、互动的体验。以…

【传知代码】图像处理解决种子计数方法

文章目录 一、背景及意义介绍研究背景农业考种需求传统计数方法的局限性人工计数仪器设备计数 研究意义提高育种效率提高计数准确性广泛的适用性数据存档与分析便利 二、概述三、材料与数据准备以及方法介绍整体流程图像采集图像预处理形态学操作腐蚀运算开运算 图像二值化种子…

uniapp开发【点击展示弹窗功能】

一、效果展示 二、代码 <template><view class="mini"><view class="block_item" @click="$refs.popup.op

centos7.X zabbix监控参数以及邮件报警和钉钉报警

1&#xff1a;zabbix安装 1.1 zabbix 环境要求 硬件配置: 2个CPU核心, 4G 内存, 50G 硬盘&#xff08;最低&#xff09; 操作系统: Linux centos7.2 x86_64 Python 2.7.x Mariadb Server ≥ 5.5.56 httpd-2.4.6-93.el7.centos.x86_64 PHP 5.4.161.2 zabbix安装版本 [rootnod…

根据输入的详细地址解析经纬度

摘要&#xff1a; 今天遇到一个需求&#xff1a;就是做客户导入的时候因为导入的客户地址的时候没有经纬度的&#xff0c;但是同步的时候需要经纬度的&#xff0c;所以还是要根据客户提供的详细地址解析出来对应的经纬度&#xff01;回填到对应的经纬度的表单之中进行客户的同步…

upload-labs靶场Pass-21

upload-labs靶场Pass-21 本关上传方法众多&#xff0c;但是应该考察的是数组后缀绕过&#xff0c;所以我的上传围绕此展开 1.分析源码 $is_upload false; // 初始化上传状态为false $msg null; // 初始化消息变量为null// 检查是否有文件上传 if(!empty($_FILES[upload_fi…

Flutter实战短视频课程

1、课程导学 一套代研运行多蜡 体州一致&#xff0c;目胜能优昇 未来大趋势 不改交原生项目的基础上&#xff0c;扩展Flutter能力 Flutter原生灵话切涣 0入侵 最简单、最通用 最新Flutter 3,x新特性讲解 大量flutter官方组件和api学习 最常用的第三方库使用及原理解析 自研组…

Python中的数据可视化:Matplotlib基础与高级技巧

Python中的数据可视化&#xff1a;Matplotlib基础与高级技巧 数据可视化是数据分析和数据科学中不可或缺的一部分。通过图表&#xff0c;我们可以更直观地观察数据的分布和趋势。Matplotlib作为Python最基础、也是最广泛使用的绘图库之一&#xff0c;不仅支持多种常用图表&…

无人机避障——使用三维PCD点云生成的2D栅格地图PGM做路径规划

着重介绍通过对三维 PCD 点云进行处理生成 2D 栅格地图 PGM&#xff0c;而后将该 PGM 地图充分运用到无人系统路径规划之中&#xff0c;使得无人机能够依据此规划合理避开飞行路线上可能出现的障碍物。&#xff08;解决如何使用PGM的问题&#xff09; Hybrid A*算法 参考博客…

线性代数(1)——线性方程组的几何意义

线性代数的基本问题是求解个未知数的个线性方程&#xff1b; 例如&#xff1a;&#xff08;方程1&#xff09;。 在线性代数的第一讲中&#xff0c;我们从Row Picture、Column Picture、Matrix Picture三个角度来看这个问题。 上面的系统是二维的。通过添加第三个变量&#…

浮动+flex布局

一.浮动 1.介绍 2.效果 <style> .one{ width: 100px; height: 100px; background-color: red; float: left; } .two{ width: 200px; height: 200px; background-color: blue; float: right; } </style> </head> <body> <div class"one&quo…

没有对象来和我手撕红黑树吧

1. 红黑树的介绍 红黑树也是一种自平衡的二叉搜索树&#xff0c;在每一个节点增加了一个存储位来表示节点的颜色&#xff0c;可以是红色也可以是黑色&#xff0c;通过约束颜色来维持树的平衡&#xff0c;具有以下的性质&#xff1a; 每个节点不是红色就是黑色根节点为黑色如果…

深入理解gPTP时间同步过程

泛化精确时间协议(gPTP)是一个用于实现精确时间同步的协议,特别适用于分布式系统中需要高度协调的操作,比如汽车电子、工业自动化等。 gPTP通过同步主节点(Time Master)和从节点(Time Slave)的时钟,实现全局一致的时间参考。 以下是gPTP实现主从时间同步的详细过程:…

rom定制系列------红米note8_miui14安卓13定制修改固件 带面具root权限 刷写以及界面预览

&#x1f49d;&#x1f49d;&#x1f49d;红米note8机型代码&#xff1a;ginkgo。高通芯片。此固件官方最终版为稳定版12.5.5安卓11的版本。目前很多工作室需要高安卓版本的固件来适应他们的软件。并且需要root权限。根据客户要求。修改固件为完全root。并且修改为可批量刷写的…

MicroServer Gen8再玩 OCP万兆光口+IT直通之二

这个接上一篇&#xff0c;来个简单测试。 一、测试环境 PC端&#xff1a;Win10&#xff0c;网卡&#xff1a;万兆光纤&#xff08;做都做了&#xff0c;都给接上&#xff09;&#xff0c;硬盘使用N年的三星SSD 840 交换机&#xff1a;磊科GS10&#xff0c;带两个万兆口 Gen…

怎么理解ES6 Proxy

Proxy 可以理解成&#xff0c;在目标对象之前架设一层 “拦截”&#xff0c;外界对该对象的访问&#xff0c;都必须先通过这层拦截&#xff0c;因此提供了一种机制&#xff0c;可以对外界的访问进行过滤和改写。Proxy 这个词的原意是代理&#xff0c;用在这里表示由它来 “代理…

揭秘代码界的新挑战:低代码平台,为何让程序员头疼不已?

我最近在网上看到一个很有趣的话题&#xff1a;为什么程序员大多讨厌低代码&#xff1f;好家伙&#xff0c;这一下子就将低代码推到了程序员的对立面&#xff0c;两者直接到了水火不容的地步。 其实低代码倒也不是什么新鲜事物&#xff0c;它是一种只需用很少甚至不需要代码即可…

APP如何提升关键词排名?

提升关键词排名是ASO&#xff08;App Store Optimization&#xff09;策略中的关键环节&#xff0c;以下是一些有效的方法来提高App在应用商店中的关键词排名&#xff1a; 1. **关键词研究**&#xff1a; - 使用专业的ASO工具进行关键词研究&#xff0c;找出与你的App相关且…

ClickHouse 3节点集群安装

ClickHouse 简介 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。 官方网站&#xff1a;https://clickhouse.com/ 项目地址&#xff1a;https://github.com/ClickHouse/ClickHouse 横向扩展集群介绍 此示例架构旨在提供可扩展性。它包括三个节点&#xff…

基于springboot的在线投票系统,比赛实时投票平台的实现

1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a;windows 7…