我创建了一个根日志记录类,我想将其用于我正在部署的每个微服务功能。
输出日志示例:日志记录器在utils.logger
中定义,因此它在日志中显示,因此是%(name)s
。
与使用logger = logging.getLogger(__name__)
设置的相同根日志记录器名称不同,如何在示例化和调用日志记录器的位置获得点标记形式的相同结构?
即使在初始化对象时必须修改logger类以接受name
参数,这也没问题,但我喜欢点标记法,因为我将拥有routes.users.functiona
、routes.users.functionb
、routes.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)
1条答案
按热度按时间dgsult0t1#
我想你误解了伐木的概念。
变量
__name__
保存了使用该变量的Python包的名称。我认为在您的情况下,它将具有定义class GlobalLogger
的值。并且从何处创建类的示例并不重要。=〉使用print命令检查它。在每个Python模块(
*.py
)的顶部,用logger = logging.getLogger(__name__)
初始化模块日志记录器。在访问日志记录方法时,通过模块变量logger
。日志记录数据会根据点标记自动传播到父日志记录器。如果您有模块A.B. C,数据传播C-〉B-〉A。输出处理程序,格式可以为每个日志记录器或只为根日志记录器定义,例如:
A
或仅(空)""
。我通常有函数InitLogging,在这里我得到根日志的句柄并设置输出句柄,你不需要在每个模块中设置日志句柄。
结论:
__init__
中。当你创建你的类的示例时,在初始化过程中使用变量__name__
。