Захват / возврат выходного сообщения ведения журнала python

#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. Что ж, верно, обычно это разумный способ его настройки. Я предполагаю, исходя из формулировки вопроса, что в данном конкретном случае он вообще не был настроен 🙂