При создании нового приложения 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, [])
build
проекта Grails. - person Kowser   schedule 30.06.2016FULL_STACKTRACE
, а именно регистраторStackTrace
, определенный как:logger("StackTrace", ERROR, ['FULL_STACKTRACE'], false )
? Если у вас есть какой-либо другой регистратор, использующийFULL_STACKTRACE
, вы пропускаете строку, которую я считаю бесполезной. - person Ryan Heathcote   schedule 30.06.2016