我希望为我的模块实现自定义日志记录。
我面临的问题是setLevel(0)没有禁用日志记录,basicConfig(level=0)使用默认格式复制错误。
我的目标是在不影响用户的情况下默认禁用我的模块日志记录,并允许用户导入日志记录和我的模块,只启用所需的日志级别logging.getLogger('rapidTk').setLevel(99)
rapidTk/__init__.py
from .rTkLogging import rTkLogger
import logging
logging.setLoggerClass(rTkLogger)
rtklog = logging.getLogger('rapidTk')
rtklog.setLevel(0)
rapidTk/rTkLogger.py
import logging
RTKLOG = 1
class rTkLogger(logging.Logger):
logging.addLevelName(RTKLOG, 'rTk_Log')
def __init__(self, name):
super(rTkLogger, self).__init__(name)
handler = logging.StreamHandler()
fmat = logging.Formatter('%(asctime)s %(levelname)s %(filename)s(%(lineno)d) - %(message)s')
handler.setFormatter(fmat)
hndlr = self.addHandler(handler)
self.setLevel(0)
def rtklog(self, msg, *args, **kwargs):
print(self.getEffectiveLevel(), 'is the effective level')
if self.getEffectiveLevel() >= RTKLOG and self.isEnabledFor(self.getEffectiveLevel()):
super()._log(RTKLOG, msg, args, **kwargs)
rapidTk/rTkUtils.py
from functools import wraps
from time import perf_counter
import logging
def time_it(func):
def wrapper(*args, **kwargs):
start = perf_counter()
fn = func
rs = fn(*args, **kwargs)
t = perf_counter()-start
logging.getLogger('rapidTk').rtkdebug(f'{fn.__name__} finished in {t}')
return rs
return wrapper
projects/mypythonscript.py
import logging
#logging.basicConfig(level=10) ## duplicates the log if level is enabled.
import time
from rapidTk import *
from rapidTk.rTkUtils import time_it
#rtklog = logging.getLogger('rapidTk')
#rtklog.setLevel(0) ##makes no changes
@time_it
def runner():
print("hello")
time.sleep(1)
print("World")
if __name__ == "__main__":
runner()
print("done")
以下是每种情况的输出:
第一个
1条答案
按热度按时间nnvyjq4y1#
如果你的目的是在默认情况下禁用日志记录,让用户实现自己的日志记录级别,这与Python包实现日志记录的方式类似a-需要使用
NullHandler
。来源:有关如何为Python库配置日志记录的日志记录文档
对于您的其他问题:
propagate
设置为False资料来源:伐木业面临的常见问题