Добавление штампа времени в Python печати


Я пытаюсь отладить поведение большой библиотеки, от которой я завишу, которая использует разброс (не делайте этого изобилия) операторов debug print через свои многочисленные исходные файлы. Проблема в том, что большинство, если не все из этих операторов печати отладки не содержат отметку даты/времени, поэтому трудно связать сбои на уровне приложения с сбоями в самом коде библиотеки.

Вместо того, чтобы изменять исходный код для всех отладочных принтеров, которые предположительно участвуют в неудача, которую я вижу, я подумал, что может быть возможно обезьяна патч встроенный Python print "function" временно, чтобы все выходные данные были префиксированы с меткой времени.

Поскольку встроенная функцияprint не является функцией в среде Python 2.6, с которой я работаю, я не знаю, возможно ли это. Если кто-то сделал это или достиг аналогичного результата, используя другой крюк в Python, то я был бы благодарен за ваш совет, или даже лучше код для решения проблемы. эта проблема.

2 9

2 ответа:

Поскольку вы не можете переопределить функцию write (она доступна только для чтения), простой патч обезьяны может выглядеть следующим образом (добавление метки времени к каждой напечатанной строке):

old_f = sys.stdout
class F:
    def write(self, x):
        old_f.write(x.replace("\n", " [%s]\n" % str(datetime.now())))
sys.stdout = F()

Пример будет выглядеть так:

>>> print "foo"
foo [2011-02-03 09:31:05.226899]

Альтернативное решение, что отметкой времени является начало (предпослано) вместо конца (приложено):

old_out = sys.stdout


class St_ampe_dOut:
    """Stamped stdout."""

    nl = True

    def write(self, x):
        """Write function overloaded."""
        if x == '\n':
            old_out.write(x)
            self.nl = True
        elif self.nl:
            old_out.write('%s> %s' % (str(dt.now()), x))
            self.nl = False
        else:
            old_out.write(x)

sys.stdout = St_ampe_dOut()