[Twisted-Python] Persuading Python's Logging to use twisted.logger
Glyph
glyph at twistedmatrix.com
Sat May 21 19:44:32 MDT 2016
> On May 10, 2016, at 4:23 PM, Daniel Sutcliffe <dansut at gmail.com> wrote:
>
> Thanks for all the hints and suggestions guys, this was far simpler
> than I thought it would be and the results are exactly what I imagined
> without too much effort.
Fantastic!
> Jeff: Have to admit I started with your code and had it working with
> in my scenario in no time at all, this was a great bump start, but I
> couldn't help tweaking...
>
> Glyph: The code below is I'm sure far from perfect, and it doesn't
> take your advice and convert the msg into a twisted format string, it
> takes the simpler approach of letting the Logging record pre-format
> using the getMessage() method. I'm sure there are loads of edge cases
> it could cope with better with maybe it is a start of something that
> could be included in Twisted.
The main reason I wanted to do the format-string translation is that it would allow the key/value pairs to be stored according to the same idiom that Twisted uses, and therefore be serialized to jsonFileLogObserver and consequently things like LogStash / ElasticSearch.
> Kevin: I appreciate your input and understand the need to always be
> aware of what you are call/using may be blocking for various reasons -
> I will eventually want to redirect to syslog so will need to deal with
> this later. I still think it makes sense to have a relatively easy
> option of redirecting STDLib logging from used modules to
> twisted.logger available, as well as the opposite. When twistd is
> handling most of logging setup it seems the simpler path to have
> everything using twisted.logger.
>
> Burak: Your code was especially helpful - it goes much further than I
> even considered is useful so I just borrowed what I thought was
> essential for the needs of this first pass. Will be glad to hear of
> any cases you think will break this code to help make it even more
> general.
>
> So here's the code I dropped into a logfudger.py in my test dir. All
> feedback encouraged as I really am just finding my way around Python,
> and appreciate all critique of what I could do better:
>
> from twisted.logger import Logger, LogLevel
> import logging
> LEVEL_SYS2TWISTED = {
> logging.DEBUG: LogLevel.debug,
> logging.INFO: LogLevel.info,
> logging.WARN: LogLevel.warn,
> logging.ERROR: LogLevel.error,
> logging.CRITICAL: LogLevel.critical,
> }
> class TwistedLoggerHandler(logging.Handler):
> def __init__(self):
> self._log = Logger()
> logging.Handler.__init__(self)
> def flush(self):
> pass
> def emit(self, record):
> try:
> self._log.namespace=record.name
> self._log.source=record.pathname
> self._log.emit(
> LEVEL_SYS2TWISTED[record.levelno],
> record.getMessage(),
> lineno=record.lineno, args=record.args)
> except:
> self.handleError(record)
>
> When I use this with pymodbus I then just need to include this with my code:
>
> import logging
> from logfudger import TwistedLoggerHandler
> sysliblog = logging.getLogger("pymodbus")
> sysliblog.addHandler(TwistedLoggerHandler())
> sysliblog.setLevel(logging.DEBUG)
> from twisted.logger import Logger, globalLogBeginner, textFileLogObserver
> import sys
> globalLogBeginner.beginLoggingTo([textFileLogObserver(sys.stderr)])
>
> Which gives me a stderr output like:
>
> 2016-05-10T18:48:52-0400 [pymodbus#info] Informational
> 2016-05-10T18:48:52-0400 [__main__.MBClientFactory#info] Starting
> factory <__main__.MBClientFactory instance at 0x0000000001212ae0>
> 2016-05-10T18:48:52-0400 [__main__.MBClientProtocol#debug] Protocol
> connectionMade
> 2016-05-10T18:48:52-0400 [pymodbus.client.async#debug] Client
> connected to modbus server
> 2016-05-10T18:48:52-0400 [pymodbus.transaction#debug] adding transaction 1
>
> I don't deal with exceptions logged through the STDLib logging at all,
> and the log_namespace, log_source could probably be set in ways that
> cover more use cases.
> But hopefully this all makes sense and this can be a start of
> something much more generically useful.
Yep! This is definitely something handy. Would you mind filing an issue for it?
-glyph
More information about the Twisted-Python
mailing list