有这样一个注册功能logger
import logging
def register_logger(
base_path: PathLike[str],
file_name: str,
register_name: str | None,
log_level: Any,
) -> logging.Logger:
path = Path(base_path, f"{file_name}.log")
logger = logging.getLogger(register_name)
logger.setLevel(level=log_level)
handler = logging.FileHandler(path, encoding="utf8")
formatter = logging.Formatter("\n%(asctime)s - %(levelname)s\n%(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
return logger
您需要注册两个处理程序:一个未命名,第二个有名称。按照惯例,它看起来像这样:
logger = register_logger(path, "server", None, 1)
logger_web = register_logger(path, "web", "web", 1)
# И допустим в другом файле
logger_web = logging.getLogger("web")
但是,当您尝试使用 时logger_web.error(...)
,后者会重复两个文件中的条目。与此同时,无名者logger
只写入自己的文件.../path/server.log
。
这里可能出了什么问题,如何避免重复条目?
因为当创建一个没有名称的记录器时,它被称为
root
记录器:它默认存在,并且是所有其他记录器所附加的根记录器。
因此,如果您想要绝对独立的记录器,请给它们两个名称:
更新:
如果此解决方案不合适,那么您可以对处理程序使用过滤器。
为此,您首先需要从根记录器中删除所有默认处理程序。然后添加您的处理程序,其中包含一个过滤器。
在过滤器中,我们将只接受来自根记录器的日志,所有其他日志都将被忽略。
我希望这个想法很清楚,这可以在您的函数中实现,例如通过检查
if register_name == None:
等。UPDUPD这是一个简单而简短的版本: