Почему stacktrace.log не заполняется журналом в grails 3?

При создании нового приложения Grails файл logback.groovy по умолчанию (и почти каждый пример файла logback.groovy, даже пример г-на Хаки) содержит следующий код, который я упростил, чтобы сосредоточиться на соответствующем фрагменте:

root(ERROR, ['STDOUT'])

appender("FULL_STACKTRACE", FileAppender) {
    file = "build/stacktrace.log"
    append = true
    encoder(PatternLayoutEncoder) {
        pattern = "%level %logger - %msg%n"
    }
}
logger("StackTrace", ERROR, ['FULL_STACKTRACE'], false )

Однако использование этого подхода не приводит к выводу ошибок в файл stacktrace.log.

Ответ @JeffScottBrown содержал следующий файл Bootstrap.groovy, чтобы проверить, правильно ли записывается трассировка стека:

class BootStrap {

    def init = { servletContext ->
        log.error 'this is a new error'
    }
    def destroy = {
    }
}

С этим загрузочным файлом запуск приложения Grails не приведет к выходу в build/stacktrace.log.

Если вы удалите регистратор StackTrace и добавите FULL_STACKTRACE в корневой регистратор:

root(ERROR, ['STDOUT', 'FULL_STACKTRACE']

вы получите вывод в stacktrace.log.

В качестве альтернативы переименуйте регистратор StackTrace в grails.app.init.Bootstrap (спасибо @JeffScottBrown за эту строку):

logger 'grails.app.init.BootStrap', ERROR, ['FULL_STACKTRACE'], false

и вы получите вывод в stacktrace.log

Это наблюдение наводит меня на мысль, что регистратор StackTrace ничего не делает. Далее я прихожу к выводу, что любой регистратор, не названный по имени пакета, не работает.

В связи со всем этим у меня вопрос:

  • Работает ли logback для логгеров с именами, не относящимися к пакетам/классам?
  • Если да, то почему регистратор StackTrace по умолчанию logback.groovy не приводит к выводу в stacktrace.log?

РЕДАКТИРОВАТЬ:

  • Основная проблема для меня заключается в том, что логгер StackTrace кажется совершенно ненужным, так почему же он включен в файл по умолчанию?

Второе редактирование:

Еще один способ подтвердить это — заставить только регистратор StackTrace записывать в приложение STDOUT и смотреть, как трассировка стека исчезает из консоли, когда вы выдаете исключение:

logger("StackTrace", ERROR, ['STDOUT','FULL_STACKTRACE'], false) root(ERROR, [])


person Ryan Heathcote    schedule 19.04.2016    source источник
comment
Это с Grails 3.1.0.RC2. Я попытаюсь сделать тест с более поздней версией в какой-то момент.   -  person Ryan Heathcote    schedule 19.04.2016
comment
Оно работает. Проверьте каталог build проекта Grails.   -  person Kowser    schedule 30.06.2016
comment
@Kowser, что работает? Вы говорите, что в вашем logback.groovy есть только один регистратор, использующий приложение FULL_STACKTRACE, а именно регистратор StackTrace, определенный как: logger("StackTrace", ERROR, ['FULL_STACKTRACE'], false )? Если у вас есть какой-либо другой регистратор, использующий FULL_STACKTRACE, вы пропускаете строку, которую я считаю бесполезной.   -  person Ryan Heathcote    schedule 30.06.2016


Ответы (4)


Я ожидаю, что вы не настраиваете приложение для правильного использования.

Следующие работы:

import grails.util.BuildSettings
import grails.util.Environment

// See http://logback.qos.ch/manual/groovy.html for details on configuration
appender('STDOUT', ConsoleAppender) {
    encoder(PatternLayoutEncoder) {
        pattern = "%level %logger - %msg%n"
    }
}

root(ERROR, ['STDOUT'])

def targetDir = BuildSettings.TARGET_DIR
if (Environment.isDevelopmentMode() && targetDir) {
    appender("FULL_STACKTRACE", FileAppender) {
        file = "${targetDir}/stacktrace.log"
        append = true
        encoder(PatternLayoutEncoder) {
            pattern = "%level %logger - %msg%n"
        }
    }
    logger("StackTrace", ERROR, ['FULL_STACKTRACE'], false)
}

logger 'grails.app.init.BootStrap',
        ERROR, ['FULL_STACKTRACE'], false

В BootStrap.groovy...

class BootStrap {

    def init = { servletContext ->
        log.error 'this is a new error'
    }
    def destroy = {
    }
}

Эта ошибка появляется в stacktrace.log.

ИЗМЕНИТЬ, чтобы ответить на новые вопросы:

Работает ли logback для логгеров с именами, не относящимися к пакетам/классам?

Да.

Если да, то почему регистратор StackTrace в logback.groovy по умолчанию не приводит к выводу в stacktrace.log?

Регистратор StackTrace действительно приводит к тому, что выходные данные записываются в stacktrace.log для всех регистраторов, связанных с соответствующим приложением.

person Jeff Scott Brown    schedule 19.04.2016
comment
Это не отвечает на вопрос, который я имел в виду, поэтому я думаю, что мне нужно отредактировать свой вопрос... Моя главная проблема заключается в том, что строка logger("StackTrace", ERROR... появляется во многих местах в качестве примера, НО это не работает. Ваш ответ не указывает на то, что он работает, он указывает на то, что вам нужно что-то в дополнение к нему. Имеет ли это смысл? Я отредактирую свой вопрос, чтобы уточнить. - person Ryan Heathcote; 19.04.2016
comment
Я отредактировал вопрос, чтобы спросить, что я имел в виду. - person Ryan Heathcote; 19.04.2016
comment
@RyanHeathcote НО это не работает - насколько я могу судить, это работает. Если это не так, создайте пример приложения, демонстрирующий проблему, и поделитесь ссылкой на него. - person Jeff Scott Brown; 19.04.2016
comment
Я не могу сказать, связана ли путаница с неправильным пониманием уровней журнала, приложений или действительно есть ошибка. Пример приложения, в котором описывается, что вы ожидаете от работы, прояснит это. - person Jeff Scott Brown; 19.04.2016
comment
Что меня смущает, так это то, почему строка logger("StackTrace", ERROR... вообще необходима. В моем эксперименте без каких-либо других регистраторов, использующих приложение FULL_STACKTRACE, оно ничего не делает, и я могу получить вывод в файл stacktrace.log без него. - person Ryan Heathcote; 20.04.2016
comment
Когда вы говорите, что регистратор StackTrace действительно приводит к записи вывода в stacktrace.log для всех регистраторов, связанных с соответствующим приложением. -- Мои эксперименты противоречили бы этому: это не приводит к тому, что выходные данные записываются для регистраторов, связанных с приложением, потому что я могу использовать другие регистраторы с этим приложением без существования регистратора StackTrace. - person Ryan Heathcote; 20.04.2016
comment
Я создал чистое приложение, и единственные изменения, которые я внес, были в файл Bootstrap.groovy, добавив строку в ваш ответ, а затем изменили мой logback.groovy в соответствии с 3 версиями в этой сути: gist.github.com/slackboxster/8ed07fa21bdb5355bf04752e10f4b73e Если завтра у меня будет немного больше времени, я смогу создать фактические zip-файлы для каждой разницы . - person Ryan Heathcote; 20.04.2016
comment
То, что не работает так, как задумано, мне непонятно. Если что-то похоже на проблему Grails, не стесняйтесь сообщать о ней по адресу github.com/ grails/grails-core/issues. - person Jeff Scott Brown; 20.04.2016

сдача

logger("StackTrace", ERROR, ['FULL_STACKTRACE'], false )

to

logger("grails.app", INFO, ['FULL_STACKTRACE'], false)

будет записывать все журналы в приложении grails в stacktrace.log

person Raymond    schedule 04.09.2016

Ваш оператор журнала в Bootstrap.groovy:

log.error 'this is a new error'

записывает обычное сообщение уровня ERROR в регистратор с именем grails.app.init.yourapp.BootStrap. Он не регистрируется в регистраторе с именем StackTrace. Приложение FULL_STACKTRACE предназначено для нефильтрованных трассировок стека. Они записываются фреймворком в регистратор StackTrace.

Если вы замените

log.error 'this is a new error'

с

throw new RuntimeException("foo")

вы увидите, что полная трассировка стека записывается в stacktrace.log

person rlovtang    schedule 25.11.2016
comment
Я попробовал это, основываясь на том, что я вижу, исключение только заставляет трассировку стека сбрасываться в stacktrace.log, когда регистратор root добавляется к приложению FULL_STACKTRACE. Я до сих пор не вижу трассировки стека или чего-либо, направляемого специально через регистратор StackTrace. Когда я пытаюсь направить StackTrace исключительно через STDOUT, я не получаю никакого результата. например logger("StackTrace", ERROR, ['STDOUT','FULL_STACKTRACE'], false) root(ERROR, []) - person Ryan Heathcote; 27.04.2017

В связи со всем этим у меня вопрос:

  • Работает ли logback для логгеров с именами, не относящимися к пакетам/классам?

Да, logback работает независимо от имени регистратора.

  • Если да, то почему регистратор StackTrace в logback.groovy по умолчанию не приводит к выводу в stacktrace.log?

Оно делает. Я не могу воспроизвести сценарий, где это не так. Если вы можете, сообщите о проблеме на странице https://github.com/grails/grails-core/issues и включите образец приложения, и мы все исправим.

Извините за беспокойство и спасибо за отзыв.

person Jeff Scott Brown    schedule 06.01.2020