在单个appender上使用多个记录器

时间:2013-08-26 15:37:02

标签: grails log4j

以下是我的日志配置。它正在记录我想要的内容,但它只是将其记录到文件中。我想在控制台上看到相同的信息。我尝试了几种变体,但是对于每种变化,我只能将信息记录到控制台或文件中,而不是两者。

    def appName = grails.util.Metadata.current.'app.name'
    def catalinaBase = System.properties.getProperty('catalina.base')
    catalinaBase = catalinaBase ?: "."
    def logDirectory = "${catalinaBase}${File.separator}logs${File.separator}${appName}"

    // log4j configuration
    log4j = {
        appenders {
            rollingFile name: 'stdout',     file: "${logDirectory}${File.separator}${appName}.log".toString(), maxFileSize: '100MB' // Use the same file for stdout and stacktrace
            rollingFile name: 'stacktrace', file: "${logDirectory}${File.separator}${appName}.log".toString(), maxFileSize: '100MB' // Use the same file for stdout and stacktrace
        }

        warn   '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'

        all    'grails.app.controllers.test',
               'grails.app.domain.test',
               'grails.app.services.test',
               'grails.app.taglib.test',
               'grails.app.conf.test',
               'grails.app.filters.test'
    }

2 个答案:

答案 0 :(得分:2)

首先,让两个不同的appender登录到同一个文件是一个坏主意,如果你想让完整的堆栈跟踪转到与普通日志相同的位置,那么你应该重新指向 logger < / em>级别而不是 appender 级别。

对于您的实际问题,我会创建一个控制台appender和一个文件appender,并将它们都附加到 root 记录器。

log4j = {
  appenders {
    console name:'stdout'
    rollingFile name: 'applog',     file: "${logDirectory}${File.separator}${appName}.log".toString(), maxFileSize: '100MB'
    'null' name:'stacktrace' // prevent Grails trying to create stacktrace.log
  }

  root {
    warn 'stdout', 'applog'
  }

  // Send full stack traces to the main appName.log file
  warn applog:'StackTrace'

  // individual warn/all logger configurations as before
}

这会将相同的日志发送到stdout和日志文件,但只会将完整的堆栈跟踪发送到文件(而不是控制台)。如果您确实想要控制台上的完整堆栈跟踪,请将其更改为

  warn applog:'StackTrace', stdout:'StackTrace'

或者,您可以考虑完全禁用StackTrace记录器(删除整个warn applog:'StackTrace'行),然后通过将系统属性grails.full.stacktrace设置为true来禁用堆栈跟踪过滤,这样您就可以正常记录器记录的完整未过滤堆栈跟踪。

答案 1 :(得分:0)

使用上面的配置,例如,要将所有INFO级别的“grails.app”事件记录到控制台和“stdout”appender,您需要以下内容:

log4j = {
   appenders { 
     ... appender configuration here ...
   }
   // configure a root logger
   root {
     warn 'stdout'
     additivity = false
   }

   info stdout:'grails.app'
   info console:'grails.app'

}