Нет выхода log4j в приложении Grails

У меня есть следующая конфигурация log4j в приложении Grails 1.1

log4j = {

    // Enable Hibernate SQL logging with param values
    trace 'org.hibernate.type'
    debug 'org.hibernate.SQL'

    debug 'com.mycompany'

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

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

Когда я запускаю модульные тесты, единственным результатом генерации журнала является класс Hibernate. Я не понимаю, почему для моих собственных классов не генерируется вывод журнала, т.е. Те, которые находятся в пространстве имен com.mycompany. Как ни странно, когда я запускаю интеграционные тесты, вывод log4j выглядит так, как ожидалось.

Если я перейду к отчету об испытаниях для unit test и нажмите ссылку "System.out", я увижу свои сообщения журнала в следующем формате:

DEBUG (member.InviteServiceTests): Calling getInvite with member (4517)

Обратите внимание, что это не тот шаблон, который я указал в моей конфигурации log4j. Кроме того, если я изменяю конфигурацию log4j из:

debug 'com.mycompany'

в

fatal 'com.mycompany'

Я все еще вижу сообщения журнала на уровне отладки в отчете об испытаниях. Кажется, что корневой журнал запущен при выполнении модульных тестов? Я пробовал классы ведения журнала под com.mycompany с помощью отдельного регистратора, но это, похоже, не имеет никакого значения.

Спасибо, Дон

Ответ 1

Дон,

Если классы, которые вы пытаетесь выполнить, являются стандартными классами Grails (домен, контроллер, служба и т.д.), вы должны иметь возможность использовать что-то вроде:

 log4j = {

    // Logging warnings and higher for all of the app
    warn 'grails.app'
    // Logging infos and higher for all controllers
    info 'grails.app.controller'
    // Logging debug and higher for the BarService
    debug 'grails.app.service.BarService'

    appenders {
    // ...as above...
    }    
    root {
    // ...as above...
    }
}

В разделе руководства пользователя Grails содержится несколько подробных сведений о протоколе.

Ответ 2

Так как делегаты grails регистрируют log4j, вы можете использовать -Dlog4j.debug и посмотреть, как настроен log4j (ссылка). Возможно, другой файл подхвачен.


Существует по крайней мере одно критическое исправление ошибок для ведения журнала, который предназначен для 1.2, но не для 1.1.x. Конфигурация похожа на вашу. Возможно, сообщения ошибочно зарегистрированы в другом файле?

Ответ 3

Вам нужно ввести регистратор в контроллер в папке unit test:

mockLogging(<controller class name>, true)

Второй аргумент говорит, что сообщения об отладке журнала и ниже.

Ответ 4

Дон,

Я не совсем взломал тонкости регистрации DSL в версии 1.1, но это может быть полезно для вас: Dynamic Logging Plugin позволяет вам включать/отключать протоколирование каналов во время вашего приложения, а также создает некоторую конфигурацию, которую вы затем может быть помещен в Conf.groovy.

Надеюсь, это поможет.