这是而不是关于logging替代方案的建议的问题。
然而,我想尝试一些替代的伐木程序,比如Twiggy或Loguru。或者别的什么。问题是,虽然logging的配置是集中式的,但对记录器的获取却充斥着代码库。
采集码
import logging # I'd like to import an alternative here.
logger = logging.getLogger(__name__)有多少个实例
(基本上,每个使用日志记录的.py文件都有这2行代码)
ack -l --python logging.getLogger | wc -l
193当调用logging.getLogger时,有哪些好的方法可以绕过stdlib日志记录并返回一个Loguru或Twiggy?
我能想到几个:
logging.py早于stdlib版本logging并将logging.getLogger设置为自定义工厂函数,从而对它进行猴子切换,从而返回一个Loguru或其他任何选项。是否有人试图在不修改每个logging调用的情况下交换logging.getLogging?你是怎么做到的?
此外,这是在Django网络应用程序的上下文中。不过,我不想和settings.LOGGING混在一起。
作为参考,这是一个Loguru记录器获取和类型的代码,我绝对希望避免在200+文件分发之前,发现Loguru不适合我的需要。
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")
发布于 2020-10-21 23:58:11
由于您计划更改记录器,所以首先集中代码是有意义的,以便以后可以轻松地更改代码。
因此,您可以创建一个新的日志模块,它的行为与内置的logging类似,并将所有导入替换为
import my.logging.module然后在需要实现不同的记录器时修改my.logging.module。
在my.logging.module中,您可以选择使用一些特殊的逻辑(在不同的记录器之间切换等)实现自己的函数,或者只对默认行为执行讨厌的from logging import *;
发布于 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
USER_SITE: '/Users/myuser/Library/Python/3.8/lib/python/site-packages'您可以在那个位置放置一个指向usercustomize.py的符号链接。但是,这也意味着所有的代码都会受到日志记录的影响(尽管您可以使用一个环境变量来调用原始logging.getLogger)。
这主要是做我想做的事情(实际的代码有点复杂,但只是因为loguru不喜欢在早期被初始化),所以我不得不使用一个属性。
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_getLoggerhttps://stackoverflow.com/questions/64473157
复制相似问题