Grails Log4J 无法在不使用 Root 的情况下配置信息记录器

Grails Log4J Can't Configure Info Logger without Using Root

所以我认为我在 grails 中配置 log4j 时遇到了一个非常简单的问题,但无法在任何地方找到解决方案。我目前正在尝试将其设置为所有错误都转到堆栈跟踪文件,然后应用程序打印出的所有信息和警告日志都转到控制台。这就是我目前的配置方式:

log4j = {

appenders {
    rollingFile name: "stacktrace", maxFileSize: "10MB", maxBackupIndex:2, file:"/tmp/logs/stacktrace.log", threshold: org.apache.log4j.Level.ERROR
    console name: "stdout", threshold: org.apache.log4j.Level.INFO
}

root {
    error 'stacktrace', 'stdout'
}

info stdout: 'grails.app'

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/Warn 级别添加到根配置以转到 stdout 它会记录所有未明确定义的内容,因此 info/warning 来自插件的日志和其他东西会在我想要的时候出现来自grails应用程序的那些。有没有一种方法可以将不同的日志级别指向不同的附加程序,而无需通过根进行设置?

Is there a way I can point different log levels to different appenders without needing to set it up through the root?

是的。 Log4j 对此提供了很好的灵活性。例如,您可以通过将名称作为键传递给其中一种日志级别方法,将附加程序附加到特定的记录器:

error myAppender: "grails.app.controllers.BookController"

要向记录器添加多个附加程序,请将它们添加到同一级别声明:

error myAppender:      "grails.app.controllers.BookController",
      myFileAppender:  ["grails.app.controllers.BookController",
                        "grails.app.services.BookService"],
      rollingFile:     "grails.app.controllers.BookController"

我们在 https://grails.github.io/grails2-doc/2.5.6/guide/conf.html#logging 上记录了很多相关功能。