我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Loguru基本、进阶使用方法小结。

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Loguru基本、进阶使用方法小结。

loguru简介

loguru是一个开源的Python日志记录器,它提供了简单且易于使用的接口,同时具有高度的可定制性。loguru的特点包括:支持格式化日志、记录到文件或终端、支持自动清理日志、支持旋转日志等。

基本使用方法

loguru的基本使用方法非常简单,只需要导入loguru模块,并使用logger函数创建一个日志记录器对象即可。下面是一个简单的示例:

from loguru import logger# 使用默认配置创建一个日志记录器对象logger = logger.opt()logger.info('hello, world!')

在上面的示例中,我们使用logger.opt()函数创建了一个默认配置的日志记录器对象,并使用logger.info()方法输出了一条日志信息。

在下面的示例中,我们使用logger.opt()方法创建了一个默认配置的日志记录器对象,然后使用logger.add()方法添加了一个输出到文件的处理器。接着,我们使用logger.opt()方法创建了一个具有自定义配置的新的日志记录器对象,并使用mylogger.debug()mylogger.info()方法输出了日志信息。由于我们在创建mylogger对象时设置了日志级别为DEBUG,因此mylogger.debug()方法和mylogger.info()方法都会输出日志信息。

from loguru import logger# 创建一个默认配置的日志记录器对象logger = logger.opt()# 创建一个输出到文件的处理器logger.add("mylog.log", rotation="10 MB")# 使用自定义配置创建一个新的日志记录器对象mylogger = logger.opt(    colors=True,     format="{time} {message}",     level="DEBUG")# 输出日志信息mylogger.debug("this is a debug log")mylogger.info("this is an info log")

除了使用默认配置创建日志记录器对象外,我们还可以通过调用logger.add()函数来添加多个不同的日志输出。例如,我们可以同时将日志信息输出到终端和文件中,如下所示:

from loguru import logger# 添加输出到终端的处理器logger.add(    handler=sys.stdout,     format="{time} {message}",     enqueue=True)# 添加输出到文件的处理器logger.add(    handler="log.txt",     format="{time} {level} {message}",     enqueue=True,     rotation="1 week",     retention="7 days",     compression="zip")# 使用默认配置创建一个日志记录器对象logger = logger.opt()logger.info('hello, world!')

在上面的示例中,我们使用logger.add()函数分别添加了一个输出到终端的处理器和一个输出到文件的处理器。其中,handler参数指定了处理器的输出目标,可以是一个文件名、一个文件对象或者一个类似sys.stdout的特殊值。format参数指定了日志信息的格式,可以使用类似{time}{message}的占位符来格式化输出。enqueue参数指定了处理器是否使用队列进行异步处理。rotation参数指定了日志文件的旋转方式,可以按时间、大小等条件进行旋转。retention参数指定了旋转后的日志文件保留的时间。compression参数指定了旋转后的日志文件是否压缩。

进阶使用方法

除了基本使用方法外,loguru还提供了一些进阶的使用方法,如自定义日志级别、日志过滤、异常处理等。

自定义日志级别

loguru允许我们自定义日志级别,可以通过logger.level()函数来添加自定义日志级别。例如,我们可以添加一个名为TRACE的日志级别,并将其显示

from loguru import logger# 添加自定义日志级别logger.level("TRACE", no=5, color="", icon="🐞")# 使用自定义日志级别logger.trace("this is a trace log")

在上面的示例中,我们使用logger.level()函数添加了一个名为TRACE的日志级别,并将其显示为蓝色并带有一个小虫子图标。然后,我们使用logger.trace()方法输出了一条自定义级别的日志信息。

日志过滤

loguru还支持日志过滤功能,可以通过logger.add()函数的filter参数来添加过滤器。例如,我们可以添加一个过滤器来只输出级别为INFO或更高级别的日志信息,如下所示:

from loguru import logger# 添加输出到终端的处理器,并添加日志过滤器logger.add(    handler=sys.stdout,     format="{time} {message}",     enqueue=True,    filter=lambda record: record["level"].no >= 20)# 使用默认配置创建一个日志记录器对象logger = logger.opt()logger.info('hello, world!')logger.debug('this is a debug log')

在上面的示例中,我们使用logger.add()函数添加了一个输出到终端的处理器,并添加了一个日志过滤器。过滤器是一个函数,它接受一个日志记录对象作为输入,如果该函数返回True,则表示该日志记录对象会被处理器处理,否则会被忽略。

在本示例中,我们使用lambda表达式定义了一个简单的过滤器,它只处理级别为INFO或更高级别的日志信息。

异常处理

loguru还支持捕获和记录异常信息,可以通过logger.catch()方法来捕获异常并记录异常信息。例如,我们可以在一个函数中添加logger.catch()来自动记录异常信息,如下所示:

from loguru import logger# 定义一个会抛出异常的函数def foo():    a = 1 / 0# 使用logger.catch()自动记录异常信息@logger.catch()def bar():    foo()# 调用bar()函数bar()

在上面的示例中,我们定义了一个会抛出异常的函数foo(),然后在bar()函数中使用logger.catch()方法来自动记录异常信息。最后,我们调用bar()函数,捕获并记录了异常信息。

绑定参数

logger.bind()方法用于绑定参数到日志记录器中,这些参数可以在日志信息中引用。例如,我们可以使用logger.bind()方法绑定一个user_id参数,并在日志信息中引用该参数,示例如下:

from loguru import logger# 绑定一个user_id参数logger = logger.bind(user_id=12345)# 输出带有user_id参数的日志信息logger.info("user {user_id} logged in")

在上面的示例中,我们使用logger.bind()方法绑定了一个user_id参数,并使用logger.info()方法输出了一条带有user_id参数的日志信息。

输出日志到指定目标

logger.sink()方法用于将日志记录器的输出发送到指定的目标,例如文件、网络等。例如,我们可以使用logger.sink()方法将日志记录器的输出发送到一个网络套接字中,示例如下

from loguru import logger# 创建一个网络套接字import socketsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.connect(('localhost', 9000))# 将日志记录器的输出发送到网络套接字中logger.add(sock.sendall)# 输出日志信息logger.info("hello world")

在上面的示例中,我们创建了一个网络套接字,并使用logger.add()方法将日志记录器的输出发送到该套接字中。接着,我们使用logger.info()方法输出了一条日志信息,该信息将被发送到网络套接字中。

记录模型训练时当前的设备配置

效果图:
在这里插入图片描述
参考mmdet的

# Copyright (c) OpenMMLab. All rights reserved."""This file holding some environment constant for sharing by other files."""import os.path as ospimport subprocessimport sysfrom collections import defaultdictimport pynvmlimport cv2import torchdef collect_env():    """Collect the information of the running environments.    Returns:        dict: The environment information. The following fields are contained.            - sys.platform: The variable of ``sys.platform``.            - Python: Python version.            - CUDA available: Bool, indicating if CUDA is available.            - GPU devices: Device type of each GPU.            - CUDA_HOME (optional): The env var ``CUDA_HOME``.            - NVCC (optional): NVCC version.            - GCC: GCC version, "n/a" if GCC is not installed.            - MSVC: Microsoft Virtual C++ Compiler version, Windows only.            - PyTorch: PyTorch version.            - PyTorch compiling details: The output of \                ``torch.__config__.show()``.            - TorchVision (optional): TorchVision version.            - OpenCV: OpenCV version.    """    env_info = {}    env_info['sys.platform'] = sys.platform    env_info['Python'] = sys.version.replace('\n', '')    cuda_available = torch.cuda.is_available()    env_info['CUDA available'] = cuda_available    if cuda_available:        devices = defaultdict(list)        for k in range(torch.cuda.device_count()):            devices[torch.cuda.get_device_name(k)].append(str(k))        for name, device_ids in devices.items():            env_info['GPU ' + ','.join(device_ids)] = name    try:        # Check C++ Compiler.        # For Unix-like, sysconfig has 'CC' variable like 'gcc -pthread ...',        # indicating the compiler used, we use this to get the compiler name        import sysconfig        cc = sysconfig.get_config_var('CC')        if cc:            cc = osp.basename(cc.split()[0])            cc_info = subprocess.check_output(f'{cc} --version', shell=True)            env_info['GCC'] = cc_info.decode('utf-8').partition(                '\n')[0].strip()        else:            # on Windows, cl.exe is not in PATH. We need to find the path.            # distutils.ccompiler.new_compiler() returns a msvccompiler            # object and after initialization, path to cl.exe is found.            import os            from distutils.ccompiler import new_compiler            ccompiler = new_compiler()            ccompiler.initialize()            cc = subprocess.check_output(                f'{ccompiler.cc}', stderr=subprocess.STDOUT, shell=True)            encoding = os.device_encoding(sys.stdout.fileno()) or 'utf-8'            env_info['GCC'] = 'n/a'    except subprocess.CalledProcessError:        env_info['GCC'] = 'n/a'    env_info['PyTorch'] = torch.__version__    try:        import torchvision        env_info['TorchVision'] = torchvision.__version__    except ModuleNotFoundError:        pass    env_info['OpenCV'] = cv2.__version__    return env_infodef is_mlu_available():    """Returns a bool indicating if MLU is currently available."""    return hasattr(torch, 'is_mlu_available') and torch.is_mlu_available()def get_device(gpu_id=None):    """Returns an available device, cpu, cuda or mlu."""    is_device_available = {        'cuda': torch.cuda.is_available(),        'mlu': is_mlu_available()    }    device_list = [k for k, v in is_device_available.items() if v]    if len(device_list) == 1:        return device_list[0] if gpu_id is None else '{}:{}'.format(device_list[0], gpu_id)    else:        return 'cpu'def get_gpu_memory_info(gpu_id):    pynvml.nvmlInit()    handle = pynvml.nvmlDeviceGetHandleByIndex(gpu_id)    meminfo = pynvml.nvmlDeviceGetMemoryInfo(handle)    total = meminfo.total // 1024 // 1024    # 单位:MB    used = meminfo.used // 1024 // 1024    free = meminfo.free // 1024 // 1024    return total, used, freeif __name__ == '__main__':env_info_dict = collect_env()    env_info = '\n'.join([f'{k}: {v}' for k, v in env_info_dict.items()])    dash_line = '-' * 60 + '\n'fh_path = os.path.join('work_dir', mode + '_{time}' + ".log")    logger.add(        sink=fh_path,        format="{time}-{name}-{level}-{message}", level="INFO"    )logger.info(f'Environment info:\n{dash_line}{env_info}\n{dash_line}')

来源地址:https://blog.csdn.net/baidu_41879652/article/details/129478912

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Loguru基本、进阶使用方法小结。

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python中argparse基本用法小结

这篇文章介绍了Python中argparse模块的基本用法,用于解析命令行参数。它提供了一个清晰的概述,包括:创建ArgumentParser对象添加不同类型的参数(必需、可选、标志、参数)解析参数并访问已解析参数的高级用法包括:限制参数出现次数排除互斥的参数组创建自定义类型故障处理
Python中argparse基本用法小结
2024-04-02

filters.revealTrans.Transition使用方法小结

filters.revealTrans.Transition使用方法小结:1. 创建Transition对象:使用`var transition = new filters.revealTrans.Transition(element)`,
2023-08-17

聊聊sourcetree 结合 Git 的基本使用方法

sourcetree 是一个非常好用的 Git 图形化客户端工具,通过 sourcetree 可以简化 Git 命令操作,让 Git 版本控制更加容易上手。那么 sourcetree 结合 Git 究竟怎么使用呢?接下来我们来讲解一下 so
2023-10-22

JDBC基本使用方法

JDBC基本使用方法JDBC固定步骤:加载驱动String url="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf-8&serverTimezone=GM
JDBC基本使用方法
2017-12-27

Android PopupWindow使用方法小结

前几天要用到PopupWindow,一时竟想不起来怎么用,赶紧上网查了查,自己写了个demo,并在此记录一下PopupWindow的用法。使用场景PopupWindow,顾名思义,就是弹窗,在很多场景下都可以见到它。例如ActionBar/
2023-05-31

sourcetree结合Git的基本使用方法是什么

这篇文章主要介绍了sourcetree结合Git的基本使用方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇sourcetree结合Git的基本使用方法是什么文章都会有所收获,下面我们一起来看看吧。一、下
2023-07-05

Shell脚本中$符号的嵌套使用方法小结

目录1 示例2 说明本文主要介绍在编写 Shell 脚本时,通过嵌套使用 $ 符号,间接获取变量或表达式的值的具体方法。 先说结论,在 Shell 脚本中,可以通过使用 eval 命令来实现 $ 符号的嵌套使用。 Man 手册中对于 eva
2023-05-06

GNS3的基本使用方法

GNS3 基本使用方法1.一张基本的拓扑图需要一台路由器,一台交换机,PC一台这里是所有的路由器和交换机及PC,在GNS3里面将路由器直接拖到工作面板中是没有用的,因为每个路由器需要对应的镜像,如图所示:添加镜像的方法在这里面选择对
2023-01-31

mybatis的基本使用方法

本篇文章给大家分享的是有关mybatis的基本使用方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。具体代码如下所示:
2023-05-31

Golang三个编译基本命令的使用小结

本文主要介绍了Golang三个编译基本命令的使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录