Grails How to change logging level in runtime | Grails Set Log Level for Grails
Need to create a util class at first as below:
package com.log4j import grails.util.Holders import org.apache.log4j.Category import org.apache.log4j.Level import org.apache.log4j.Logger /** * Created by pritom on 17/10/2017. */ class UtilsBase { protected static Logger log static void setLogLevel() { Level level = Holders.config?.myconfig?.log4j?.logLevel ?: Level.ERROR println("SETTING-LOG-LEVEL=${level}") Enumeration allLoggers = log.getLoggerRepository().getCurrentCategories() log.setLevel(level) while (allLoggers.hasMoreElements()) { Category category = (Category) allLoggers.nextElement() category.setLevel(level) } } static { println("Log-enabled-for-${this.class.simpleName}") log = Logger.getLogger(this.class) } }
Need to do something in Config.groovy as below:
myconfig { log4j { /* Here you can define your LOG level */ logLevel = Level.INFO } } // log4j configuration // log4j configuration log4j.main = { def pattern = new PatternLayout("%d{yyyy-MM-dd//HH:mm:ss.SSS} [%t] %x %-5p %c{2} - %m%n") appenders { console name: "stdout", layout: pattern } error 'org.codehaus.groovy.grails.web.servlet', // controllers 'org.codehaus.groovy.grails.web.pages', // GSP 'org.codehaus.groovy.grails.web.sitemesh', // layouts 'org.codehaus.groovy.grails.web.mapping.filter', // URL mapping 'org.codehaus.groovy.grails.web.mapping', // URL mapping 'org.codehaus.groovy.grails.commons', // core / classloading 'org.codehaus.groovy.grails.plugins', // plugins 'org.codehaus.groovy.grails.orm.hibernate', // hibernate integration 'org.springframework', 'org.hibernate', 'net.sf.ehcache.hibernate', 'com.log4j' debug 'com.log4j' warn 'org.springframework', 'org.hibernate', 'grails.plugins.springsecurity', 'groovyx.net.http', 'com.log4j' all 'grails.app' }
Now you have to set log level fro BootStrap.goovy as below
import com.log4j.UtilsBase class BootStrap { def init = { servletContext -> UtilsBase.setLogLevel() } def destroy = { } }
And finally start loggin
package com.log4j class Log4jController extends UtilsBase { def index() { log.info("Info") log.warn("Warn") log.error("Error") render "" } }
Will output as below:
2017-10-17//16:16:15.512 [http-bio-8808-exec-4] INFO log4j.Log4jController - Info 2017-10-17//16:16:15.515 [http-bio-8808-exec-4] WARN log4j.Log4jController - Warn 2017-10-17//16:16:15.515 [http-bio-8808-exec-4] ERROR log4j.Log4jController - Error