I wanted to call out the pretty-print feature in the latest release of lnav. This idea came from a coworker of Suresh who was having a hard time trying to read some unformatted XML in a log. They wanted the XML pretty-printed and were hoping that could be done by just piping the message to xmlpp or the like. So, first we implemented the ‘pipe-to’ and ‘pipe-line-to’ commands that will let you pipe log messages to a command and then display the result inside of lnav. That worked well enough, but pretty-printing is such a frequent operation that having to execute a command was kind of a pain. It would also be nice if it worked for a variety of text, like JSON or Python data. The solution we came up with was to leverage the existing code for parsing log messages to create a simple pretty-printer that should work for most data formats. Another benefit is that the log message does not have to be well-formed for the printer to work, any leading or trailing garbage shouldn’t confuse things.
As an example, here is a screenshot of the log message with the unformatted XML text with word-wrapping turned on:
That’s not very easy to read and it’s hard to figure out the structure of the message. Now, here is that same message after pressing SHIFT+P to switch to the pretty-print view of lnav:
The XML text is indented nicely and the usual syntax highlighting is applied. Also notice that lnav will automatically try to lookup the DNS name for IP addresses. Overall, I think it’s a major improvement over the raw view.
This is a pretty simple feature but I have found it quite useful in the couple weeks that it has been implemented. It’s so useful that I’m kicking myself for not having thought of it before.