Grails log4j appender配置似乎被忽略

Grails log4j appender配置似乎被忽略,grails,logging,log4j,Grails,Logging,Log4j,我试图自定义Grails应用程序的日志配置,但是Appender(及其布局模式)似乎被忽略了 在Config.groovy中: log4j = { appenders { console name: 'stdout', layout: pattern(conversionPattern: '%c{2} %m%n') file name: 'fileLogger', file: 'application.log', layout: pattern(conversionPattern

我试图自定义Grails应用程序的日志配置,但是Appender(及其布局模式)似乎被忽略了

在Config.groovy中:

log4j = {
appenders {
    console name: 'stdout', layout: pattern(conversionPattern: '%c{2} %m%n')
    file name: 'fileLogger', file: 'application.log', layout: pattern(conversionPattern: '%d{dd-MM-yyyy HH:mm:ss,SSS} %5p %c{1} - %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'

info   'grails.app'
debug  'org.hibernate.SQL'
trace  'org.hibernate.type'
}
Log4J实际上考虑了logger部分(例如,如果我对hibernate的调试和跟踪行进行注释,那么hibernate语句的日志记录将按预期停止)

但我一直在尝试appenders部分的不同版本,似乎没有考虑到任何一个版本,实际上应用于控制台的格式只包括消息本身(例如,如果我编写

log.info("test")
在代码中,我将获得

test
在控制台中,日志文件中没有任何内容

我在小节中添加了“debug=true”,并将“org.apache.log4j”设置为trace,但似乎没有任何改变

这可能是件小事,但我想不出来/

我使用的是Grails2.3.0RC2


所以我按照Alidad的建议做了,并将配置切换到:

log4j = {
appenders {
    console name: 'stdout', layout: pattern(conversionPattern: '%d{yyyy-MM-dd HH:mm:ss,SSS Z} [%t] %-5p %c{1}:%L %x - %m%n')
}

root {
    info 'stdout'
}

error  stdout:
       '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'

info   stdout:
       'grails.app'
}
然而,虽然这是一个改进(我的布局没有被忽略),但它也会导致所有内容记录两次:

2013-09-08 18:00:19,447 +0100 [localhost-startStop-1] INFO  BootStrap:152  - Init completed
Init completed
2013-09-08 18:00:19,641 +0100 [localhost-startStop-1] INFO  NimbleBootStrap:152  - Creating default user account with username:user
Creating default user account with username:user

实际上,即使我将“root”部分注释掉,这种情况也会发生。

尝试将apender应用于您的信息级别

   log4j = {
     ...
     root{
       info  'stdout'
     }
    ...
   }
我想你缺少的是伐木工人不知道在哪里发送信息

一般来说,你可以通过

error myAppender:      "grails.app.controllers.BookController",
      myFileAppender:  ["grails.app.controllers.BookController",
                        "grails.app.services.BookService"],
      rollingFile:     "grails.app.controllers.BookController"
或者在根级别为所有级别定义它



谢谢,这类帮助不会忽略我的配置,但会导致所有内容都被输出两次。请参见上文。@johnmudoch我更新了我的答案,并尝试使用additivity:false。“additivity只是确定记录器是否从其父级继承配置。”(doc)我仍然不太明白为什么additivity在这种情况下有帮助(谁是您添加到的记录的父项?),但您粘贴的任何内容实际上都符合我的要求,因此我将问题标记为已回答。谢谢!@johnmudoch,因为默认情况下,
stdout
被设置为根记录器,即使它与您的情况一样显式设置。将
additivity
设置为false,将使您的自定义
appender
不从根记录器继承。此处是我最近在回答时偶然发现的。谢谢你-从你的代码中我拼凑了这个简单的配置。所以(在开发时)我可以将我的整个调试输出重新路由到一个文件:
log4j={appenders{//控制台名称:'stdout',布局:pattern(转换模式:'%c{2}%m%n'))文件名:'stdout',文件:'pathToLog/logFile.log',布局:模式(转换模式:'%c{2}%m%n')}
log4j = {
appenders {
    console name: 'stdout', layout: pattern(conversionPattern: '%d{yyyy-MM-dd HH:mm:ss,SSS Z} [%t] %-5p %c{1}:%L %x - %m%n')
}


error  stdout:
       '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'

info   stdout:
       'grails.app' , additivity: false
}