I'm trying to use log4j in my webapp, I wrote a log4j configuration based on the exemple in this blog.
Files are created but there is no ouput. I tried different configurations without success
Config.groovy
def log4jFileName = System.properties.getProperty('catalina.base', '.') + "/logs/myapp.log"
def log4jStacktrace = System.properties.getProperty('catalina.base', '.') + "/logs/stacktrace.log"
environments {
development {
log4jFileName = "logs/myapp.log"
}
test {
log4jFileName = "logs/myapp.log"
}
}
log4j = {
def pattern = new PatternLayout("[%p] [%c{3}] %m%n")
appenders {
appender new DailyRollingFileAppender(
name:"file",
file:log4jFileName,
layout: pattern,
datePattern: "'.'yyyy-MM-dd",
threshold: Level.toLevel("DEBUG")
)
rollingFile name:"stacktrace",
file:log4jStacktrace,
maxFileSize:'5MB',
layout: pattern,
datePattern: "'.'yyyy-MM-dd"
console name:"stdout",
layout: pattern,
datePattern: "'.'yyyy-MM-dd"
}
root {
environments {
production {
debug "file", "stacktrace"
}
development {
debug "file", "stdout"
}
}
}
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'
warn 'org.springframework',
'org.hibernate',
'grails.plugins.springsecurity',
'groovyx.net.http'
debug 'grails.app'
}
Controller
log.info("info")
log.error("error")
log.debug("debug")
log.warn("warn")
Related
I'm new in grails and I need to configuring loggind for my application. I started to configure log4j in my grails application and I got this error described below and I don't know what makes this:
log4j:ERROR Property missing when configuring log4j: Environment
Someone know what causes it? Below is my code!
def myappLogLevel = "DEBUG"
def myappLogPattern = "%d{yyyy-MM-dd/HH:mm:ss.SSS} [%t] %x %-5p %c{2} -
%m%n"
def log4jFileName = System.properties.getProperty('catalina.base', '.') +
"/logs/myapp.log"
environments {
development {
log4jFileName = "logs/myapp.log"
}
test {
log4jFileName = "logs/myapp.log"
}
log4j = {
def logLayoutPattern = new PatternLayout(myappLogPattern)
appenders {
appender new DailyRollingFileAppender(name: "myappLog",
threshold: Level.toLevel(myappLogLevel),
file: log4jFileName,
datePattern: "'.'yyyy-MM-dd", //Rollover at midnight each day.
layout: logLayoutPattern
)
if (Environment.current == Environment.DEVELOPMENT ||
Environment.current == Environment.TEST) {
appender new ConsoleAppender(name: "console",
threshold: Level.toLevel(myappLogLevel),
layout: logLayoutPattern
)
}
}
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
'org.springframework',
'org.hibernate.cache',
'org.hibernate',
'net.sf.ehcache.hibernate'
'grails'
'groovyx.net.http'
warn 'org.springframework',
'org.hibernate',
'grails.plugins.springsecurity',
'groovyx.net.http'
debug 'grails.plugins.springsecurity',
'grails.plugin.springcache',
'com.myapp',
'org.codehaus.groovy.grails.plugins.springsecurity',
'org.apache.http.headers',
'grails.app.services',
'grails.app.domain',
'grails.app.controllers',
'grails.plugin.databasemigration',
'liquibase'
List<String> loggers = []
loggers.add('myappLog')
if (Environment.current.name == "development" ||
Environment.current.name == "test") {
loggers.add('console')
}
root {
error loggers as String[]
additivity = true
}
}
You may be able to use the log config DSL construction to branch on environment without explicitly accessing Environment.
environments {
development { loggers.add('console') }
test { loggers.add('console') }
}
That said, I am not sure what you are trying to accomplish with the rest of the configuration, so there may be a more elegant way to handle things.
I use Grails 2.4.4 and Oracle JDK 1.7.45
The below is my logger configuration in Config.groovy:
log4j.main = {
appenders {
console name:'stdout', layout:pattern(conversionPattern: '%d{yy/MM/dd HH:mm:ss.SSS} %p %c{1}.%M(%L): %m%n')
}
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'
debug 'grails.app'
}
My controller is :
class HomeController {
def index() {
log.debug("HELLO, WORLD")
render "HELLO, WORLD"
}
}
The log result looks like below:
15/04/08 13:15:26.723 DEBUG HomeController.debug(128) : HELLO, WORLD
How do I config Config.groovy so that the log result can correctly display method and line number like below:
15/04/08 13:15:26.723 DEBUG HomeController.index(3) : HELLO, WORLD
In my grails app I have lg4j config as follows
log4j = {
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,
'net.sf.ehcache.hibernate'
warn 'org.hibernate', 'grails.app', 'org.springframework', 'org.springframework.security'
info 'org.springframework', 'org.springframework.security', 'grails.app'
appenders {
def patternLayout = new PatternLayout()
patternLayout.setConversionPattern("[%r] %c{2} %m%n")
def mailAppender = new SMTPAppender()
mailAppender.setFrom("from#webbfontaine.am")
mailAppender.setTo("to#webbfontaine.am")
mailAppender.setSubject("[Error in application] [host:test.am]")
mailAppender.setSMTPHost("smtp.test.am")
mailAppender.setLayout(patternLayout)
mailAppender.setThreshold(org.apache.log4j.Level.WARN)
appender name:'mail', mailAppender
}
root {
warn 'mail', 'stdout'
}
}
It works fine and sends mail when I run my app with grails run-app, but when I deploy war under tomcat, I get emails with empty body. Is there some specific jar that should be under tomcat/libs? Any ideas?
The only way I can get the logging to work in my service is to add this to my service:
class MyService {
def log = LogFactory.getLog(getClass())
...
My log4j settings in Config.groovy:
log4j = {
PatternLayout patternLayout = new PatternLayout("%d [%t] %-5p %c %x - %m%n")
debug 'grails.app.controllers',
'grails.app.controller',
'grails.app.domain',
'grails.app.service',
'grails.app.filters',
'com.mycompany'
// 'org.springframework.security'
'org.hibernate.SQL'
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'
appenders {
appender new org.apache.log4j.ConsoleAppender(name: "console",
threshold: org.apache.log4j.Level.DEBUG,
layout: patternLayout
)
}
root {
error 'stdout'
additivity = true
}
}
I would have thought the logging would work in a service without having to add def log... at the top.
grails.app.service should be grails.app.services. This changed in version 2.0.
You can easily find out the logger name in an artifact by adding
println log.name
to a test method and calling it.
it seems that my grails (2.1) log4j config isn't used properly and i can't find the problem.
The log file is created but empty and the stdout doesn't follow my pattern.
log4j = {
appenders {
rollingFile name: "myFileAppender", file: "LogFile.log", maxFileSize: 1024, layout:pattern(conversionPattern: '%d (%t) [%24F:%-3L:%-5p]%x %m%n')
console name: 'myStdoutAppender', layout:pattern(conversionPattern: '%d (%t) [%24F:%-3L:%-5p]%x %m%n')
}
warn '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'
debug 'org.my.stuff',
'grails.test',
'grails.app'
root = {
debug 'myFileAppender', 'myStdoutAppender'
additivity = true
}
}
Anyone an idea what i did wrong?
Don't assign to the root logger. Just call it with the supplied closure:
// No equals sign
root {
debug 'myFileAppender', 'myStdoutAppender'
additivity = true
}