Почему 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 для всех регистраторов, связанных с соответствующим приложением.

Другие вопросы по тегам