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.