Изменение формата времени внутри журнала скрученной матрицы

как я могу изменить формат времени системы регистрации, используемой в TwistedMatrix?

я заметил из http://twistedmatrix.com/trac/browser/tags/releases/twisted-11.0.0/twisted/python/log.py#L389 нужно разрешить изменять формат времени, но у меня это не работает, здесь моя полная тестовая программа, которую я выполняю python myscript.py

from twisted.internet import endpoints, reactor

from twisted.python import log
from twisted.application.service import Application
from twisted.python.log import ILogObserver, FileLogObserver
from twisted.python.logfile import DailyLogFile

#[... here my definition of a ProxyFactory()...]

application = Application("myapp")
logfile = DailyLogFile("my.log", './')
flo = FileLogObserver(logfile)
flo.timeFormat = "%Y-%m-%d %H:%M:%S,%f%z"
application.setComponent(ILogObserver, flo.emit)

log.startLogging(logfile)
log.msg("this is a test")

endpoint = endpoints.serverFromString(reactor, portstr)
d = endpoint.listen(ProxyFactory())
d.addErrback(shutdown, reactor)
reactor.run()

не получить ожидаемое: "%Y-%m-%d %H:%M:%S,%f%z" (миллисекунды)

2013-06-12 17:08:07+0200 [-] Log opened.
2013-06-12 17:08:12+0200 [-] this is a test

что мне не хватает?

также:

  • как я должен изменить этот формат времени, когда мне не нужна регистрация файлов, а только печать stderr?

(другая ссылка: http://twistedmatrix.com/trac/ticket/3513)

РЕДАКТИРОВАТЬ: я попытался перефразировать два моих вопроса.

поэтому из ответа, опубликованного JeanPaul, я понимаю, что смешивал вещи и классический файл python с другим файлом tac (о котором я не знал, пока не прочитал JeanPaul). Кстати, я попробовал это ниже и все еще не получаю миллисекунды, которые мне нужны:

(на этот раз я запускаю twistd -noy my.tac)

from twisted.application.service import Application
from twisted.python.log import ILogObserver, FileLogObserver
from twisted.python.logfile import DailyLogFile

application = Application("myapp")
logfile = DailyLogFile("my.log", "./")
flo = FileLogObserver(logfile)
flo.timeFormat = "%Y-%m-%d %H:%M:%S,%f %z"
application.setComponent(ILogObserver, flo.emit)

и получить:

2013-06-13 17:23:23,%f+0000 [-] Log opened.
2013-06-13 17:23:23,%f+0000 [-] using set_wakeup_fd
2013-06-13 17:23:23,%f+0000 [-] twistd 12.0.0 (/usr/bin/python 2.7.3) starting up.
2013-06-13 17:23:23,%f+0000 [-] reactor class: twisted.internet.pollreactor.PollReactor.
2013-06-13 17:23:30,%f+0000 [-] Received SIGINT, shutting down.
2013-06-13 17:23:30,%f+0000 [-] Main loop terminated.
2013-06-13 17:23:30,%f+0000 [-] Server Shut Down.

как вы можете видеть, имитирую ли я то, что делается @ http://twistedmatrix.com/trac/browser/trunk/twisted/python/log.py#L351 , см. строку 367, python и время дают мне эти миллисекунды. обратите внимание также, что %Z неверен, он должен быть +0200, но я смогу жить с этим, пока мне нужны миллисекунды...

Python 2.7.3 (default, Jan  2 2013, 13:56:14)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> datetime.datetime.now().strftime("%H:%M:%S.%f")
'17:28:06.566135'
>>> import time
>>> when = time.time()
>>> import datetime
>>> datetime.datetime.fromtimestamp(when).strftime("%Y-%m-%d %H:%M:%S,%f%z")
'2013-06-13 17:33:20,535350'
>>> import twisted
>>> twisted.version
Version('twisted', 12, 0, 0)

person user2468222    schedule 12.06.2013    source источник


Ответы (2)


Здесь вы делаете несколько разных вещей для системы ведения журнала. Вы просите twistd использовать flo.emit в качестве наблюдателя журнала. Это вступит в силу после того, как twistd загрузит application, определенный в этом tac файле. Затем вы вручную инициализируете систему регистрации для использования logfile и немедленно регистрируете сообщение. Поскольку это часть файла tac, twistd еще не закончил загрузку application, поэтому он еще не применил конфигурацию ведения журнала, указанную вами с помощью ILogObserver. Вместо этого событие журнала обрабатывается наблюдателем журнала, который вы настроили с помощью startLogging - logfile, который ничего не знает о настраиваемом формате временных меток.

Отбросьте вызов startLogging, и вы должны увидеть, что события, зарегистрированные после загрузки application из файла tac, правильно отформатированы.

Вы можете прочитать все о том, как работает ведение журнала в Twisted, в руководстве по ведению журнала и как настроить его для twistd в инструкции по применению.

Также обратите внимание, что поддержка настраиваемого форматирования времени с использованием datetime.strftime была впервые появился в Twisted 13.0.0. Судя по вашему вопросу, у вас Twisted 12.0.0. Это означает, что форматирование выполняется с использованием time.strftime, которое не поддерживает микросекунды.

До Twisted 13.0.0, чтобы получить микросекунды в формате времени, вам нужно переопределить метод formatTime FileLogObserver и вызвать datetime.strftime самостоятельно.

person Jean-Paul Calderone    schedule 12.06.2013
comment
пожалуйста, что такое файл tac? я на самом деле очень скучаю по правильному примеру. - person user2468222; 13.06.2013
comment
Файл tac - это то, что вы написали. Это файл синтаксиса Python, который определяет глобальное имя application (и не вызывает reactor.run). - person Jean-Paul Calderone; 13.06.2013
comment
хорошо, так что есть недоразумение, поскольку моя программа - это то, что я написал первым, но она также содержит то, куда я поместил [...] многие другие мои собственные классы, а затем заканчивается частью реактора. запуска в том же файле. я только что удалил ненужные части для моего вопроса о журнале. - person user2468222; 13.06.2013
comment
Извините, я не понимаю, о чем вы сейчас спрашиваете. - person Jean-Paul Calderone; 13.06.2013
comment
пожалуйста, еще один вопрос, возможно ли изменить поведение и формат при использовании парадигмы log.startlogging(sys.stdout) по умолчанию?. огромное спасибо - person user2468222; 14.06.2013
comment
нет, startLogging создает для вас FileLogObserver; у вас нет возможности настроить его timeFormat. - person Jean-Paul Calderone; 14.06.2013

если это может помочь кому-то, вот оно (файл с именем my.tac)

я также заставил %z работать правильно (теперь я получаю +0200, как и ожидалось, при использовании моего собственного формата времени вместо +0000)

я называю это с помощью twistd -noy my.tac

(на основе http://twistedmatrix.com/trac/browser/trunk/twisted/python/log.py#L407 )

from twisted.application.service import Application
from twisted.python.log import ILogObserver, FileLogObserver
from twisted.python.logfile import DailyLogFile

from datetime import datetime

class MyFileLogObserver(FileLogObserver):

    def formatTime(self, when):
        """
        Format the given UTC value as a string representing that time in the
        local timezone.

        By default it's formatted as a ISO8601-like string (ISO8601 date and
        ISO8601 time separated by a space). It can be customized using the
        C{timeFormat} attribute, which will be used as input for the underlying
        L{datetime.datetime.strftime} call.

        BACKPORTED VERSION: and adding support for %z.

        @type when: C{int}
        @param when: POSIX (ie, UTC) timestamp for which to find the offset.

        @rtype: C{str}
        """
        tzOffset = -self.getTimezoneOffset(when)
        tzHour = abs(int(tzOffset / 60 / 60))
        tzMin = abs(int(tzOffset / 60 % 60))
        if tzOffset < 0:
            tzSign = '-'
        else:
            tzSign = '+'
        tz = "%s%02d%02d" % (tzSign, tzHour, tzMin)
        if self.timeFormat is not None:
            return datetime.fromtimestamp(when).strftime(self.timeFormat.replace("%z", tz))

        when = datetime.utcfromtimestamp(when + tzOffset)    
        return '%d-%02d-%02d %02d:%02d:%02d%s%02d%02d' % (
                when.year, when.month, when.day,
                when.hour, when.minute, when.second,
                tzSign, tzHour, tzMin)    

application = Application("myapp")
logfile = DailyLogFile("my.log", "./")
flo = MyFileLogObserver(logfile)
flo.timeFormat = "%Y-%m-%d %H:%M:%S,%f%z"
application.setComponent(ILogObserver, flo.emit)
person user2468222    schedule 13.06.2013
comment
отлично, что изменится, если я захочу отправлять журналы на stdout или как там это называется в Python? - person Patrizio Bertoni; 06.06.2015