Я немного новичок в Python, особенно в написании модулей и функций в нескольких файлах, а не только в сырых сценариях.
Я пишу приложение для командной строки и хотел бы иметь одну функцию (Я называю это argpconf
), который будет анализировать аргументы командной строки и соответственно устанавливать уровень журнала.Самое главное, я бы хотел, чтобы уровень журнала устанавливался один раз в этой функции и был бы одинаковым для всех модулей с минимальными издержками при создании их регистраторов.Кроме того, я хотел бы иметь возможность идентифицировать модуль, из которого пришло сообщение, используя общий форматер:
logging.Formatter("%(levelname)s : %(name)s : %(message)s")
Частично на основе шаблона cookiecutter , я создалследующие файлы:
├── api
│ ├── __init__.py
│ └── some_functionality.py
├── cli.py
├── core
│ ├── argpconf.py
│ ├── __init__.py
│ ├── logger.py
│ └── __version__.py
├── __init__.py
└── __main__.py
core/logger.py
имеет следующее содержание:
from logging import Formatter, Logger as _Logger, NullHandler, StreamHandler
class Logger(_Logger):
def __init__(self, name=None):
super(Logger, self).__init__(name or __name__.split(".")[0])
self.addHandler(NullHandler()) # default to no output
def start(self, level="WARN", stream=None,
fmt="%(levelname)s : %(name)s : %(message)s"):
handler = StreamHandler(stream)
handler.setFormatter(Formatter(fmt))
self.addHandler(handler)
self.setLevel(level.upper())
def stop(self):
for handler in self.handlers[1:]:
# Remove everything but the NullHandler.
self.removeHandler(handler)
logger = Logger()
По сравнению с идеями, предложенными в ответах на эти вопросы:
Мне очень нравится подход, использованный в шаблоне cookiecutter с регистратором, поскольку онпозволяет просто import logger
и иметь объект logger
, уровень логирования которого одинаков во всех модулях.Тем не менее, я не совсем доволен этим, потому что в моем случае argpconf.py
- первый модуль, который запускает logger
, поэтому все сообщения журнала от всех модулей заменяются на %(name)s
на core
, так как это argpconf.py
'* __name__.split(".")[0]
.
Как я могу улучшить модуль logger
, чтобы он обнаруживал вызывающий его модуль и печатал сообщения журнала с модулем как %(name)s
и, возможно, даже функцию, которая их печатает