Настроить ведение журнала для внешних/сторонних библиотек
Я следил за советами django docs и использовал журнал, например:
import logging
logger = logging.getLogger(__name__)
def today(...):
logger.info('Sun is shining, the weather is sweet')
С моей текущей конфигурацией вывод выглядит следующим образом:
2016-08-11 14:54:06 mylib.foo.today: INFO Sun is shining, the weather is sweet
К сожалению, некоторые библиотеки, которые я не могу изменить, используют запись таким образом:
import logging
def third_party(...):
logging.info('Make you want to move your dancing feet')
Выход к сожалению выглядит следующим образом:
2016-08-09 08:28:04 root.third_party: INFO Make you want to move your dancing feet
Я хочу увидеть это:
2016-08-09 08:28:04 other_lib.some_file.third_party: INFO Make you want to move your dancing feet
Разница:
root.third_party == > other_lib.some_file.third_party
Я хочу увидеть длинную версию (не root
), если код использует logging.info()
вместо logger.info()
Обновление
Это не дубликат Элегантная настройка ведения журнала Python в Django, поскольку его решение:
Начало цитаты
В каждом модуле я определяю логгер, используя
logger = logging.getLogger(__name__)
Конец цитаты.
Нет, я не буду изменять сторонний код, который использует logging.info()
вместо logger.info()
.
Следующий вопрос
Избегайте logger=logging.getLogger(__name__)
без потери способа фильтрации журналов
Ответы
Ответ 1
Как предложил Уэйн Вернер, я буду использовать параметры формата записи журнала. Вот пример.
Файл 1: external_module
import logging
def third_party():
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger()
logger.info("Hello from %s!"%__name__)
Файл 2: main
import external_module
import logging
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(module)s.%(funcName)s: %(levelname)s %(message)s')
logger = logging.getLogger(__name__)
def cmd():
logger.info("Hello from %s!"%__name__)
external_module.third_party()
cmd()
Вывод:
2016-08-11 09:18:17,993 main.cmd: INFO Hello from __main__!
2016-08-11 09:18:17,993 external_module.third_party(): INFO Hello from external_module!
Ответ 2
Это потому, что они используют корневой журнал (это то, что вы получаете по умолчанию, когда вы просто делаете
import logging
logging.info("Hi! I'm the root logger!")
Если вы хотите сделать что-то другое, у вас есть два (или три) варианта. Лучше всего было бы использовать "Параметры записи журнала" . Кроме того, вы можете обезвредить библиотеки, которые вы используете, например
import logging
import mod_with_lazy_logging
mod_with_lazy_logging.logger = logging.getLogger(mod_with_lazy_logging.__name__)
Или вы можете сделать что-то грубое с разбором аш и переписыванием своих битов кода ведения журнала. Но не делайте этого.