首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -测试Twiggy或Loguru这样的替代记录器的非侵入性方法?

Python -测试Twiggy或Loguru这样的替代记录器的非侵入性方法?
EN

Stack Overflow用户
提问于 2020-10-21 23:35:35
回答 2查看 655关注 0票数 0

这是而不是关于logging替代方案的建议的问题。

然而,我想尝试一些替代的伐木程序,比如Twiggy或Loguru。或者别的什么。问题是,虽然logging的配置是集中式的,但对记录器的获取却充斥着代码库。

采集码

代码语言:javascript
复制
import logging  # I'd like to import an alternative here.
logger = logging.getLogger(__name__)

有多少个实例

(基本上,每个使用日志记录的.py文件都有这2行代码)

代码语言:javascript
复制
ack -l --python logging.getLogger | wc -l
193

当调用logging.getLogger时,有哪些好的方法可以绕过stdlib日志记录并返回一个Loguru或Twiggy?

我能想到几个:

  • 在Python条目中放置自定义logging.py早于stdlib版本
  • 使用导入模拟装饰器返回与stdlib不同的模块
  • 通过在早期导入logging并将logging.getLogger设置为自定义工厂函数,从而对它进行猴子切换,从而返回一个Loguru或其他任何选项。
  • 自定义site.py,站点初始化模块。

是否有人试图在不修改每个logging调用的情况下交换logging.getLogging?你是怎么做到的?

此外,这是在Django网络应用程序的上下文中。不过,我不想和settings.LOGGING混在一起。

作为参考,这是一个Loguru记录器获取和类型的代码,我绝对希望避免在200+文件分发之前,发现Loguru不适合我的需要。

代码语言:javascript
复制
from loguru import logger  #❌ I don't want to have to this 200 times!!!

logger.debug("That's it, beautiful and simple logging!")

到头来,理想的情况是我可以找到一种很好的选择来登录一段时间,如果我修改了它的配置,那么甚至可能会在稍后的某个日期恢复到stdlib logging。但是,这不需要触摸所有这些文件。我可以先试试Loguru,然后是Twiggy,然后是其他的东西。

基本上,如何将日志功能的实际提供程序从所有应用程序文件中断开?

另外,为了清楚的是,无论我使用什么日志服务提供商都必须支持或者可以调整以支持记录器API,比如logger.info(), logger.debug()等等.因此,这个问题是而不是关心的应用程序代码,例如:

logger.info("this is your info")

EN

回答 2

Stack Overflow用户

发布于 2020-10-21 23:58:11

由于您计划更改记录器,所以首先集中代码是有意义的,以便以后可以轻松地更改代码。

因此,您可以创建一个新的日志模块,它的行为与内置的logging类似,并将所有导入替换为

代码语言:javascript
复制
import my.logging.module

然后在需要实现不同的记录器时修改my.logging.module

my.logging.module中,您可以选择使用一些特殊的逻辑(在不同的记录器之间切换等)实现自己的函数,或者只对默认行为执行讨厌的from logging import *

票数 1
EN

Stack Overflow用户

发布于 2020-10-22 05:35:51

我用usercustomize.py代替记录器。这起作用了,但是没有看到完整的stdlib logging API,芹菜和django都吓了一跳。

但是,只要芹菜和django不参与,修补日志就能很好地工作。

usercustomize.py:

位置/Users/myuser/Library/Python/3.8/lib/python/site-packages/usercustomize.py.Python非常关注这个位置,它是您在其中看到的。

$ python -m site

代码语言:javascript
复制
USER_SITE: '/Users/myuser/Library/Python/3.8/lib/python/site-packages'

您可以在那个位置放置一个指向usercustomize.py的符号链接。但是,这也意味着所有的代码都会受到日志记录的影响(尽管您可以使用一个环境变量来调用原始logging.getLogger)。

这主要是做我想做的事情(实际的代码有点复杂,但只是因为loguru不喜欢在早期被初始化),所以我不得不使用一个属性。

代码语言:javascript
复制
import logging

from loguru import logger

stdlib_getLogger = logging.getLogger

# configuration goes into an endless loop if done "too early"
# and `asyincio needs to be imported first for some reason
# I ended up using a class and @property
# but that has more to do with loguru than the core idea of replacement

# logger.configure(
# handlers=[
#     dict(sink=sys.stderr, format="[{time}] {message}"),
#     dict(sink="mylog.log", enqueue=True, serialize=True),
# ])




def custom_getLogger(name, *args, **kwargs):

    #loguru's
    return logger        

    #if you want to revert to stdlib conditionally
    return stdlib_getLogger(name, *args, **kwargs)

logging.getLogger = custom_getLogger
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64473157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档