这个它不比手动配置logging香多了?

Python日志记录库——loguru 在 Python 中用到日志记录,那就不可避免地会用到内置的 logging标准库。虽然logging 库采用的是模块化设计,你可以设置不同的 handler 来进行组合,但是在配置上通常较为繁琐;而且如果不是特别处理,在一些多线程或多进程的场景下使用 logging还会导致日志记录会出现错乱或是丢失的情况。Python 日志记录工具logging标准库logging的替代品是loguru,loguru使用起来就简单的多。 阅读详情

在部署一些定时运行或者长期运行的任务时,为了留存一些导致程序出现异常或错误的信息,通常会才用日志的方式来进行记录这些信息。

在 Python 中用到日志记录,那就不可避免地会用到内置的 logging标准库 。虽然logging 库采用的是模块化设计,你可以设置不同的 handler 来进行组合,但是在配置上通常较为繁琐;而且如果不是特别处理,在一些多线程或多进程的场景下使用 logging还会导致日志记录会出现错乱或是丢失的情况。

但有这么一个库,它不仅能够减少繁琐的配置过程还能实现和logging类似的功能,同时还能保证日志记录的线程进程安全,又能够和logging 相兼容,并进一步追踪异常也能进行代码回溯。这个库叫loguru——一个专为像我这样懒人而生日志记录库。

loguru 库的使用可以说是十分简单,我们直接可以通过导入它本身封装好的logger 类就可以直接进行调用。

#!pip install loguru
from loguru import logger

logger 本身就是一个已经实例化好的对象,如果没有特殊的配置需求,那么自身就已经带有通用的配置参数;同时它的用法和 logging库输出日志时的用法一致

In [1]: from loguru import logger 
   ...:  
   ...: logger.debug("debug message"    ) 
   ...: logger.info("info level message") 
   ...: logger.warning("warning level message") 
   ...: logger.critical("critical level message")                                                                                                                                               
2020-10-07 14:23:09.637 | DEBUG    | __main__:<module>:3 - debug message
2020-10-07 14:23:09.637 | INFO     | __main__:<module>:4 - info level message
2020-10-07 14:23:09.638 | WARNING  | __main__:<module>:5 - warning level message
2020-10-07 14:23:09.638 | CRITICAL | __main__:<module>:6 - critical level message

当你在IDE 或终端里运行时会发现,loguru 还为输出的日志信息带上了不同的颜色样式(schema),使得结果更加美观。

在这里插入图片描述

当然,loguru 也像logging一样为我们提供了其他可配置的部分,但相比于 logging 每次要导入特定的handler再设定一些formatter来说是更为「傻瓜化」了。

配置

使用基本的add() 方法就可以对logger 进行简单的配置,这些配置有点类似于使用 logging 时的 handler。这里简单提及一下比较常用的几个。

写入日志

在不指定任何参数时,logger 默认采用 sys.stderr 标准错误输出将日志输出到控制台(console)中;但在linux 服务器上我们有时不仅让其输出,还要以文件的形式进行留存,那么只需要在第一个参数中传入一个你想要留存文件的路径字符串即可。就像这样:

from loguru import logger
import os

logger.add(os.path.expanduser("~/Desktop/testlog.log"))
logger.info("hello, world!")

这样在你的桌面上就会直接出现相应的testlog.log日志文件了。

但是如果你没有自己要是用logging没有预先封装来操作,那估计你得写成这样:

import logging
import os
import sys
from logging import handlers

log = logging.getLogger(__name__)
log.setLevel(logging.DEBUG)
fmt = logging.Formatter("%(asctime)s | %(levelname)s | %(message)s")
LOGFILE = os.path.expanduser("~/Desktop/testlog.log")

console_handler = logging.StreamHandler(sys.stderr)
console_handler.setFormatter(fmt)
log.addHandler(console_handler)

file_handler = handlers.RotatingFileHandler(LOGFILE)
file_handler.setFormatter(fmt)
log.addHandler(file_handler)

log.info("hello, world")

码字不易废话两句:有需要python学习资料的或者有技术问题交流 “点击”即可

日志留存、压缩与清理

通常来说如果程序或服务的量级较大,那么就可以通过集成的日志平台或数据库来对日志信息进行存储和留存,后续有需要的话也方便进行日志分析。

但对我们个人或者一些中小型项目来说,通常只需要以文件的形式留存输出的日志即可。

尽管我们需要将日志写入到相应的文件中,如果是少量的日志那还好,但是如果是日志输出或记录时间较长的情况,那么单个日志文件就十分之大,倘若仍然是将日志都写入到一个文件中,那么当日志中的内容增长到一定数量时我们想要读取并查找相应的部分时就十分困难。这时候我们就需要对日志文件进行留存、压缩,甚至在必要时及时进行清理。

基于以上,我们可以通过对rotation 、compression 和retention 三个参数进行设定来满足我们的需要:

rotation 参数能够帮助我们将日志记录以大小、时间等方式进行分割或划分:

mport os
from loguru import logger

LOG_DIR = os.path.expanduser("~/Desktop/logs")
LOG_FILE = os.path.join(LOG_DIR, "file_{time}.log")
if os.path.exits(LOG_DIR):
    os.mkdir(LOG_DIR)

logger.add(LOG_FILE, rotation = "200KB")
for n in range(10000):
    logger.info(f"test - {n}")

最后呈现如下:

在这里插入图片描述

随着分割文件的数量越来越多之后,我们也可以进行压缩对日志进行留存,这里就要使用到 compression参数,该参数只要你传入通用的压缩文件扩展名即可,如zip、tar、gz等。

import os
from loguru import logger

LOG_DIR = os.path.expanduser("~/Desktop/logs")
LOG_FILE = os.path.join(LOG_DIR, "file_{time}.log")
if os.path.exits(LOG_DIR):
    os.mkdir(LOG_DIR)

logger.add(LOG_FILE, rotation = "200KB", compression="zip")
for n in range(10000):
    logger.info(f"test - {n}")

从结果可以看到,只要是满足了rotation分割后的日志文件都被直接压缩成了zip 文件,文件大小由原本的 200kb 直接减少至10kb,对于一些磁盘空间吃紧的Linux服务器来说是则是很有必要的。

在这里插入图片描述

当然了,如果你不想对日志进行留存,或者只想保留一段时间内的日志并对超期的日志进行删除,那么直接使用 retention 参数就好了。

这里我们可以将之前的结果随意复制 N 多份在logs文件夹中,然后再执行一次加上 retension 参数后代码:

from loguru import logger

LOG_DIR = os.path.expanduser("~/Desktop/logs")
LOG_FILE = os.path.join(LOG_DIR, "file_{time}.log")
if not os.path.exists(LOG_DIR):
    os.mkdir(LOG_DIR)

logger.add(LOG_FILE, rotation="200KB",retention=1)
for n in range(10000):
    logger.info(f"test - {n}")

当然对retention 传入整数时,该参数表示的是所有文件的索引,而非要保留的文件数,这里是个反直觉的小坑,用的时候注意一下就好了。所以最后我们会看到只有两个时间最近的日志文件会被保留下来,其他都被直接清理掉了。

在这里插入图片描述

序列化

如果在实际中你不太喜欢以文件的形式保留日志,那么你也可以通过 serialize 参数将其转化成序列化的json格式,最后将导入类似于MongoDB、ElasticSearch 这类数NoSQL 数据库中用作后续的日志分析。

from loguru import logger
import os

logger.add(os.path.expanduser("~/Desktop/testlog.log"), serialize=True)
logger.info("hello, world!")

最后保存的日志都是序列化后的单条记录:

{
    "text": "2020-10-07 18:23:36.902 | INFO     | __main__:<module>:6 - hello, world\n",
    "record": {
        "elapsed": {
            "repr": "0:00:00.005412",
            "seconds": 0.005412
        },
        "exception": null,
        "extra": {},
        "file": {
            "name": "log_test.py",
            "path": "/Users/Bobot/PycharmProjects/docs-python/src/loguru/log_test.py"
        },
        "function": "<module>",
        "level": {
            "icon": "\u2139\ufe0f",
            "name": "INFO",
            "no": 20
        },
        "line": 6,
        "message": "hello, world",
        "module": "log_test",
        "name": "__main__",
        "process": {
            "id": 12662,
            "name": "MainProcess"
        },
        "thread": {
            "id": 4578131392,
            "name": "MainThread"
        },
        "time": {
            "repr": "2020-10-07 18:23:36.902358+08:00",
            "timestamp": 1602066216.902358
        }
    }
}

异常追溯

当异常和错误不可避免时,最好的方式就是让我们知道程序到底是哪里出了错,或者是因为什么导致错误,这样才能更好地让开发人员及时应对并解决。

loguru集成了一个名为better_exceptions 的库,不仅能够将异常和错误记录,并且还能对异常进行追溯,这里是来自一个官网的例子

import os
import sys

from loguru import logger

logger.add(os.path.expanduser("~/Desktop/exception_log.log"), backtrace=True, diagnose=True)

def func(a, b):
    return a / b

def nested(c):
    try:
        func(5, c)
    except ZeroDivisionError:
        logger.exception("What?!")

if __name__ == "__main__":
    nested(0)

最后在日志文件中我们可以得到以下内容:

File "/Users/Bobot/PycharmProjects/docs-python/src/loguru/log_test.py", line 20, in <module>
    nested(0)
    └ <function nested at 0x7fb9300c1170>

> File "/Users/Bobot/PycharmProjects/docs-python/src/loguru/log_test.py", line 14, in nested
    func(5, c)
    │       └ 0
    └ <function func at 0x7fb93010add0>

  File "/Users/Bobot/PycharmProjects/docs-python/src/loguru/log_test.py", line 10, in func
    return a / b
           │   └ 0
           └ 5

ZeroDivisionError: division by zero

与 Logging 完全兼容(Entirely Compatible)

尽管说loguru 算是重新「造轮子」,但是它也能和logging库很好地兼容。到现在我们才谈论到add() 方法的第一个参数 sink。

这个参数的英文单词动词有「下沉、浸没」等意,对于外国人来说在理解上可能没什么难的,可对我们国人来说,这可之前logging 库中的handler 概念还不好理解。好在前面我有说过,loguru 和logging 库的使用上存在相似之处,因此在后续的使用中其实我们就可以将其理解为handler,只不过它的范围更广一些,可以除了 handler 之外的字符串、可调用方法、协程对象等。

loguru 官方文档对这一参数的解释是:

 object in charge of receiving formatted logging messages and propagating them to an appropriate endpoint.

翻译过来就是「一个用于接收格式化日志信息并将其传输合适端点的对象」,进一步形象理解就像是一个「分流器」。

import logging.handlers
import os
import sys

from loguru import logger

LOG_FILE = os.path.expanduser("~/Desktop/testlog.log")
file_handler = logging.handlers.RotatingFileHandler(LOG_FILE, encoding="utf-8")
logger.add(file_handler)
logger.debug("hello, world")

当然目前只是想在之前基于logging 写好的模块中集成loguru,只要重新编写一个继承自 logging.Handler 类并实现了emit() 方法的Handler 即可。

import logging.handlers
import os
import sys

from loguru import logger

class InterceptHandler(logging.Handler):
    def emit(self, record):
        try:
            level = logger.level(record.levelname).name
        except ValueError:
            level = record.levelno

        frame, depth = logging.currentframe(), 2
        while frame.f_code.co_filename == logging.__file__:
            frame = frame.f_back
            depth += 1

        logger.opt(depth=depth, exception=record.exc_info).log(level, record.getMessage())

logging.basicConfig(handlers=[InterceptHandler()], level=0)

def func(a, b):
    return a / b

def nested(c):
    try:
        func(5, c)
    except ZeroDivisionError:
        logging.exception("What?!")

if __name__ == "__main__":
    nested(0)

后结果同之前的异常追溯一致。而我们只需要在配置后直接调用logging 的相关方法即可,减少了迁移和重写的成本。

最后

本文介绍了关于loguru的常用方法,从对比例子上来看,相比于复杂的 logging 配置来说,使用loguru 库无疑还是很香的,毕竟别人已经为我们一些日常的通用性需求提供了封装好的解决方案,无论是在学习还是在使用的成本上,无疑还是比较小的。

由于篇幅有限,loguru的其他配置部分没有进一步展开,如果看完本文的你对这个库感兴趣并打算投入到实际的开发和生产中使用,那么建议你还是阅读一下其官方文档,有必要的话可以浏览一下源码。

不过loguru的通用配置不一定满足每个人的需要,对于那些动手能力强或水平较高的朋友还能进一步根据个人需求或业务需求进行二次封装,或许也能较为贴合实际情况。

以上就是小编今天为大家带来的内容,小编本身就是一名python开发工程师,我自己花了三天时间整理了一套python学习教程,从最基础的python脚本到web开发,爬虫,数据分析,数据可视化,机器学习,等,这些资料有想要的小伙伴 " 点击 " 即可领取

【Python】logging 在软件开发中,日志(logging)是不可或缺的组成部分。它不仅仅是简单地打印信息到控制台,更是软件运行状态、异常、性能瓶颈以及业务流程的关键“黑匣子记录”。想象一下,一个复杂的分布式系统在生产环境中出现问题,如果没有详尽的日志,排查问题将如同大海捞针。日志,就是系统运行轨迹的画像,是故障诊断、性能优化、安全审计甚至业务分析的基石。初学者在Python中输出信息时,最常使用的是内置的 函数。然而, 在生产环境中是远远不够的,甚至可能成为问题的根源。让我们先看看 的局限性:为了克服 的这些局限,日志系统 阅读详情

相关推荐

Loguru:Python中强大的日志库

除了之前提到的formatter参数外,Loguru还允许您在每个日志处理器上自定义日志的格式化方式。这可以通过设置handler.formatter来实现。logger.add_handler(logger.FileHandler("log.txt", mode="a")) # 添加文件日志处理器logger.set_level(10) # 设置日志级别为infohandler = logger.handlers[0] # 获取文件日志处理器) # 设置日志输出格式,包括时间、名称、级别和消息。

这家伙很懒,什么都没有留下 2672

Loguru:更为优雅、简洁的Python 日志管理模块

在 Python 开发中涉及到日志记录,我们或许通常会想到内置标准库 —— logging 。虽然logging 库采用的是模块化设计,可以设置不同的 handler 来进行组合,但是在配置上较为繁琐。同时在多线程或多进程的场景下,若不进行特殊处理还会导致日志记录会出现异常。 本文将介绍一个十分优雅、简洁的日志记录第三方库—— loguru ,我们可以通过导入其封装的logger 类的实例,即可直接进行调用。 安装 使用 pip 安装即可,Python 3 版本的安装如下: pip3 install l..

software_test010的博客 6958

python3中超级好用的日志模块-loguru模块详解

一. 使用logging模块时 用python写代码时,logging模块最基本的几行配置,如下: import logging logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') logger = logging.getLogger(__name__) logger.info('this is another debug message') logge

数据知道的博客 12万+

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

loguru基本、进阶使用方法,打印显卡型号

baidu_41879652的博客 7574

VOS3000线路对接、路由配置与路由分析操作教程

通过本教程,你应该已经掌握了VOS3000的线路对接、路由配置和路由分析的基本操作。添加备用路由:为常用前缀添加备用路由,确保在主路由失效时呼叫仍能正常进行。进入线路管理:点击“系统管理” -> “线路管理” -> “添加线路”。查看日志:在“系统日志”中查看路由选择情况,确保路由配置正确。失败原因:查看失败呼叫的原因(如“无应答”、“线路忙”等)。线路选择:选择之前添加的线路(如“供应商A”)。保存并启用:填写完毕后,点击“保存”并启用路由。路由名称:自定义一个名称(如“路由A”)。

AI_wx_3307623172的博客 2967

SAP前台处理:业务伙伴维护(客户主数据和供应商主数据)之基础视图 <BP>

这里主要讲解BP业务伙伴主数据中和财务相关的一些内容,包括基础视图数据,采购视图数据,销售视图数据,公司代码视图数据; S4统一了供应商和客户,从事务代码上:不再使用FD01和FK01进行维护,而使用事务代码BP统一维护;

SAP.David.Gao的博客 3455

不想手动再配置logging?那可以试试loguru

在部署一些定时运行或者长期运行的任务时,为了留存一些导致程序出现异常或错误的信息,通常会才用日志的方式来进行记录这些信息。在 Python 中用到日志记录,那就不可避免地会用到内置的 l...

Python中文社区 1456

【Java】对接微信转账到零钱接口 Java微信商家转账 apiV3(该踩的雷都踩了)

配置apiv3依赖java代码。

Moonhwa的博客 4316

MyBatis学习:MyBatis中简单使用占位符#,STDOUT_LOGGING日志和INSERT语句手动提交事务

目前我本人正在学习MyBatis框架,在原先了解并且懵懵懂懂使用的基础上,开始系统正式的学习。目前已经阐述了MVC架构模式和三层架构,明晰了在Web项目中的普遍编码层次,认识了框架,回顾了JDBC连接数据库,稍详细介绍了MyBatis框架,初步建立了一个使用MyBatis和MySQL的Maven项目。本篇博文记录一下简单使用占位符#,STDOUT_LOGGING日志和INSERT语句手动提交事务。...

weixin_46281472的博客 1318

AI大模型驱动Web UI自动化测试:Playwright与RobotFramework智能整合实践

Web自动化测试是软件质量保障的关键环节,其核心原理是通过脚本模拟用户操作,对Web应用界面进行功能验证。传统方法依赖固定的元素定位和脚本逻辑,在应对频繁的UI变更时面临维护成本高、脚本脆弱的挑战。随着AI大模型技术的发展,其强大的自然语言理解和代码生成能力为自动化测试带来了新的技术价值。通过将大模型的意图理解与代码生成能力,与Playwright强大的浏览器自动化执行引擎以及RobotFramework灵活的关键字驱动框架相结合,可以构建出能够理解自然语言指令、动态生成稳定操作脚本的智能测试系统。这种融合

weixin_28718769的博客 410

Docker网络冲突?手把手教你解决Dify社区版无法访问172.18.0.0网段的问题

本文详细解析了在部署Dify社区版时,因Docker默认网段与局域网冲突导致无法访问172.18.0.0网段的问题。通过剖析Docker网络原理,提供了修改Docker守护进程默认地址池的根治方案,并介绍了在Compose文件中指定自定义网络等备选方法,帮助用户彻底解决网络冲突,保障服务稳定运行。

p8q9r0的博客 484

CANoe中Logging模块使用方法及妙招⭐认识Logging模块|触发类型|触发条件|Time|高级选项|手动触发|触发的配置|文件的设置|实际应用

Logging是CANoe软件中的数据记录模块,主要在台架测试中使用,支持CAN/CAN FD、LIN、FlexRay以及车载以太网总线的数据记录。常用的数据记录仪还有GL数据记录仪,GL有自己单独的硬件设备,应用场景主要为台架或者实车测试,进行无人看守时的数据记录,和Logging的最大区别就是Logging是CANoe软件中的一个功能点,不是单独的硬件,同时Logging的使用,人员往往在上位机面前会进行互动操作。

Polelink北汇信息的博客 3393

OpenHarness代码解读

Harness 是包裹在大模型之外、为其赋予完整执行能力的全套基础设施。模型负责提供智能与推理,Harness 则为模型提供感知、行动、记忆、工具与安全约束,使其从语言模型变成可自主完成复杂任务的实用智能体。我这里把向量数据库方案定义为:把对话片段、事件、偏好、工具结果等切成 memory chunks,做 embedding,存进向量库,查询时靠 ANN 相似度召回,再交给 LLM 读。AAAI 的综述类论文就明确指出,很多 LLM agent 的长期记忆就是这么做的。AAAI 期刊把文件系统方案。

qq_52053775的博客 187

Canoe logging block

Canoe 录制trace功能创建logging Block配置 logging file配置logging trigger model方式一:Entire measurement方式二:user defined方式三:CAPLsetLogFileName()startLogging()stopLogging()triggerEx() 创建logging Block 点击工具栏的analyze -> Measurement Setup 在任意block上点击右键,然后选择 insert log

蚂蚁小兵 4975

【DRAM存储器六十八】DDR5介绍--DQS Interval Oscillator—动态时序校准利器

DDR5内存采用DQS间隔振荡器(DQSIntervalOscillator)技术应对高速数据传输中的时序漂移问题。该技术通过测量DQS信号在可编程时间窗口内的振荡次数(16位计数值),动态监测温度/电压变化导致的DQS-DQ延迟偏移。控制器通过MPC命令启停振荡器,读取MR46/MR47寄存器获取计数值,并与基准值对比来调整DQS相位,确保数据采样窗口始终处于最佳位置。该机制使DDR5在8400MT/s高速率下仍能保持数据可靠性,有效补偿±0.48tCK的时序偏移。

highman110的博客 149

Keras深度学习实战(32)——基于LSTM预测股价

股价预测是时间序列预测中最具挑战性的问题之一,研究股价预测问题具有重要的理论意义和应用价值。针对循环神经网络在股价预测中存在的长期依赖等缺点,本文引入了长短时记忆神经网络以提高股价预测的效果。同时,我们把有关公司的新闻标题的文本数据作为模型的输入变量时,发现预测效果更好,因此我们可以把有关公司的新闻标题的文本数据作为一个有效的输入变量。最后,通过利用 Keras 实现了以上两个股价预测模型,并进行了性能分析和对比。

盼小辉丶的博客 1万+

python 中的 logging 详解

什么是 logging.StreamHandler()?它为什么将信息输出到控制台?logging.getLogger().addHandler(console) 到底做了什么?想解答这些问题,探索 logging 更丰富的用法,于是我去查看了官方文档教程,在这里对这次学习进行记录整理。本文不追究文档的细节,对基础的知识也默认已知,主要目的是建立对 logging 整体架构和工作方式的认识。

撒旦先生的博客 4967

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Python Logging 配置了 filename 却没有生成日志文件的原因与解决方法

摘要:Python中使用logging.basicConfig()配置日志时,可能出现未生成日志文件且无报错的问题。原因是basicConfig()仅在root logger无handler时生效,而第三方库可能已自动添加了handler(如StreamHandler)。解决方法:1) 调用前手动清理现有handler;2) 更推荐直接手动配置FileHandler,避免依赖basicConfig()的"单次生效"机制。后者可控性更高,适合生产环境。

weixin_49354660的博客 1045

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

python中logging模块详解_python logging模块的使用详解

logging日志模块:是用来记录日志的模块,一般记录用户在软件中的操作使用方法:模板直接拿来用,手动修改# logging的配置信息(模板)import osimport logging.config# 定义三种日志输出格式 开始(模板,不用配置,直接拿来用)standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%...

weixin_39683025的博客 315

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Python logging 模块

Python logging 模块 给大家剖析下Python的logging模块。 logging模块是Python内置的一个强大易用的日志模块。简单到你只需要两行代码就能输出一些东西来:import logging logging.warning('Hi, I print something.')输出:WARNING:root:Hi, I print something.当然,我们可不能满足于

灰蓝 9171

django中的logging

1.python中的logging import logging # loggers:记录器 # 记录器是进入记录系统的入口点,每个记录器都是一个命名的存储痛,可以将消息写入其中 # 日志级别: # DEBUG:用于调试的低级系统信息 # INFO:一般系统信息 # WARNING:描述发生的小问题信息 # ERROR:描述已经发生的主要问题信息 # CRIRICAL:描述已经发生的严重问题信...

qq_41661056的博客 683

logging模块

logging模块 导入模块:import logging 日志模块有五个级别: debug 级别为10 info 级别为20 warning 级别为30 error 级别为40 critical 级别为50 使用日志有两种形式,一种是将日志保存到日志文件,一种是将日志打印到终端。 日志默认是warning以及以上的级别才会打印输出。 直接使用logging.debug('我是deb...

weixin_30323631的博客 116

Logging

JDK Logging将日志打印抽象成以下几个类之间的交互: Level,定义日志的级别,类似Log4J中的Level类。 JDK Logging采用了完全不同于Log4J中对级别的抽象。在JDK Logging中,默认定义了以下几个级别:SEVERE(对应Log4J中的ERROR或FATAL)、WARNING(对应Log4J中的WARN)、INFO(对应Log4J中的INFO)、CONFIG(对应Log4J中的DEBUG)、FINE(对应Log4J中的TRACE)、FINER(对应Log4J中的TRAC

雨落★蝶舞的博客 421

python-logging

Python 的 logging 模块是一个强大的内置日志记录系统,它提供了灵活的日志记录功能,远超简单的 语句。这个模块为应用与库实现了灵活的事件日志系统的函数与类。使用标准库提供的 logging API 最主要的好处是,所有的 Python 模块都可能参与日志输出,包括你自己的日志消息和第三方模块的日志消息。官方文档参见:https://docs.python.org/3.11/library/logging.html#logging.basicConfiglogging 模块提供了 print 无

ly的博客 1090

Logging Made Easy证书管理指南:从自动生成到手动配置的安全实践

Logging Made Easy(LME)作为一款强大的日志管理工具,其安全通信依赖于TLS证书体系。本文将详细介绍LME证书的自动生成、手动配置、定期更新及迁移全流程,帮助新手用户轻松掌握证书安全管理的核心实践。 ## 📜 LME证书体系概述 LME通过多层TLS证书保障通信安全,包括用于服务端认证的Elasticsearch、Logstash、Kibana证书,以及用于客户端认证的Wi

gitblog_00166的博客 190

logging 模块升级版 loguru

Loguru 相对于 Logging 的改进内容;loguru 模块常规使用和项目各模块日志分流

a1314_521a的博客 2600
上一篇: 写给正在准备学编程的小伙伴
下一篇: 微信图标能换颜色?
python程序员小'鹏
博客等级 码龄6年 163粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值