Python-Как очистить журнал? (Джанго) - программирование

Python-Как очистить журнал? (Джанго)

Я работаю с Django-нерелом в Google App Engine, что заставляет меня использовать logging.debug() вместо print().

Модуль "logging" предоставляется Django, но я использую его не грубо, а не print().

Например, если мне нужно проверить содержимое, содержащееся в переменной x, я поставлю logging.debug('x is: %s' % x). Но если программа выйдет из строя вскоре после (без промывки потока), она никогда не будет напечатана.

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

4b9b3361

Ответ 1

Я думаю, это может сработать для вас, если вы используете только один (или по умолчанию) обработчик:

>>> import logging
>>> logger = logging.getLogger()
>>> logging.debug('wat wat')
>>> logger.handlers[0].flush()

Однако в документе было немного нахмурилось.

Код приложения не должен напрямую создавать экземпляры и использовать экземпляры Handler. Вместо этого класс Handler является базовым классом, который определяет интерфейс, который должен иметь все обработчики, и устанавливает поведение по умолчанию, которое дочерние классы могут использовать (или переопределять). http://docs.python.org/2/howto/logging.html#handler-basic

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

Ответ 2

Запись в Django зависит от стандартного модуля ведения журнала python.

Этот модуль имеет метод на уровне модуля: logging.shutdown(), который сбрасывает все обработчики и отключает систему ведения журнала (т.е. журнал не может использоваться больше после его вызова)

Проверка кода этой функции показывает, что в настоящее время (python 2.7) модуль протоколирования содержит список слабых ссылок на все обработчики в переменной уровня модуля с именем _handlerList, поэтому все обработчики могут быть сброшены, делая что-то вроде

[h_weak_ref().flush() for h_weak_ref in logging._handlerList]

потому что это решение использует внутренности модуля @Mikes выше, это лучше, но оно зависит от доступа к регистратору, его можно обобщить следующим образом:

 [h.flush() for h in my_logger.handlerList]

Ответ 3

Я боролся с подобной проблемой, и вот как я ее решил. Вместо использования модуля logging непосредственно для вывода ваших журналов инициализируйте свой собственный журнал следующим образом:

import sys
import logging


def init_logger():
    logger = logging.getLogger()

    h = logging.StreamHandler(sys.stdout)
    h.flush = sys.stdout.flush
    logger.addHandler(h)

    return logger

Затем используйте его вместо logging в вашем коде:

def f():
    logger = init_logger()
    logger.debug('...')

В результате у вас больше не будет проблем с очисткой журналов.

Ответ 4

Если вариант использования заключается в том, что у вас есть программа python, которая должна очищать свои журналы при выходе, используйте logging.shutdown().

Из документации python:

logging.shutdown()

Сообщает системе регистрации, чтобы выполнить упорядоченное выключение путем промывки и закрытия всех обработчиков. Это следует назвать при выходе приложения и дальнейшее использование системы каротажа не должно быть сделанный после этого вызова.