首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Grails log4j配置

Grails log4j配置
EN

Stack Overflow用户
提问于 2009-11-19 18:23:53
回答 3查看 5.1K关注 0票数 1

在配置Log4J时,Grails在1.1版中引入的DSL曾多次出现问题。我的当前配置如下:

代码语言:javascript
代码运行次数:0
运行
复制
log4j = {        
    debug 'com.mypackages'

    appenders {
        console name: 'stdout', layout: pattern(conversionPattern: '%d{dd-MM-yyyy HH:mm:ss,SSS} %5p %c{1} - %m%n')
        rollingFile name: 'hibeFile', file: "hibeFile", maxFileSize: '500KB'
    }

    // By default, messages are logged at the error level to both the console and hibeFile
    root {
        error 'stdout', 'hibeFile'
        additivity = true
    }
}

这里的意图是:

  • Log com.mypackages在调试级别,其他所有其他在错误级别
  • 日志全部输出到名为hibeFile和控制台

的文件

当我运行应用程序或集成测试时,这很好。但是,当我运行单元测试时,控制台或Grails测试报告中显示的"System.out“或"System.err”链接中都不会出现日志记录。在运行单元测试时,如何查看日志?

谢谢你,唐

EN

回答 3

Stack Overflow用户

发布于 2009-11-24 11:54:14

AFAIK,在运行Grails单元测试时,整个日志记录无法通过log4j获得,域类中的log.xxxx调用等只是使用

代码语言:javascript
代码运行次数:0
运行
复制
mockLogging(ClassUnderTest, true)

"true“表示”启用调试“。为此,单元测试类必须扩展GrailsUnitTestCase。如果使用mockController(类),它会隐式调用mockLogging(类,false),因此不会得到调试日志记录。有关详细信息,请参阅grails源,尤其是GrailsUnitTestCase和MockUtils。

与上述相反,在集成测试中启动了整个机器,并提供了log4j。

票数 2
EN

Stack Overflow用户

发布于 2009-11-24 18:47:43

这里有一个想法,您并没有完全问这个问题,但是在grails用户组中也提出了相同的问题。我也在这里张贴我的答案,以传播知识。

如果您在类中显式地表示def log = org.apache.commons.logging.LogFactory.getLog(this),而不是像grails用户组所解释的那样依赖于依赖注入,那么您可以在LogFactory上模拟getLog。

下面的内容取自grails.tests.MockUtils.mockLogging并修改为返回记录器。

代码语言:javascript
代码运行次数:0
运行
复制
class LoggingEnabledTestCase extends GrailsUnitTestCase {
protected void setUp() {
        super.setUp()
        registerMetaClass(org.apache.commons.logging.LogFactory)
        org.apache.commons.logging.LogFactory.metaClass.'static'.getLog = {instance ->

            // This is taken from grails.tests.MockUtils and slightly changed to return a logger.

            // Get the name of the class + the last component of the package
            // (if it the class is in a package).
            def pos = instance.class.name.lastIndexOf('.')
            if (pos != -1) pos = instance.class.name.lastIndexOf('.', pos - 1)
            def shortName = instance.class.name.substring(pos + 1)

            // Dynamically inject a mock logger that simply prints the
            // log message (and optional exception) to stdout.
            def mockLogger = [
                    fatal: {String msg, Throwable t = null ->
                        println "FATAL (${shortName}): $msg"
                        if (t) {
                            println "       Exception thrown - ${t.message}"
                        }
                    },
                    error: {String msg, Throwable t = null ->
                        println "ERROR (${shortName}): $msg"
                        if (t) {
                            println "       Exception thrown - ${t.message}"
                        }
                    },
                    warn: {String msg, Throwable t = null ->
                        println "WARN (${shortName}):  $msg"
                        if (t) {
                            println "       Exception thrown - ${t.message}"
                        }
                    },
                    info: {String msg, Throwable t = null ->
                        println "INFO (${shortName}):  $msg"
                        if (t) {
                            println "       Exception thrown - ${t.message}"
                        }
                    },
                    debug: {String msg, Throwable t = null ->
                        println "DEBUG (${shortName}): $msg"
                        if (t) {
                            println "       Exception thrown - ${t.message}"
                        }
                    },
                    trace: {String msg, Throwable t = null -> },
                    isFatalEnabled: {-> true},
                    isErrorEnabled: {-> true},
                    isWarnEnabled: {-> true},
                    isInfoEnabled: {-> true},
                    isDebugEnabled: {-> true},
                    isTraceEnabled: {-> false}] as Log
            return mockLogger
        }
    }

    protected void tearDown() {
        super.tearDown()
    }
}
票数 1
EN

Stack Overflow用户

发布于 2009-11-28 03:32:21

使用Grails1.1.1和与您的设置近似,我有一个名为FooTests.groovy的单元测试

在运行grails test-app之后,我能够在目录中看到测试的输出:

代码语言:javascript
代码运行次数:0
运行
复制
./test/reports/plain

特别是在档案中,酌情:

代码语言:javascript
代码运行次数:0
运行
复制
TEST-com.mypackages.FooTests-err.txt
TEST-com.mypackages.FooTests-out.txt
TEST-com.mypackages.FooTests.txt

注意,我在hibeFile中没有看到输出。我不确定,但我怀疑之前的海报是正确的,因为单元测试没有接收日志设置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1765475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档