前提:
之前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()