1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- # -*- test-case-name: twisted.logger.test.test_file -*-
- # Copyright (c) Twisted Matrix Laboratories.
- # See LICENSE for details.
-
- """
- File log observer.
- """
-
- from zope.interface import implementer
-
- from twisted.python.compat import ioType, unicode
- from ._observer import ILogObserver
- from ._format import formatTime
- from ._format import timeFormatRFC3339
- from ._format import formatEventAsClassicLogText
-
-
-
- @implementer(ILogObserver)
- class FileLogObserver(object):
- """
- Log observer that writes to a file-like object.
- """
- def __init__(self, outFile, formatEvent):
- """
- @param outFile: A file-like object. Ideally one should be passed which
- accepts L{unicode} data. Otherwise, UTF-8 L{bytes} will be used.
- @type outFile: L{io.IOBase}
-
- @param formatEvent: A callable that formats an event.
- @type formatEvent: L{callable} that takes an C{event} argument and
- returns a formatted event as L{unicode}.
- """
- if ioType(outFile) is not unicode:
- self._encoding = "utf-8"
- else:
- self._encoding = None
-
- self._outFile = outFile
- self.formatEvent = formatEvent
-
-
- def __call__(self, event):
- """
- Write event to file.
-
- @param event: An event.
- @type event: L{dict}
- """
- text = self.formatEvent(event)
-
- if text is None:
- text = u""
-
- if self._encoding is not None:
- text = text.encode(self._encoding)
-
- if text:
- self._outFile.write(text)
- self._outFile.flush()
-
-
-
- def textFileLogObserver(outFile, timeFormat=timeFormatRFC3339):
- """
- Create a L{FileLogObserver} that emits text to a specified (writable)
- file-like object.
-
- @param outFile: A file-like object. Ideally one should be passed which
- accepts L{unicode} data. Otherwise, UTF-8 L{bytes} will be used.
- @type outFile: L{io.IOBase}
-
- @param timeFormat: The format to use when adding timestamp prefixes to
- logged events. If L{None}, or for events with no C{"log_timestamp"}
- key, the default timestamp prefix of C{u"-"} is used.
- @type timeFormat: L{unicode} or L{None}
-
- @return: A file log observer.
- @rtype: L{FileLogObserver}
- """
- def formatEvent(event):
- return formatEventAsClassicLogText(
- event, formatTime=lambda e: formatTime(e, timeFormat)
- )
-
- return FileLogObserver(outFile, formatEvent)
|