Python 自定义日志输出

Python 有着内置的日志输出模块:logging   使用也很方便,但我们今天不说这个,我们用文件读写模块,实现自己的日志输出模块;这样在项目中,可以存在更高的自由度及更高的扩展性;

先来看看日志输出的文件效果:根目录 \Logs\    按日期输出 \2024-04-28\  按日志类型输出txt文件

日志类型可自定义

首先定义 Log基类 :LogRecord


class LogRecord:#初始化日志模块def __init__(self):self._total_log_dic = {} #字典项用来保存 日志类型:日志内容self._log_path = os.path.join(os.getcwd(), "LogRecord") #日志输出路径self._locker = threading.Lock() #线程锁self.create_auto_save_thread() #创建自定运行的线程#创建自定运行的线程def create_auto_save_thread(self):def auto_save():while True:self.write_in_txt_once() #将缓存字典中的日志信息都输出到文件中threading.Event().wait(3)#定义线程运行auto_save方法thread = threading.Thread(target=auto_save)thread.daemon = Truethread.start()#设置日志输出根目录,保存的日志文件目录数-多出的会被删除def set_log_path(self, path, remain_count=7):self._log_path = pathself._remain_count = remain_count#添加日志信息到缓存字典中def record(self, logt, content):if logt not in self._total_log_dic:self._total_log_dic[logt] = deque()self._total_log_dic[logt].append(f"\r\n【{datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')}】:{content}")#将缓存字典中的数据,输出到日志文件中def write_in_txt_once(self):with self._locker:for item in self._total_log_dic:if len(self._total_log_dic[item]) == 0:continuequeue = self._total_log_dic[item]v_list = []while len(queue) > 0:v_list.append(queue.popleft())if len(v_list) > 0:self.write_in_txt(v_list, item)#写文件的操作方法def write_in_txt(self, logs, logs_name):if not hasattr(self, "is_deleted") or not self.is_deleted:try:self.delete_director(self._log_path, self._remain_count)except:passself.is_deleted = Truetry:directory_name = datetime.now().strftime("%Y-%m-%d")log_path = os.path.join(self._log_path, directory_name)if not os.path.exists(log_path):os.makedirs(log_path)single_path = os.path.join(log_path, f"{logs_name}.txt")with open(single_path, "a", encoding="utf-8") as f:for line in logs:f.write(line + "")except:pass#删除保存天数外的目录文件def delete_director(self, path, remain_count):if not os.path.exists(path):returndirs = [d for d in os.listdir(path) if os.path.isdir(os.path.join(path, d))]if len(dirs) > remain_count:for i in range(len(dirs) - remain_count):shutil.rmtree(os.path.join(path, dirs[i]))#强制触发将缓存字典中的数据写入到日志文件中def save(self):self.write_in_txt_once()

接下来对LogRecord基类进行一次的封装:LogHelper

#对LogRecord基类进行一次的封装
class LogHelper:def __init__(self):self.log_helper = LogRecord()#初始化日志模块,输出根目录,保存天数等def set_path(self, path, remain_count=7):self.log_helper.set_log_path(path, remain_count)#添加日志记录到缓存字典def record(self, logt, content):self.log_helper.record(logt, content)#将缓存字典中的日志信息都输出到文件中def save(self):self.log_helper.save()

定义 日志类型:LogType

#日志类型-也对应相应的文件名
class LogType:Send = "Send"Info = "Info"Error = "Error"Click = "Click"Start = "Start"Web = "Web"Debug = "Debug"

接下来就对在代码中使用的输出模块进行功能定义: LogOperateBase

import osclass LogOperateBase:cur_process_id = -1_default_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "Logs")_log_helper = LogHelper()@staticmethoddef init_log(id, path="", remain_count=7):LogOperateBase.cur_process_id = idif not path:path = LogOperateBase._default_pathLogOperateBase._log_helper.set_path(path, remain_count)@staticmethoddef save():LogOperateBase._log_helper.save()

最后定义日志输出类,即代码中实际使用的对象:LogOperate


import traceback
from Modules.Tools.Logs import LogHelper,LogType
from Modules.Tools.LogOperateBase import LogOperateBaseclass LogOperate(LogOperateBase):@staticmethoddef debug(content):if __debug__:LogOperateBase._log_helper.record(LogType.Debug, content)@staticmethoddef info(message):LogOperateBase._log_helper.record(LogType.Info, message)@staticmethoddef web(message):LogOperateBase._log_helper.record(LogType.Web, message)@staticmethoddef start(message):LogOperateBase._log_helper.record(logt=LogType.Start,content= f"【{LogOperateBase.cur_process_id}】{message}")@staticmethoddef error_msg(message):LogOperateBase._log_helper.record(LogType.Error, message)@staticmethoddef error(message, ex):try:log = f"{message}\r\n{ex.__class__.__name__}{str(ex)}\r\n{traceback.format_exc()}\r\n-----------------------------------------------------------------------"LogOperateBase._log_helper.record(LogType.Error, log)except:pass@staticmethoddef send_log(message):LogOperateBase._log_helper.record(LogType.Send, message)@staticmethoddef click_log(message):LogOperateBase._log_helper.record(LogType.Click, message)@staticmethoddef general(log_type, message):LogOperateBase._log_helper.record(log_type, message)

最后就能在代码中这样使用了:

    LogOperate.init_log(os.getpid(),Config.log_path)LogOperate.start("开始启动程序")LogOperate.info("开始启动程序")LogOperate.web("开始启动程序")LogOperate.click_log("开始启动程序")LogOperate.debug("开始启动程序")LogOperate.error_msg("开始启动程序")LogOperate.send_log("开始启动程序")LogOperate.start("开始启动程序1")LogOperate.info("开始启动程序1")LogOperate.web("开始启动程序1")LogOperate.click_log("开始启动程序1")LogOperate.debug("开始启动程序1")LogOperate.error_msg("开始启动程序1")LogOperate.send_log("开始启动程序1")LogOperate.save()

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

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

相关文章

TDengine高可用架构之TDengine+Keepalived

之前在《TDengine高可用探讨》提到过,TDengine通过多副本和多节点能够保证数据库集群的高可用。单对于应用端来说,如果使用原生连接方式(taosc)还好,当一个节点下线,应用不会受到影响;但如果使用…

探索AI作画算法的原理:从深度学习到创造性艺术

引言 介绍AI在不同领域的应用,以及AI作画算法对于创造性艺术的影响。概述将在本文中讨论的主要内容。 第一部分:深度学习与计算机视觉 深度学习的基本原理:神经网络的结构和训练过程。计算机视觉的重要性:图像识别、生成和处理…

Python爬虫--Scrapy框架安装

Scrapy框架安装 , Scrapy 是 Python 领域专业的爬虫开发框架,已经完成爬虫程序的大部分通用工具 它使用了 Twisted 异步网络库来处理网络通讯。整体架构大致如下 第一步:挂小灰机或者将要安装的文件下载到本地 Scrapy 框架安装踩坑中 为什…

Blender曲线操作

1.几种常见建模方式 -多边形建模:Blender,C4D,3DsMax,MaYa -曲线: -曲面:Rhino(Nurbs) -雕刻:Blender,ZBrush -蜡笔:Blender 1)新…

【办公类-22-14】周计划系列(5-6)“周计划-06 19周的周计划教案合并打印PDF(最终打印版))

背景需求: 花了十周,终于把周计划教案的文字都写满、加粗、节日替换了。为了便于打印,我把19周的周计划教案全部合并在一起PDF。制作打印用PDF 思路 1、周计划是单独打印一张,因此要在第2页插入空白页, 2、教案有3页…

鸿蒙launcher浅析

鸿蒙launcher浅析 鸿蒙launcher源码下载鸿蒙launcher模块launcher和普通的应用ui展示的区别 鸿蒙launcher源码下载 下载地址如下: https://gitee.com/openharmony/applications_launcher 鸿蒙launcher模块 下载页面已经有相关文件结构的介绍了 使用鸿蒙编辑器D…

CMDB系统的目标

CMDB即配置管理数据库(Configuration Management Database, CMDB)系统被广泛应用于实现IT资产管理和IT服务管理。CMDB系统的目标是建立一个全面的、精确的信息数据库,用于追踪、管理和记录IT基础设施的配置信息及其相关关系,从而提…

Spring Cloud Gateway直接管理Vue.js的静态资源

1. 构建Vue.js应用 像之前一样,构建你的Vue.js应用,并将生成的静态资源(位于dist目录)复制到Spring Boot项目的某个目录,比如src/main/resources/static。 2. 配置Spring Boot静态资源处理 Spring Boot默认会处理sr…

linux文件夹映射到本地win系统

在Linux上安装和配置Samba服务器相对简单,以下是基本的步骤: 1. **安装Samba软件包**:使用你的Linux发行版的包管理器来安装Samba软件包。例如,在基于Debian的发行版(如Ubuntu)上,你可以使用以…

OpenHarmony开发实例:【电话簿联系人Contacts】

样例简介 Contacts应用是基于OpenHarmony SDK开发的安装在润和HiSpark Taurus AI Camera(Hi3516d)开发板标准系统上的应用;应用主要功能是展示联系人列表,并点击某一列弹出联系人详细信息; 运行效果 样例原理 样例主要有一个list组件和dia…

Docker本地部署overleaf后,挖掘用户加密逻辑

overleaf的用户信息,保存在mongo数据库的users集合中。 用户密码则存在hashedPassword字段中 从开源的代码services\web\app\src\Features\Authentication\AuthenticationManager.js第303行可以找到密码加密逻辑。 本地可以通过下面的代码生成overleaf用户密码信息…

如何在每天特定的时间打开指定的网页?教你设置每天自动打开指定网页

在现代社会,互联网已成为我们日常生活和工作中不可或缺的一部分。随着科技的 发展,我们可以利用各种工具和技术来提高我们的工作效率和生活品质。其中,定 时自动打开指定的网址便是一个实用的功能,它可以帮助我们节省时间&#xf…

从零开始搭建SpringCloud

从零开始搭建Spring Cloud涉及到多个步骤和组件的配置。以下是一个大致的指南,帮助你逐步搭建Spring Cloud环境: 安装Java开发环境: 安装JDK(Java开发工具包)并确保环境变量配置正确。选择一个合适的IDE(集…

【element-ui】el-table横向滚动后,通过is-scrolling-left获取滚动高度失效的问题

el-table横向滚动后,通过is-scrolling-left获取滚动高度失效的问题 需求 现在有一个需求,需要监听el-table的纵向滚动,当滚动高度达到特定值时进行一些操作。 代码如下: methods:{throttledHandleScroll() {// 如果已经有定时器…

百万人都在求的网络安全学习路线,渗透漏洞防御总结(附图)

前言 不折腾的网络安全,和咸鱼有什么区别 目录 二、 前言三 、同源策略 3.1 什么是同源策略 3.2 为什么需要同源策略四 、XSS 4.1 概览 4.2 介绍 4.3 防御五 、CSRF 5.1 概览 5.2 介绍 5.3 防御六、 SQL 注入七 、流量劫持 7.1 DNS 劫持 7.2 HTTP 劫持…

【Canvas与艺术】 绘制五星红旗

【注意】 该图中五星定位和大小都是按 https://www.douyin.com/note/7149362345016380710 精确绘制的。 【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8&q…

秋招后端开发面试题 - Java IO

目录 Java IO前言面试题Java IO 流&#xff1f;字节流 vs 字符流区别&#xff1f;字节缓冲流 vs 字符缓冲流&#xff1f;打印流&#xff1f;System.out.println() 是什么&#xff1f;随机访问流&#xff1f;管道流&#xff1f;讲讲 Filter 流&#xff1f;常见的 IO 模型&#x…

【前端】6. JavaScript(WebAPI)

WebAPI 背景知识 什么是 WebAPI 前面学习的 JS 分成三个大的部分 ECMAScript: 基础语法部分DOM API: 操作页面结构BOM API: 操作浏览器 WebAPI 就包含了 DOM BOM. 这个是 W3C 组织规定的. (和制定 ECMAScript 标准的大佬们不是一伙人). 前面学的 JS 基础语法主要学的是 EC…

【多维动态规划】Leetcode 64. 最小路径和【中等】

最小路径和 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 示例 1&#xff1a; 输入&#xff1a;grid [[1,3,1],[1,5,1],[4,2,1]] 输出…

手动在Ubuntu22.04上部署LAMP环境

简介 LAMP环境是常用的Web开发环境之一&#xff0c;其中LAMP分别代表Linux、Apache、MySQL和PHP。本文介绍如何在Ubuntu操作系统的ECS实例内部署LAMP环境。 准备工作 该实例必须满足以下条件&#xff1a; 实例已分配公网IP地址或绑定弹性公网IP&#xff08;EIP&#xff09;。…