1

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

    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'
    }
4

2 回答 2

2

首先,让两个不同的 appender 记录到同一个文件是一个坏主意,如果您希望完整的堆栈跟踪与普通日志转到同一个位置,那么您应该在logger级别而不是appender级别重新指向内容。

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

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
}

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

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

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

于 2013-08-26T18:12:25.437 回答
0

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

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

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

}
于 2013-08-26T15:46:02.650 回答