Подтвердить что ты не робот

Настроить ведение журнала для внешних/сторонних библиотек

Я следил за советами 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__) без потери способа фильтрации журналов

4b9b3361

Ответ 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__)

Или вы можете сделать что-то грубое с разбором аш и переписыванием своих битов кода ведения журнала. Но не делайте этого.