Grails Goodness: Use A Different Logging Configuration File
Since Grails 3 the logging configuration is in a separate file. Before Grails 3 we could specify the logging configuration in grails-app/conf/Config.groovy
, since Grails 3 it is in the file grails-app/conf/logback.groovy
. We also notice that since Grails 3 the default logging framework implementation is Logback. We can define a different Logback configuration file with the environment configuration property logging.config
. We can set this property in grails-app/conf/application.yml
, as Java system property (-Dlogging.config=<location>
) or environment variable (LOGGING_CONFIG
). Actually all rules for external configuration of Spring Boot apply for the configuration property logging.config
.
In the following example configuration file we have a different way of logging in our Grails application. We save it as grails-app/conf/logback-grails.groovy
:
// File: grails-app/conf/logback-grails.groovy
import grails.util.BuildSettings
import grails.util.Environment
import org.springframework.boot.ApplicationPid
import java.nio.charset.Charset
// Log information about the configuration.
statusListener(OnConsoleStatusListener)
// Get PID for Grails application.
// We use it in the logging output.
if (!System.getProperty("PID")) {
System.setProperty("PID", (new ApplicationPid()).toString())
}
conversionRule 'clr', org.springframework.boot.logging.logback.ColorConverter
conversionRule 'wex', org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter
// See http://logback.qos.ch/manual/groovy.html for details on configuration
appender('STDOUT', ConsoleAppender) {
encoder(PatternLayoutEncoder) {
charset = Charset.forName('UTF-8')
pattern =
'%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} ' + // Date
'%clr(%5p) ' + // Log level
'%clr(%property{PID}){magenta} ' + // PID
'%clr(---){faint} %clr([%15.15t]){faint} ' + // Thread
'%clr(%-40.40logger{39}){cyan} %clr(:){faint} ' + // Logger
'%m%n%wex' // Message
}
}
root(WARN, ['STDOUT'])
if(Environment.current == Environment.DEVELOPMENT) {
root(INFO, ['STDOUT'])
def targetDir = BuildSettings.TARGET_DIR
if(targetDir) {
appender("FULL_STACKTRACE", FileAppender) {
file = "${targetDir}/stacktrace.log"
append = true
encoder(PatternLayoutEncoder) {
pattern = "%level %logger - %msg%n"
}
}
logger("StackTrace", ERROR, ['FULL_STACKTRACE'], false )
}
}
We use this configuration file with the following command:
$ LOGGING_CONFIG=classpath:logback-grails.groovy grails run-app
...
2015-09-28 16:52:38.758 INFO 26895 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring FrameworkServlet 'grailsDispatcherServlet'
2015-09-28 16:52:38.758 INFO 26895 --- [ main] o.g.w.s.mvc.GrailsDispatcherServlet : FrameworkServlet 'grailsDispatcherServlet': initialization started
2015-09-28 16:52:38.769 INFO 26895 --- [ main] o.g.w.s.mvc.GrailsDispatcherServlet : FrameworkServlet 'grailsDispatcherServlet': initialization completed in 11 ms
2015-09-28 16:52:38.769 INFO 26895 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
...
Written with Grails 3.0.8.