#python
#python
Вопрос:
Есть ли способ получения / возврата сообщения из вызова logging.debug()?
Спасибо
Комментарии:
1. Вы должны рассказать нам кое-что о контексте: вы написали код ведения журнала самостоятельно или хотите перехватывать сообщения журнала из другого модуля / фреймворка / чего угодно?
2. привет, дас, причина, по которой я спрашиваю, заключается в том, что я запускаю (используя подпроцесс. Откройте) несколько дочерних процессов (программ на c ) и создайте для каждого регистратор python. Выходные данные от каждого процесса регистрируются в каждом регистраторе процессов. Я хотел иметь «главный» журнал, который содержит выходные данные каждого процесса, чтобы каждая запись в главном журнале содержала имя регистратора каждого процесса в качестве идентификатора
Ответ №1:
Да, предоставление механизма для простого захвата и перенаправления сведений о событии, не требующего каких-либо изменений в коде, генерирующем события, является всей целью logging
модуля.
Все, что вам нужно сделать, это включить соответствующий вызов logging.basicConfig()
при запуске вашего приложения, и вы сможете отправлять зарегистрированные события куда пожелаете.
Проще всего просто войти в stdout
:
import logging
import sys
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
Для получения более продвинутых опций я предлагаю ознакомиться с руководством по ведению журнала в официальной документации.
Если вы хотите получить программный доступ к форматированному сообщению в момент выполнения вызова … тогда logging
модуль является неподходящим инструментом для этой работы. Он предназначен для отправки событий, а не для использования в качестве альтернативы прямому вызову str.format
.
Для случая, который вы описываете в своем комментарии, вы можете рассмотреть настройку иерархического ведения журнала в следующих строках:
>>> import logging
>>> import sys
>>> logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
>>> master = logging.getLogger("master")
>>> child1 = logging.getLogger("master.child1")
>>> child2 = logging.getLogger("master.child2")
>>> child1.debug("Event from child 1")
DEBUG:master.child1:Event from child 1
>>> child2.debug("Event from child 2")
DEBUG:master.child2:Event from child 2
При этой настройке обратите внимание, что я настроил обработчик только на корневом уровне иерархии (как часть basicConfig()
вызова). logging
понимает обозначение «parent.child» в именах регистраторов, поэтому оно будет передавать любые события, переданные дочерним регистраторам, главному регистратору, который, в свою очередь, передает их корневому регистратору.
Вы можете добавить дополнительные обработчики ведения журнала на уровнях master
и child
по мере необходимости, чтобы перенаправлять выходные данные туда, куда вы пожелаете.
Комментарии:
1. спасибо ncoghlan. Причина, по которой я спрашиваю, заключается в том, что я запускаю (используя подпроцесс. Откройте) несколько дочерних процессов (программ на c ) и создайте регистратор для каждого. Выходные данные от каждого процесса регистрируются в каждом регистраторе процессов. Я хотел иметь «главный» журнал, который содержит выходные данные каждого процесса, чтобы каждая запись в главном журнале содержала имя регистратора каждого процесса в качестве идентификатора
2. Обновил мой ответ — иерархические имена регистраторов должны делать именно то, что вам нужно.
Ответ №2:
Может быть, заменить logging.debug
при запуске?
import logging
d = logging.debug
def myDebug(*args):
print "I'm a spy", args
d(*args)
logging.debug = myDebug
Комментарии:
1. НИКОГДА не делайте этого. Нет абсолютно никаких веских причин для исправления модуля ведения журнала, учитывая огромный уровень конфигурируемости, который он предоставляет изначально.
Ответ №3:
Ну, logging.debug обычно выполняет запись в файл. вы можете прочитать этот файл с помощью open()
функции.
Комментарии:
1. Вы также можете не использовать «.exe» для Windows. Это сохранит все выходные данные в этот текстовый файл.
2. @khchik: Я удалил свой первый ответ, потому что я неправильно понял вопрос
3.
logging.debug()
запись в файл выполняется только в том случае, если вы настроили их на это.4. @ncoghlan: добавлено «обычно» 😉
5. Что ж, верно, обычно это разумный способ его настройки. Я предполагаю, исходя из формулировки вопроса, что в данном конкретном случае он вообще не был настроен 🙂