我想将我的BootStrap.groovy文件中的一些信息记录到控制台和日志文件中。输出报告一些配置信息,并标记从应用程序的配置到执行阶段的转换。我遇到的问题是仅在控制台上看到所需的输出,而不是在日志文件中。我的环境包括
我提供了两个代码片段来展示我正在做的事情。它们也很容易插入一个空的Grails项目(不需要创建域类或控制器来查看我看到的行为)。当我运行' grails run-app '时,我希望environments
块的 development 部分将BootStrap输出配置为两个位置。除了让两个位置的日志记录工作之外,如果您对我的log4j配置有任何一般性建议,也会受到赞赏。
我修改了 BootStrap.groovy :
import grails.util.Environment
class BootStrap {
def grailsApplication
def init = { servletContext ->
log.info """
tryLoggingInGrails2-3-8 configuration {---------------- ${new Date()}
environment : ${Environment.current.name}
dataSource.username : ${grailsApplication.config?.dataSource?.username}
dataSource.url : ${grailsApplication.config?.dataSource?.url}
------------------------------------------------------}"""
}
def destroy = {
}
}
在 Config.groovy 中,log4j配置部分为:
// ----------------------------- Start Config.groovy snippet
// log4j configuration
def catalinaBase = System.getProperty( 'catalina.base' )
if ( !catalinaBase ) catalinaBase = './target' // just in case
def logDirectory = "${catalinaBase}/logs"
def consoleLevelThreshold = org.apache.log4j.Level.WARN
def fileLevelThreshold = org.apache.log4j.Level.INFO
environments {
development {
consoleLevelThreshold = org.apache.log4j.Level.DEBUG
fileLevelThreshold = org.apache.log4j.Level.DEBUG
}
}
// Inside the log4j closure, use '${myAppName}' instead of '${appName}'
def myAppName = appName
log4j = {
appenders {
// This 'null' prevents the empty stacktrace.log file from being created
// in the default location, where we may not have permission to write
// in a production tomcat.
'null' name: 'stacktrace'
console name: 'stdoutAppender',
threshold: consoleLevelThreshold,
layout: pattern( conversionPattern: '%-5p %c{2} %m%n' )
file name: 'fileAppender',
file: "${logDirectory}/${myAppName}.log",
threshold: fileLevelThreshold,
layout: pattern( conversionPattern: '%-4r [%t] %-5p %c %d %x - %m%n' ),
append: false
file name: 'stacktraceAppender',
file: "${logDirectory}/${myAppName}_stacktrace.log",
threshold: org.apache.log4j.Level.ERROR,
append: false
} // appenders
root {
warn 'fileAppender', 'stdoutAppender'
}
error stacktraceAppender: "StackTrace"
error fileAppender: [
'grails.app',
'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'
]
environments {
development {
debug additivity: false,
stdoutAppender: [
"grails.app.conf.BootStrap"
]
debug additivity: false,
fileAppender: [
"grails.app.conf.BootStrap"
]
} // development
production {
info additivity: false,
fileAppender: [
"grails.app.conf.BootStrap"
]
} // production
} // environments
}
// ----------------------------- End Config.groovy snippet
答案 0 :(得分:1)
我采用了我们的日志配置,并使用您的配置对其进行了测试。它确实完成了你想要的。我们用于开发模式的日志记录目录最终位于logs
下,而不是target
。另外,请确保PatternLayout
,[{1}}和Level
的导入位于Environment
的顶部。也许你可以从这个开始倒退。
Config.groovy
答案 1 :(得分:0)
这真的是为了增加Aaron的答案,但StackOverflow中的评论不具备我想要使用的丰富格式。
我有时间重新审视这一点,发现我之前使用的Grails 2.2.4和Grails 2.3.8之间的行为有所不同。
设置println
后,在 Config.groovy 文件中添加调试logDirectory
:
def logDirectory = "${catalinaBase}/logs"
println "logDirectory = ${logDirectory}"
显示在Grails 2.2.4下(可能是2.3.x之前的任何版本)
logDirectory = ./target/logs
但在Grails 2.3.8下," grails run-app "打印
logDirectory = ./target/logs
...
logDirectory = ./target/work/tomcat/logs
啊哈哈!看到两个位置,我现在记得在" What's new in grails 2.3?"现在可以将许多命令分叉到单独的JVM中。以前是" grails run-app "用空的" catalinaBase
"执行value,我的输出进入target / logs目录下的logfile。但是使用Grails 2.3.8我没有意识到在target / work / tomcat下创建了第二组日志文件:
tryLoggingInGrails2-3-8$ find . -name *.log -print
./target/logs/tryLoggingInGrails2-3-8.log (expected file is created, but empty)
./target/logs/tryLoggingInGrails2-3-8_stacktrace.log (expected file, but empty)
./target/work/tomcat/logs/tryLoggingInGrails2-3-8.log (unexpected file)
./target/work/tomcat/logs/tryLoggingInGrails2-3-8_stacktrace.log (unexpected file)
并且我想要的输出进入另一组日志文件,显然一个fork获取一个非null catalinaBase
值来使用。我以为我没有从log4j获得输出,但它正在工作;只是进入一个我不知道或正在寻找的文件。
Aaron的代码是有效的,因为他的代码块并没有被这个愚弄,它专门针对生产环境而且目标文件是按照预期设置的:
def logHome = "./logs"
environments {
production {
logHome = (System.getProperty("catalina.base") ?: ".") + "/logs"
}
}