我很难让Grails 2.4.5将我的自定义消息从控制器记录到特定文件中。这就是我在配置部分中所拥有的:
log4j = {
/*
* Log levels
off
fatal
error
warn
info
debug
trace
all
*/
appenders {
console name:'stdout', threshold: org.apache.log4j.Level.INFO
rollingFile name: 'applog', maxFileSize: 1024, file: (System.getProperty('catalina.base') ?: 'target') + '/logs/' + appName + '.log',
layout: pattern(conversionPattern: "[%d{HH:mm:ss:SSS}] %-5p %c{2}: %m%n")
environments {
development {
rollingFile name: 'grailsfile', maxFileSize: 4096, file: 'target/logs/grails.log'
file name: 'rootlog', file: 'target/logs/root.log'
}
}
}
root { error 'stdout'}
environments {
development {
debug additivity: false, 'grails.app'
root { error 'stdout', 'rootlog'} //override the root
warn additivity: false, grailsfile:
['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 additivity: false, applog:
['grails.app.controllers', 'grails.app.domain', 'grails.app.services']
}
// production {
// root { error() }
// warn "grails.app.controllers"
// warn "grails.app.domain"
// warn "grails.app.services"
// warn additivity: false, applog: 'grails.app'
// }
}
}
在控制器中:
println "Debug log enabled?: " + log.debugEnabled
log.debug "First piggy wrote to Debug"
log.info "Second piggy wrote to Info"
log.error "And the third piggy wrote to Error"
这表明我"调试日志已启用?:true"在控制台上。但是消息不会记录在任何地方。 Grails内部记录到" grailsfile"并且错误转到" rootlog"。但是appName.log保持空白。 有什么暗示我错了吗?
更新
为了简化我的请求,我现在只配置了最重要的请求。我想要行
log.debug "First piggy wrote to Debug"
log.info "Second piggy wrote to Info"
log.error "And the third piggy wrote to Error"
在appender applog(文件)中结束 所以log4j现在只有:
log4j = {
appenders {
console name:'stdout'//, threshold: org.apache.log4j.Level.INFO
rollingFile name: 'applog', maxFileSize: 1024, file: (System.getProperty('catalina.base') ?: 'target') + '/logs/' + appName + '.log',
layout: pattern(conversionPattern: "[%d{HH:mm:ss:SSS}] %-5p %c{2}: %m%n")
}
environments {
development {
debug 'grails.app'
debug additivity: false
applog: ['grails.app.controllers', 'grails.app.domain', 'grails.app.services']
}
}
}
但是当我的自定义日志文件保持为空时,我仍然将我的日志行(以及来自其他来源的错误)放入控制台。
所以我只想将(仅)我的日志行作为第一步进入applog appender。任何暗示如何实现这个目标?
答案 0 :(得分:1)
如果您在开发模式下运行应用,那么所有错误级别更高的日志都会转到target/logs/root.log
它配置在这里:
file name: 'rootlog', file: 'target/logs/root.log'
...
root { error 'stdout', 'rootlog'} //override the root
这是因为development
关闭会覆盖您的全局配置。
如果要查看appName.log中的所有日志,则应设置较低的日志记录级别并更改appender,如下所示:
root { info 'stdout', 'applog'} //override the root
答案 1 :(得分:0)
同时我可以弄清楚这个属性给我的自定义日志消息带来了麻烦:
def appName = grails.util.Metadata.current.'app.name'
...
file: (System.getProperty('catalina.base') ?: 'target') + '/logs/' + appName + '.log',
更改为此作品:
log4jFileName = (System.properties.'catalina.base') + "/logs/${appName}.log"
...
file: "${config.log4jFileName}",