2013-06-12 4 views
3

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

я заметил из http://twistedmatrix.com/trac/browser/tags/releases/twisted-11.0.0/twisted/python/log.py#L389 что один должен иметь возможность изменить TimeFormat, но он не работает для меня, вот моя полная программа тест, который я исполняю 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% г" (миллисекунды)

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)

EDIT: я попытался перефразировать мои два вопроса.

поэтому из ответа, отправленного 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. 

, как вы можете видеть, если i имитирую, что сделано @http://twistedmatrix.com/trac/browser/trunk/twisted/python/log.py#L351, см. строку 367, питон и время дают мне миллисекунды. Уведомление также% 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) 

ответ

3

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

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

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

Также обратите внимание, что поддержка custom time formatting using datetime.strftime была first introduced in Twisted 13.0.0. Из вывода в вашем вопросе, похоже, что у вас есть Twisted 12.0.0. Это означает, что форматирование выполняется с использованием time.strftime, который не поддерживает микросекунды.

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

+0

пожалуйста, что это 'tac' файл? На самом деле я действительно скучаю по правильному примеру. – user2468222

+0

Файл 'tac' - это то, что вы написали. Это файл синтаксиса Python, который определяет глобальное имя 'application' (и это не называется' reactor.run'). –

+0

ОК, поэтому есть недоразумение, так как моя программа - это то, что я написал в первую очередь, но она содержит также, где я помещаю [...] многие другие мои собственные классы, а затем завершает работу с реакторной частью в том же файле. Я просто удалю ненужные части для моего вопроса о журнале. – user2468222

1

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

я также сделал% г правильно работать (я теперь получить +0200, как и ожидалось, используя свой собственный TimeFormat вместо +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) 
+0

отлично, что изменится, если я хотел бы нажать журналы на 'stdout' или что-то еще, что он вызвал в Python? –

Смежные вопросы