2010-09-13 49 views

回答

5

我正在努力解决类似的问题。 The first result on Google for "twisted logs" is pretty helpful 该网页导致我Application page其中有定制的应用程序的记录行为的一个例子:

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", "/tmp") 
application.setComponent(ILogObserver, FileLogObserver(logfile).emit) 

我猜我可以做到这一点,并使用FileLogObserver的自定义子类。我去了,看着那个代码/usr/lib/python2.6/dist-packages/twisted/python/log.py

这里是

class FileLogObserver: 
    """ 
    Log observer that writes to a file-like object. 

    @type timeFormat: C{str} or C{NoneType} 
    @ivar timeFormat: If not C{None}, the format string passed to strftime(). 
    """ 
    timeFormat = None 

    def __init__(self, f): 
     self.write = f.write 
     self.flush = f.flush 

    def getTimezoneOffset(self, when): 
     """ 
     Return the current local timezone offset from UTC. 

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

     @rtype: C{int} 
     @return: The number of seconds offset from UTC. West is positive, 
     east is negative. 
     """ 
     offset = datetime.utcfromtimestamp(when) - datetime.fromtimestamp(when) 
     return offset.days * (60 * 60 * 24) + offset.seconds 

    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 
     C{time.strftime} call. 

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

     @rtype: C{str} 
     """ 
     if self.timeFormat is not None: 
      return time.strftime(self.timeFormat, time.localtime(when)) 

     tzOffset = -self.getTimezoneOffset(when) 
     when = datetime.utcfromtimestamp(when + tzOffset) 
     tzHour = abs(int(tzOffset/60/60)) 
     tzMin = abs(int(tzOffset/60 % 60)) 
     if tzOffset < 0: 
      tzSign = '-' 
     else: 
      tzSign = '+' 
     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) 

    def emit(self, eventDict): 
     text = textFromEventDict(eventDict) 
     if text is None: 
      return 

     timeStr = self.formatTime(eventDict['time']) 
     fmtDict = {'system': eventDict['system'], 'text': text.replace("\n", "\n\t")} 
     msgStr = _safeFormat("[%(system)s] %(text)s\n", fmtDict) 

     util.untilConcludes(self.write, timeStr + " " + msgStr) 
     util.untilConcludes(self.flush) # Hoorj! 

    def start(self): 
     """ 
     Start observing log events. 
     """ 
     addObserver(self.emit) 

    def stop(self): 
     """ 
     Stop observing log events. 
     """ 
     removeObserver(self.emit) 

我知道这是不是一个解决方案,但这是我迄今为止所了解到的。如果我想出其他东西,我会发布它。

+0

谢谢,I”米也是这样。 – 2010-09-13 21:39:59

3

这里是我重写发射功能:

from twisted.python import log, util 
from twisted.internet import reactor 
from twisted.application.service import Application 

def myFLOemit(self,eventDict): 
    """Custom emit for FileLogObserver""" 
    text = log.textFromEventDict(eventDict) 
    if text is None: 
    return 
    self.timeFormat='[%Y-%m-%d %H:%M:%S]' 
    timeStr = self.formatTime(eventDict['time']) 
    fmtDict = {'text': text.replace("\n", "\n\t")} 
    msgStr = log._safeFormat("%(text)s\n", fmtDict) 
    util.untilConcludes(self.write, timeStr + " " + msgStr) 
    util.untilConcludes(self.flush) 

# Overwrite twistd's FileLogObserver formatting 
log.FileLogObserver.emit=myFLOemit 
# Start the app 
application=Application("fileget") 
reactor.callWhenRunning(log.msg,"No system here!") 

和所得到的输出:

$ twistd -noy myapp.tac 
[2012-02-06 12:32:22] Log opened. 
[2012-02-06 12:32:22] twistd 11.1.0 (/usr/bin/python2 2.7.2) starting up. 
[2012-02-06 12:32:22] reactor class: twisted.internet.pollreactor.PollReactor. 
[2012-02-06 12:32:22] No system here! 
+1

猴子修补全球功能(这是一种方法,但它仍然是全球性的 - 每个人都分享它):不是一个好主意。 Nathan的答案好多了。 – 2012-02-06 22:36:09

+1

我可以像这样在应用程序上使用setComponent:http://snipt.org/zppK0但是twistd的-l完全被忽略。你有建议适用于标准输出和日志文件吗? – 2012-02-07 18:55:14

+0

我想通过检查如何调用twistd来使用自定义观察者:http://snipt.org/uIL0 – 2012-02-10 19:16:36

0

使用@ Nathan的方向一个完整的例子: