Grails remote logging with Graylog

I have a small Grails (2.5.x) web-application running on the AWS Elastic Beanstalk service. This works really well, but accessing log-files and debugging errors can be difficult. Therefor I decided to send some of the logging to a remote Graylog server (hosted elsewhere at the moment, but could just as well be running on an EC2 instance). If you are setting up your own Graylog server, be aware that the current stable version requires Elasticsearch 1.x and does not support version 2.x. Besides that the installation was easy and straightforward on Ubuntu 14.04. Before you are able to receive any messages you must add a Gelf UDP (or TCP) listener.

We must add support for the GELF appender (Graylog Extended Log Format) for log4j to our Grails project. Add the following into the dependencies section in conf/BuildConfig.groovy:

runtime 'org.graylog2:gelfj:1.1.13'

Next we must configure Grails to use the GELF Appender and send logging in that direction. In conf/Config.groovy in the log4j configuration add something like this:

// log4j configuration
log4j.main = {

    // Setup the Gelf log4j appender
    appender new org.graylog2.log.GelfAppender(
        name: 'gelfAppender',
        graylogHost: 'my.graylog.server,
        graylogPort: 12201,
        extractStacktrace: true,
        includeLocation: true,
    )

    // Example: log all messages from my.package to Gelf
    all gelfAppender: 'my.package'

    // Example: log hibernate errors to Gelf
    error gelfAppender: 'org.hibernate'
  }

And now log messages should show up in the Graylog webinterface if everything was setup correctly 🙂