python loguru 日志数据代码模块+飞书消息通知

前提:

之前python文件输出日志到文件的时候,使用logging模块,发现特别麻烦,需要文件日期切分,异步打印日志,文件留存时间,这些功能的实现就很麻烦,都需要自己写,之后发现有loguru第三方库,觉得使用很方便,代码量很少,可用性极高`


代码模块:

base_log.py 日志输出文件封装class

# # -*- coding: utf-8 -*-
import requests
from pathlib import Path
import os, sys
from loguru import logger as log
from threading import Thread
BASE_LOG_DIR = Path(__file__).resolve().parent.parentdef async_new(f):def wrapper(*args, **kwargs):thr = Thread(target=f, args=args, kwargs=kwargs)thr.start()thr.join(timeout=2)return wrapper@async_new
def push_report(web_hook, msg):'''发送消息给飞书机器人:param web_hook: 机器人api:param msg: 要发送的消息:return:'''header = {"Content-Type": "application/json;charset=UTF-8"}message_body = {"msg_type": "text","content": {"text": msg}}requests.post(url=web_hook, json=message_body, headers=header)#rotation参数: 50 MB(设置日志文件大小)  00:00(每天凌晨创建一个新文件)  1 week(一周创建一个日志文件)
#retention参数: 10 days(日志文件最长保留10天)
rotation, retention = '00:00', '7 days'class Logger(object):__instance = Nonedef __new__(cls, *args, **kwargs):if not cls.__instance:cls.__instance = super(Logger, cls).__new__(cls)return cls.__instancedef __init__(self, file_name):self.logger = logself.logger.add(os.path.join(BASE_LOG_DIR, f'logs/{file_name}_info.log'),format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {file.path} | {module} | {function} | {line} | {message}",level="INFO", rotation=rotation, retention=retention, enqueue=True, encoding='utf-8')self.logger.add(os.path.join(BASE_LOG_DIR, f'logs/{file_name}_error.log'),format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {file.path} | {module} | {function} | {line} | {message}",level="ERROR", rotation=rotation, retention=retention, enqueue=True, encoding='utf-8')self.logger.add(sys.stderr, filter=self.loguru_feishu_hook)def loguru_feishu_hook(self, record):if web_hook := record['extra'].get('feishu_web_hook', None):push_report(web_hook, record.get('message'))#如果对record做修改的话,可以return, 但是return后终端会打印两次日志,文件中纸打印一次# return record

调用base_log.py代码范例

import os, sys
from base_log import Logger
logger = Logger(os.path.basename(sys.argv[0]).split('.')[0]).loggerdef ceshi():#打印日志且发送警报# logger.info('fjwioejwoejoifwjoi', feishu_web_hook=https://open.feishu.cn/****")#仅打印日志logger.info('通知:fjwioejwoejoifwjoi4444444')if __name__ == '__main__':ceshi()

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

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

相关文章

Vue3中的reactive与ref

前言&遇到的bug reactive与ref都是Vue3中非常重要的API,众所周知,用这两个API可以创建响应式数据,从而实现Vue的数据驱动视图。 平时用的时候只知道用ref定义基本数据类型,reactive定义引用数据类型。 因为今天发现一个bug…

vue项目的性能优化

结合lighthouse查看各项数据,不断进行性能优化,可以从代码、打包、部署这三个层面来优化 代码层面 1、v-if和v-show区分使用 v-if(惰性的)用的条件判断,是惰性的,false的话初始不会渲染,适用…

【DevOps云实践】使用Azure Pipeline部署Function App

目录 介绍1 Azure DevOps2 微软Azure3 Azure Pipelines3.1 创建流水线**3.1.2 创建流水线**3.2 创建库3.3 运行流水线当流水线成功验证编译的YAML时,将显示阶段和作业。3.4 流水线审阅3.5 检查函数应用结论推荐超级课程: Docker快速入门到精通Kubernetes入门

32、计算e

作者: Turbo时间限制: 1S章节: 循环 问题描述 : 利用公式e1 1/1! 1/2! 1/3! ... 1/n!,编程计算e的近似值,直到最后一项的绝对值小于threshold(该项不包括在结果内),输出e的值并统计累加的项数。 输入说明 : 输…

论文阅读:机器人跑酷学习

项目开源地址:https://github.com/ZiwenZhuang/parkour 摘要: 跑酷对腿部机动性是一项巨大的挑战,要求机器人在复杂环境中快速克服各种障碍。现有方法可以生成多样化但盲目的机动技能,或者是基于视觉但专门化的技能,…

代码随想录笔记|C++数据结构与算法学习笔记-二叉树(一)|二叉树的递归遍历、二叉树的迭代遍历、二叉树的统一迭代法

全文基于代码随想录及相关讲解视频。 文字链接:《代码随想录》 文章目录 二叉树的递归遍历二叉树的前序遍历C代码如下 二叉树的中序遍历二叉树的后序遍历 二叉树的迭代遍历前序遍历前序遍历C代码 右序遍历右序遍历C代码 中序遍历为什么中序遍历不同中序遍历迭代法的…

FEX-Emu在Debian/Ubuntu系统使用

FEX-Emu在Debian/Ubuntu系统使用 1. Debootstrap子系统安装(可选)2. Debian/Ubuntu依赖包安装3. 获取FEX-Emu源码并编译4. 根文件系统RootFS安装5. 基于 FEX-Emu 运行应用 1. Debootstrap子系统安装(可选) sudo apt-get install …

软考 系统架构设计师系列知识点之云原生架构设计理论与实践(2)

接前一篇文章:软考 系统架构设计师系列知识点之云原生架构设计理论与实践(1) 所属章节: 第14章. 云原生架构设计理论与实践 第1节 云原生架构产生背景 云原生(Cloud Native)是近几年云计算领域炙手可热的话…

599: 拉丁方阵(python)

收藏 难度&#xff1a;一般 标签&#xff1a;暂无标签 题目描述 还是Archmager的题了&#xff0c;这次就没有那么多废话了&#xff0c;请大家构造 N*N 阶的拉丁方阵(2<N<9)&#xff0c;使方阵中的每一行和每一列中数字1到N只出现一次。如N4时&#xff1a; 1 2 3 4 2 …

蓝桥杯刷题--python-27--全球变暖-dfs-bfs

1.全球变暖 - 蓝桥云课 (lanqiao.cn) import os import sys # 请在此输入您的代码 sys.setrecursionlimit(60000) n int(input()) dao [] for _ in range(n): tmp list(input()) dao.append(tmp) dict [(1, 0), (0, 1), (-1, 0), (0, -1)] used [[0 for _ in range(n)] fo…

如何让电脑定时开机?这个方法你一定要学会

前言 前段时间小白在上班的时候&#xff0c;个人使用一台台式机和一台笔记本电脑。台式机并不是经常使用&#xff0c;但整个公司的数据中心是建立在小白所使用的那台台式机上。 如果台式机没有开机&#xff0c;同事们就没办法访问数据中心获取自己想要的资料。领导也没办法链…

macOS - 创建聚合设备、切换声卡

文章目录 声卡设备 ID 在各个电脑上不一样,但同一个声卡驱动,UID是相同的。 比如 BlackHole 的声卡 UID 为 BlackHolexch_UID,在不同电脑上设备ID 可能为 55,64… 谨慎期间,使用声卡 UID 寻找设备ID,然后再做合并。 #import <CoreAudio/CoreAudio.h> #import <Au…

C#、.NET版本、Visual Studio版本对应关系及Visual Studio老版本离线包下载地址

0、写这篇文章的目的 由于电脑的环境不同&#xff0c;对于一个老电脑找到一个适配的vscode环境十分不易。总结一下C#、.NET、Visual Studio版本的对应关系&#xff0c;及各个版本Visual Studio的下载地址供大家参考 1、C#、.NET版本、Visual Studio版本对应关系如下 2、Visua…

李国武:如何评估一家精益制造咨询公司的实施能力?

在制造业转型升级的大背景下&#xff0c;精益制造已成为企业提升竞争力、实现可持续发展的关键。然而&#xff0c;面对市场上众多的精益制造咨询公司&#xff0c;如何评估其实施能力成为了众多企业的难题。本文将从多个方面为大家揭示评估精益制造咨询公司实施能力的方法&#…

稀碎从零算法笔记Day25-LeetCode:数组中的第K个最大元素

题型&#xff1a;排序、堆 链接&#xff1a;215. 数组中的第K个最大元素 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode C代码 优先队列建堆 class Solution { public:int findKthLargest(vector<int>& nums, int k) {// 小根堆 根节点就是…

100个Python代码(一)

打印输出: pythonCopy code print("Hello, world!") 变量赋值: pythonCopy code x 10 基本数学运算: pythonCopy code addition 5 5 subtraction 10 - 5 multiplication 4 * 3 division 8 / 2 modulus 7 % 3 exponentiation 2 ** 3 字符串拼接: py…

MySQL数据库的索引

目录 1、索引的概念 2、索引的作用 优点 缺点 3、创建索引的原则依据 4、索引的分类和创建 ​编辑 4.1普通索引 直接创建索引 修改表方式创建索引 创建表时添加索引 删除索引 4.2唯一索引 直接创建唯一索引 修改表方式创建 创建表时指定索引 4.3主键索引&…

Lamdba表达式

Lamdba表达式 Lambda是一个匿名函数&#xff0c;我们可以将Lambda表达式理解为一段可以传递的代码&#xff08;将代码像数据一样 传递&#xff09;。使用它可以写出简洁、灵活的代码。作为一种更紧凑的代码风格&#xff0c;使java语言表达能力得到提 升。 Lambda表达式在java语…

Android Kotlin(六)协程的并发问题

书接上回&#xff1a;Android Kotlin知识汇总&#xff08;三&#xff09;Kotlin 协程 协程的并发问题 在一个协程中&#xff0c;循环创建10个子协程且单独运行各自Default线程中&#xff0c;并让每个子协程对变量 i 进行1000次自增操作。示例如下&#xff1a; fun main() …

Golang基础知识(笔记迁移)

golang 变量作用域 局部作用域&#xff1a;代码块、函数内的全局作用域&#xff1a;顶层作用域&#xff0c;代码块外的就是全局&#xff0c;如果变量名大写&#xff0c;则改变量整个程序都可以使用。 类型断言 golang的类型断言在变量后加上.(type)&#xff0c;如果类型断言…