Grails从控制器记录

时间:2016-07-05 14:15:50

标签: grails logging

我很难让Grails 2.4.5将我的自定义消息从控制器记录到特定文件中。这就是我在配置部分中所拥有的:

log4j = {
    /*
     * Log levels
    off
    fatal
    error
    warn
    info
    debug
    trace
    all 
     */
    appenders {
        console name:'stdout',  threshold: org.apache.log4j.Level.INFO
        rollingFile name: 'applog', maxFileSize: 1024, file: (System.getProperty('catalina.base') ?: 'target') + '/logs/' + appName + '.log',
            layout: pattern(conversionPattern: "[%d{HH:mm:ss:SSS}] %-5p %c{2}: %m%n")
        environments {
            development {
                rollingFile name: 'grailsfile', maxFileSize: 4096, file: 'target/logs/grails.log'
                file name: 'rootlog', file: 'target/logs/root.log'              
            }
        }
    }
    root { error 'stdout'}
    environments {
        development {
            debug additivity: false, 'grails.app'
            root { error 'stdout', 'rootlog'} //override the root
            warn additivity: false, grailsfile: 
                ['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']
            debug additivity: false,  applog: 
            ['grails.app.controllers', 'grails.app.domain', 'grails.app.services']      
        }
//      production {
//          root {  error() }
//          warn "grails.app.controllers"
//          warn "grails.app.domain"
//          warn "grails.app.services"
//          warn additivity: false,  applog: 'grails.app'
//      }
    }
}

在控制器中:

println "Debug log enabled?: " + log.debugEnabled   
log.debug "First piggy wrote to Debug"
log.info "Second piggy wrote to Info"
log.error "And the third piggy wrote to Error"

这表明我"调试日志已启用?:true"在控制台上。但是消息不会记录在任何地方。 Grails内部记录到" grailsfile"并且错误转到" rootlog"。但是appName.log保持空白。 有什么暗示我错了吗?

更新

为了简化我的请求,我现在只配置了最重要的请求。我想要行

log.debug "First piggy wrote to Debug"
log.info "Second piggy wrote to Info"
log.error "And the third piggy wrote to Error"

在appender applog(文件)中结束 所以log4j现在只有:

log4j = {
    appenders {
        console name:'stdout'//,  threshold: org.apache.log4j.Level.INFO
        rollingFile name: 'applog', maxFileSize: 1024, file: (System.getProperty('catalina.base') ?: 'target') + '/logs/' + appName + '.log',
            layout: pattern(conversionPattern: "[%d{HH:mm:ss:SSS}] %-5p %c{2}: %m%n")
    }
    environments {
        development {
            debug 'grails.app'
            debug additivity: false
                applog: ['grails.app.controllers', 'grails.app.domain', 'grails.app.services']      
        }
    }
}

但是当我的自定义日志文件保持为空时,我仍然将我的日志行(以及来自其他来源的错误)放入控制台。

所以我只想将()我的日志行作为第一步进入applog appender。任何暗示如何实现这个目标?

2 个答案:

答案 0 :(得分:1)

如果您在开发模式下运行应用,那么所有错误级别更高的日志都会转到target/logs/root.log 它配置在这里:
file name: 'rootlog', file: 'target/logs/root.log' ...
 root { error 'stdout', 'rootlog'} //override the root

这是因为development关闭会覆盖您的全局配置。 如果要查看appName.log中的所有日志,则应设置较低的日志记录级别并更改appender,如下所示:
root { info 'stdout', 'applog'} //override the root

答案 1 :(得分:0)

同时我可以弄清楚这个属性给我的自定义日志消息带来了麻烦:

def appName = grails.util.Metadata.current.'app.name'
...
file: (System.getProperty('catalina.base') ?: 'target') + '/logs/' + appName + '.log',

更改为此作品:

log4jFileName = (System.properties.'catalina.base') + "/logs/${appName}.log"
...

file:  "${config.log4jFileName}",