首页 > 其他分享 >loguru进一步封装解决打印日志定位异常问题

loguru进一步封装解决打印日志定位异常问题

时间:2023-08-09 11:46:41浏览次数:40  
标签:封装 log loguru message args time path 日志 logger

import os
import sys
import time
from loguru import logger
import inspect

def creat_time_os():
    creat_time = time.strftime("%Y-%m-%d", time.localtime())

    sys.path.append(os.path.dirname(os.path.abspath(__file__)))

    log_path_dir = os.path.abspath(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
    logs_path = os.path.join(log_path_dir, "logs", creat_time)
    if os.path.exists(logs_path):
        return logs_path
    else:
        try:
            os.makedirs(logs_path)
        except Exception as e:
            print(e)
        return logs_path


# 提供日志功能
class uru_logger:
    # 去除默认控制台输出
    # logger.remove()

    # 输出日志格式

    def __init__(self):
        logger_format = "{time:YYYY-MM-DD HH:mm:ss,SSS} | {level} | {message}"
        logger.remove()  # 这里是不让他重复打印
        logger.add(sys.stderr,  # 这里是不让他重复打印
                   level="DEBUG",
                   format=logger_format,

                   )
        # 输出到文件,并按天分割和压缩
        logs_path = creat_time_os()
        # 日志文件名:由用例脚本的名称,结合日志保存路径,得到日志文件的绝对路径
        logname = os.path.join(logs_path, sys.argv[0].split('/')[-1].split('.')[0]) + '.log'
        logger.add(
            logname,
            encoding="utf-8",
            format=logger_format,
            level="INFO",
            rotation="500MB",
            retention="5 days",
            # colorize=True,
            compression="zip")
        self.creat_time = time.strftime("%Y-%m-%d", time.localtime())
        self.log = logger

    def check_format(self):
        if time.strftime("%Y-%m-%d", time.localtime()) != self.creat_time:
            self.__init__()


uru_logger_log = uru_logger()


def log_info(*args):
    '''
    info log信息
    :param message:
    :return:
    '''
    uru_logger_log.check_format()
    try:
        caller_frame = inspect.currentframe().f_back
        function_name = caller_frame.f_code.co_name
        line_number = caller_frame.f_lineno
        previous_module = caller_frame.f_globals['__name__']
        message_part = args[0] if len(args) == 1 else str(args)
        custom_message = f"{previous_module} | {function_name}:{line_number} | - {message_part}"
        uru_logger_log.log.info(custom_message)
    except:
        uru_logger_log.log.info(args[0] if len(args) == 1 else args)


def log_debug(*args):
    '''
    debug log信息
    :param message:
    :return:
    '''
    uru_logger_log.check_format()
    try:
        caller_frame = inspect.currentframe().f_back
        function_name = caller_frame.f_code.co_name
        line_number = caller_frame.f_lineno
        previous_module = caller_frame.f_globals['__name__']
        message_part = args[0] if len(args) == 1 else str(args)
        custom_message = f"{previous_module} | {function_name}:{line_number} | - {message_part}"
        uru_logger_log.log.debug(custom_message)
    except:
        uru_logger_log.log.debug(args[0] if len(args) == 1 else args)


def log_error(*args):
    '''
    error log信息
    :param message:
    :return:
    '''
    uru_logger_log.check_format()
    try:
        caller_frame = inspect.currentframe().f_back
        function_name = caller_frame.f_code.co_name
        line_number = caller_frame.f_lineno
        previous_module = caller_frame.f_globals['__name__']
        message_part = args[0] if len(args) == 1 else str(args)
        custom_message = f"{previous_module} | {function_name}:{line_number} | - {message_part}"
        uru_logger_log.log.error(custom_message)
    except:
        uru_logger_log.log.error(args[0] if len(args) == 1 else args)

标签:封装,log,loguru,message,args,time,path,日志,logger
From: https://www.cnblogs.com/pythonywy/p/17616422.html

相关文章

  • vue3 + ElementPlus 封装函数式弹窗组件
    需求场景:弹窗组件需要支持自定义的插槽内容,删除的弹窗也要使用这个组件,只是样式不一样而已,希望在父组件使用删除弹窗的时候直接调用某个方法就可以显示弹窗组件模拟cuDialog假设我的弹窗组件有以下的props和事件dialogVisible:控制弹窗显示和隐藏title:弹窗的标题showClose......
  • JavaSE--封装
    一、封装概念及作用1、封装  现实生活中很多都是封装的,例如手机、笔记本电脑......外部有一个壳子保护内部的部件,保证内部的部件是安全的  封装之后对于我们使用者来说不需要了解内部的结构和关心内部的复杂,只需要使用就可以2、封装的作用保证内部结构的安全屏蔽复杂,暴......
  • 使用python解析nginx日志
    性能测试时,需使用生产环境各接口请求比例分配接口请求比,nginx统计脚本如下:importreimportpandasaspdimportxlwtobj=re.compile(r'(?P<ip>.*?)--\[(?P<time>.*?)\]"(?P<request>.*?)"(?P<request_time>.*?)(?P<status>.*?)(?P<by......
  • serilog日志
      1安装包   第一个是基础的配置,第二个包是集成Serilog日志记录器的扩展包,简化在.NET应用程序中集成和配置Serilog的过程。第三个是保存在文档中 2 配置文件   public static void AddSerilog(this WebApplicationBuilder builder)    ......
  • EFK家族---Fluentd日志收集
    介绍Fluentd是一个开源的数据收集器,专为处理数据流设计,使用JSON作为数据格式。它采用了插件式的架构,具有高可扩展性高可用性,同时还实现了高可靠的信息转发。具备每天收集5000+台服务器上5T的日志数据,每秒处理50000条消息的性能;Fluentd是由Fluent+d得来,d生动形象地标明了它是以一个......
  • 【JVM技术指南】「GC内存诊断-故障问题排查」一文教你如何打印及分析JVM的GC日志(实战
    当我们在开发Java应用程序时,JVM的GC(垃圾回收)是一个非常重要的话题。GC的作用是回收不再使用的内存,以便程序可以继续运行。在JVM中,GC的日志记录了GC的详细信息,包括GC的类型、时间、内存使用情况等。在本文中,我们将介绍JVMGC日志的格式、含义和分析方法。JVMGC日志格式JVMGC日志的......
  • Linux下通过Nginx日志分析网站访问情况
    1.前言2.访问IP相关统计2.1.统计IP访问量(PV)2.2.独立IP访问统计(UV)2.3.查看某一时间段的IP访问量(4-5点)2.4.查看访问最频繁的前100个IP2.5.查看访问次数在100次以上的IP2.6.查看某个IP的详细访问情况,按访问频率排序3.页面访问统计3.1.查看访问最频繁的......
  • vue3 基于antd3.2.20封装表格(插槽)
    <!--表格组件--><a-table:dataSource="tableData":columns="columns":pagination="false":scroll="{y:tableHeight,x:1500}":rowKey="'id'">......
  • WEB自动化-框架-关键字封装
    所谓的关键字驱动,本质就是函数封装的过程。⾃动化当中的封装⽬的是:拆分重复的⾏为代码和测试数据,增加可维护性和复⽤性 对于某些用例都需要执行的功能,比如登陆、切换环境、登陆后进入大模块等。像这样的前置功能或者后置功能写到一个用例里面,其他用例就不能使用了。所以需要配......
  • 二分答案,二分搜索,封装
    namespacebinarySearch{ //最后一个小于等于 template<typenameT> T*binarySearchLastSmall(T*l,T*r,intkey){ while(l+1<r){ T*mid=l+(r-l)/2; if(*mid<=key)l=mid; elser=mid; } returnl; } //最后一个小于 template<typenameT>......