自定义模块的Python日志记录

pbpqsu0x  于 2022-12-02  发布在  Python
关注(0)|答案(1)|浏览(139)

我希望为我的模块实现自定义日志记录。
我面临的问题是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")

以下是每种情况的输出:
第一个

nnvyjq4y

nnvyjq4y1#

如果你的目的是在默认情况下禁用日志记录,让用户实现自己的日志记录级别,这与Python包实现日志记录的方式类似a-需要使用NullHandler

import logging
logging.getLogger('foo').addHandler(logging.NullHandler())

来源:有关如何为Python库配置日志记录的日志记录文档
对于您的其他问题:

  • *setLevel(0)不禁用日志记录 *:我怀疑发生了覆盖,因此该级别被其他一些配置覆盖
  • *basicConfig(级别=0)重复错误 *:可能会发生继承,导致日志重复,您需要将propagate设置为False

资料来源:伐木业面临的常见问题

相关问题