[Twisted-Python] Configuring Twisted logging via plugins

exarkun at twistedmatrix.com exarkun at twistedmatrix.com
Thu Aug 5 11:36:44 MDT 2010


On 05:25 pm, glyph at twistedmatrix.com wrote:
>On Aug 5, 2010, at 12:44 AM, Valeriy Zamarayev wrote:
>>Hello, all.
>>
>>There have been a few questions on this list about how to configure
>>Twisted logging via plugins, as opposed to .tac files. And we now know
>>about the #638 and #3534 tickets. Hopefully, they will be resolved
>>soon.
>>
>>But before this happens, it seems to me there's no other way to handle
>>this than to use a "monkey patching" techinque on Twisted (excluding
>>patching the Twisted source code itself).
>>
>>We need to access the 'application' object when the server starts. We
>>can do this when the 'twistd' code calls setServiceParent on the
>>service returned by the plugin. So if we wrap setServiceParent, we can
>>access the application object and do what we want.
>>
>>See the code:  http://gist.github.com/505926
>>
>>This works for me. I don't know if a better and less dangerous way to
>>achieve the same exists. Maybe there is one?
>
>
>This actually looks pretty ingenious to me!  It uses public APIs... 
>mostly.  I'd have to think pretty hard about whether this particular 
>interface is actually supported, of course, since you're depending on 
>extra stuff from your service parent which hypothetically may not 
>actually be there.
>
>If you're looking for aesthetic advice, it would be a bit nicer to use 
>something like proxyForInterface and wrap the underlying service, 
>rather than setting an attribute on it and clobbering its 
>setServiceParent method.
>
>Also... you could write a twistd plugin that could be used directly, 
>instead of code that needs to be adapted / re-written for each 
>different twistd plugin.  Your code can scan the IServiceMaker plugin 
>registry just as well as twistd itself can.
>
>So you could have
>
>  twistd my-custom-logger --my-log-option-1 --my-log-option-2 web --path 
>~/public_html
>
>and have the my-custom-logger plugin delegate to all twistd 
>subcommands.
>
>That's a pattern which should remain useful even after #638 is fixed.
>
>Code to do this properly is left as an exercise for the reader, of 
>course :).

This is probably possible, but not using the twisted.python.usage 
options parser, which doesn't support multiple subcommands.  This 
solution has been discussed on IRC before and probably the lack of 
multiple subcommand support in the options parser is the only reason it 
hasn't been implemented.

I think there was some consensus on an alternate way to spell this 
combination, but I don't remember what it was right now.  It's probably 
in someone's IRC logs.

Jean-Paul




More information about the Twisted-Python mailing list