Почему stacktrace.log не заполняется logback в 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
appender и следы стека исчезают с консоли при создании исключения:
logger("StackTrace", ERROR, ['STDOUT','FULL_STACKTRACE'], false)
root(ERROR, [])
3 ответа
В результате всего этого мой вопрос:
- Работает ли возврат для логгеров, не относящихся к пакету / классу?
Да, логбэк работает независимо от имени регистратора.
- Если да, то почему средство ведения журнала StackTrace в файле logback.groovy по умолчанию не выводит данные в stacktrace.log?
Оно делает. Я не могу воспроизвести сценарий там, где его нет. Если можете, сообщите о проблеме на https://github.com/grails/grails-core/issues и включите образец приложения, и мы все исправим.
Приносим извинения за беспокойство и благодарим за отзыв.
Менять
logger("StackTrace", ERROR, ['FULL_STACKTRACE'], false )
в
logger("grails.app", INFO, ['FULL_STACKTRACE'], false)
запишет все логи в приложении grails в stacktrace.log
Ваш лог выписки в Bootstrap.groovy:
log.error 'this is a new error'
регистрирует обычное сообщение об уровне ОШИБКИ в регистраторе с именем grails.app.init.yourapp.BootStrap
, Он не входит в логгер с именем StackTrace
, FULL_STACKTRACE
appender для нефильтрованных стековых трасс. Они написаны каркасом в логгер StackTrace
,
Если вы замените
log.error 'this is a new error'
с
throw new RuntimeException("foo")
вы увидите полную трассировку стека, записываемую в stacktrace.log
Я ожидаю, что вы не настраиваете appender для правильного использования.
Следующие работы:
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 для всех регистраторов, связанных с соответствующим приложением.