Java logging, and our awesome community
Since I’m on a roll with the blog posts, I thought I’d quickly cover some of the ways you can log out of your Java code to us. I’ve been buried in *our* java code for nearly two years now, and we’ve been talking about improving the quality of the logging that we’re doing there recently. As it turns out, there are some pretty interesting projects out there that look like they may be just what we need…
Before talking about them, though, I thought I’d give you a quick run-down on how we’re doing things now. We use a very slightly tweaked version of the log4j SyslogAppender (version 1.2.16) – the tweak is that we upped the message size from 1k to 32k. Yep, we’re completely ignoring the syslog RFC, but its been working perfectly fine for us for quite a while, so I’m ok with that. We configure log4j as described on our wiki so that we log to a local syslog-ng (using a different facility for each app) which forwards to the appropriate ports on logs.loggly.com. Its a very simple approach, but has been very reliable for us.
So why would we want to change it?
The main reason is that we set this up before we could send JSON data, and we log a lot of performance data, which is a perfect fit for JSON. We’re going to be moving all of our java logging to JSON over the next few months, because it will let us dive deeper into our logs, without all the noise.
A couple of weeks ago, Patrick Lightbody from neustar emailed us to tell us about a java class he’d written to send data into Loggly using http. Its an extension of java.util.logging.Handler and is only a couple of hundred lines of nice clean code . He shared it on github and described how to use it in his email.
// standard log creation in your class, nothing new here private static final Log LOG = new Log(); // one time initialization to turn Loggly on - probably do this very early in the Main class // also should have the loggly URL come from some config, and only applied during prod/stage Loggly.enable("https://logs.loggly.com/inputs/00000000-1111-2222-3333-555555555555"); // Add global context for all future log messages - probably do this near startup as well Loggly.addGlobal("foo", "bar"); // adds context to all log statements for the specific thread until Loggly is cleared // good for things like the username or ID of the script that is being run Loggly.add("banana", "boat"); // clears out all stuff added with Loggly.add() on that same thread Loggly.clear(); // Normal logging as always LOG.info("with local stuff");
If you’re using java.util.logging, give it a whirl!
This got me thinking that we’ve been a little, um, remiss in communicating just how many libraries people have written for us, so I did a search on github for java projects with loggly in the repo name and found some other projects that also look pretty nice…
- Mårten Gustafson has implemented a logback/SLF4J appender
- Spidertracks has implemented a log4j appender that uses an embedded HSQL db to guarantee delivery of your log events
- Raoul Schmidigerhas is working on a log4j appender
- Thomas Engelschmidt is working on a clojure logger
All of these projects use our HTTP interface, rather than TCP or UDP, which makes sense since we don’t currently support JSON except over HTTP. We’re planning on fixing that 🙂
We’re obviously pretty happy that so many people are working on making it easier to get data to us, and I want to say thank you to everyone who has been contributing to all of those projects. I’d like to encourage all of you reading this to jump in and help out if you can. Everyone who is contributing to these projects should drop us a line, and we’ll send you one of our X-Ray Beaver tee’s as a thank you 🙂