对于grails的日志输出,我真的是给弄吐血了。开始以为很简单,后来发现grails封装log4j做的有点太多了,很多东西的封装理解了觉得还挺合理,但是不理解的话真是无比迷茫。对于是否有必要做这么多强制性约束,我保留意见...(不知道是不是rails的约定,希望是因为自己无知)

先说一个笨人的办法,但是容易和后面的研究混淆,如果怕麻烦就这么弄好了
在log4j的配置里面加上
  1. root {
  2. info 'stdout'
  3. additivity = true
  4. }
基本不用管太多了,应用程序里面的error日志一样可以打,只有遇到测试类的error日志才会停。
但是在测试环境下,我们希望的是遇到error就可以停了。那么具体的log4j的配置文件如下(加上不同环境的日志级别更方便)
  1. log4j = {
  2. environments {
  3. production {
  4. appenders {
  5. rollingFile name:"file", maxFileSize:1024, file:"logs/myApp.log"
  6. }
  7. warn file:'grails.app'
  8. }
  9. development {
  10. appenders {
  11. console name:'stdout', layout:pattern(conversionPattern: '%c{2} %m%n')
  12. }
  13. info stdout:'grails.app'
  14. }
  15. test {
  16. appenders {
  17. console name:'stdout', layout:pattern(conversionPattern: '%c{2} %m%n')
  18. }
  19. debug stdout:'grails.app'
  20. }
  21. }
  22. error  'org.codehaus.groovy.grails.web.servlet',  //  controllers
  23. 'org.codehaus.groovy.grails.web.pages', //  GSP
  24. 'org.codehaus.groovy.grails.web.sitemesh', //  layouts
  25. 'org.codehaus.groovy.grails.web.mapping.filter', // URL mapping
  26. 'org.codehaus.groovy.grails.web.mapping', // URL mapping
  27. 'org.codehaus.groovy.grails.commons', // core / classloading
  28. 'org.codehaus.groovy.grails.plugins', // plugins
  29. 'org.codehaus.groovy.grails.orm.hibernate', // hibernate integration
  30. 'org.springframework',
  31. 'org.hibernate',
  32. 'net.sf.ehcache.hibernate'
  33. warn   'org.mortbay.log'
  34. }
这个配置应该就是比较合理的了,正常程序输出就会打日志。但是有几个地方注意一下:
1. 在测试环境下,如果遇到有error级别的日志,那么后面的日志也全都不打印了。方便查找问题,很贴心的设计~
2. 在测试类中,不允许debug级别日志,其实测试也不需要这个级别。应该是grails为了规范而做的限制
3. unit test下面是不能使用log,应该是没有注入
4. 在测试环境下,输出的error日志到test reports中去看