On Sat, Jun 15, 2013 at 2:18 AM, Hynek Schlawack <h...@ox.cx> wrote: > > Am 15.06.2013 um 08:18 schrieb Christopher Armstrong > <ra...@twistedmatrix.com>: >> What do you think of this for an API that meets in the middle? >> >> https://gist.github.com/radeex/5787124 >> >> This example implementation only concerns itself with the points under >> debate right now; obviously it's completely unusable in general. But >> anyway: >> >> 1. it supports English logs >> 2. it doesn't require you to specify a formatting if you want to just >> log a bunch of data >> 3. it makes it easy to specify a system (both manually and based on >> the module your code is in) > > I’ve held back from this discussion so far because it seemed to me that I > always missed some part of the discussion to fully understand what you’re all > talking about. I would like to comment on this concrete proposal though > before I hold my peace forever. (NB I’m not replying just to Christopher but > try to address everything I saw on the thread so far – I like most of his > proposal.) > > I find that there’s some kind of false dichotomy brought up in this > discussion and API and output are somewhat muddled together a bit (maybe I’m > just misunderstanding though – that’s why I didn’t comment until now).
You're right. I didn't make a strong enough point about the fact that the output formatting isn't important, but I assumed everyone already knew that. I should have been more clear. > I personally like my logs 100% structured (except for Exceptions) and still > be able to “comment” on events in plain English if I need to. > > And I don’t see why comments/events should be special case on output (square > brackets in this example). If you have an event called user_error, you can > always add a key called error for another “symbol” or just an error_msg if > you insist on English. When looking for a certain type of user_error, you > simply write an AND clause in your logging software (Kibana or whatever). > It’s pretty easy to keep *that* consistent across applications. > > For example, *my* log would look like this: > > event=user_error peer=127.0.0.1 error=pebkac The special formatting in the example I gave was only intended for the dumb file-based format. I thought it was just a nice touch on the spur of the moment. In practice, I would use this for local logging, but then set up a log observer that passed raw key/value data to my real log aggregation/storage/filtering system. I'm making a distinction between what we show our users (in a twistd.log file) and what we give to our automated systems (sent over network protocols to logging systems). > If the programmer in question hadn’t enough logging pain in their life to see > that’s reasonable, they can always do: > > event=user_error peer=127.0.0.1 error_msg='Problem exists between keyboard > and chair.' > > Still perfectly parseable, perfectly readable. And with {!r} easy to achieve. > A nice API I would like to have be: > > log('user_error', peer=self.transport.getPeer().host, error_msg='Problem > exists between keyboard and chair.') – and log figures out itself if it needs > to quote. I could also live with them all quoted, i.e.: > > event='user_error' peer='127.0.0.1' error='pebkac' > > to have less special cases. It sounds like you're arguing that the human-readable *.log format should be closer to the simple key/value representation that we use underneath. Would you also argue that instead of having a log line that looks like: 2013-06-15 10:24:21-0500 [-] Server Shut Down. We should actually format them (in twistd.log) like this? time=1371331461.0 system='-' msg='Server Shut Down.' > I hope that makes some sense, the point I’m trying to make that events don’t > need to be distinct by themselves. If you enforce that, you’re forcing > structure on them which you could spread over multiple fields that are *much* > more pleasant to parse. So, if I had my own way, "event" would be a required argument to the log() function in my example, so that the only thing I'm forcing on the structure of a log message is that you *have* an event argument. But I'm pretty sure that's not going to fly. :-) So the only reason I wanted to support "event" in a special way in my example is to emphasize and encourage its use. > Hynek -- Christopher Armstrong http://radix.twistedmatrix.com/ http://planet-if.com/ _______________________________________________ Twisted-Python mailing list Twisted-Python@twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python