python-3.x 一种为每个记录器示例更改记录器名称的简单方法

i34xakig  于 2023-01-03  发布在  Python
关注(0)|答案(1)|浏览(154)

我创建了一个根日志记录类,我想将其用于我正在部署的每个微服务功能。
输出日志示例:日志记录器在utils.logger中定义,因此它在日志中显示,因此是%(name)s
与使用logger = logging.getLogger(__name__)设置的相同根日志记录器名称不同,如何在示例化和调用日志记录器的位置获得点标记形式的相同结构?
即使在初始化对象时必须修改logger类以接受name参数,这也没问题,但我喜欢点标记法,因为我将拥有routes.users.functionaroutes.users.functionbroutes.database.functiona等文件。
所以我想显示日志记录来自哪个模块。看起来不明白logging在使用__name__时是如何捕获路径的。
另外,如果你有任何建议,使以下更强大:)这是我的类:

import typing
import logging

class GlobalLogger:

    MINIMUM_GLOBAL_LEVEL = logging.DEBUG
    GLOBAL_HANDLER = logging.StreamHandler()
    LOG_FORMAT = "[%(asctime)s] - %(levelname)s - [%(name)s.%(funcName)s:%(lineno)d] - %(message)s"
    LOG_DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S"

    def __init__(self, level: typing.Union[int, str] = MINIMUM_GLOBAL_LEVEL):
        self.level = level
        self.logger = self._get_logger()
        self.log_format = self._log_formatter()
        self.GLOBAL_HANDLER.setFormatter(self.log_format)

    def _get_logger(self):
        logger = logging.getLogger(__name__)
        logger.setLevel(self.level)
        logger.addHandler(self.GLOBAL_HANDLER)
        return logger

    def _log_formatter(self):
        return logging.Formatter(fmt=self.LOG_FORMAT, datefmt=self.LOG_DATETIME_FORMAT)
dgsult0t

dgsult0t1#

我想你误解了伐木的概念。
变量__name__保存了使用该变量的Python包的名称。我认为在您的情况下,它将具有定义class GlobalLogger的值。并且从何处创建类的示例并不重要。=〉使用print命令检查它。
在每个Python模块(*.py)的顶部,用logger = logging.getLogger(__name__)初始化模块日志记录器。在访问日志记录方法时,通过模块变量logger
日志记录数据会根据点标记自动传播到父日志记录器。如果您有模块A.B. C,数据传播C-〉B-〉A。输出处理程序,格式可以为每个日志记录器或只为根日志记录器定义,例如:A或仅(空)""
我通常有函数InitLogging,在这里我得到根日志的句柄并设置输出句柄,你不需要在每个模块中设置日志句柄。
结论:

  • 如果你仍然想使用你的类,把你的日志记录器的名字作为命名参数输入到__init__中。当你创建你的类的示例时,在初始化过程中使用变量__name__
  • 我认为没有必要创建这么多特定的日志记录器类。您可以稍后定义日志记录器属性。

相关问题