2014-10-15 3 views
0

Я хочу получать информацию о том, что в приложении Grails 2.2.4 происходят неперехваченные исключения. Log4j имеет SMTPAppender, который делает что-то подобное, но только на основе определенного уровня журнала. В моем приложении на всех доступных уровнях журналов уже много записей журнала, поэтому отправка электронной почты по ERROR или FATAL на самом деле не является вариантом, поскольку она также будет содержать записи без исключений.Пользовательский уровень регистрации в Grails

Фильтрация неперехваченные исключений в Grails довольно легко, я просто перенаправить их к определенному контроллеру и обработать его там:

static mappings = { 
    [...] 
    "500"(controller: "errors", action: "serverError") 
} 

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

final Level EXCEPTION = Level.forName("EXCEPTION", 50); 
logger.log(EXCEPTION, "uncaught exception", e); 

Но я не знаю, как использовать это в Grails с нагнетаемой log объекта. Он поддерживает только базовые параметры, такие как log.error('foo',e). Документация Grails говорит о том, как добавлять пользовательские приложения, но ничего о пользовательских уровнях (или мне это не хватало ?!)

Любые предложения?

ответ

2

Grails использует Slf4j и Commons Logging для абстрагирования реализации регистратора и позволяет перейти с Log4j на другую структуру без необходимости редактировать каждый файл с помощью регистратора. Вместо этого библиотека обертки получает правильный экземпляр реализации на основе запрошенного имени регистратора и того, что доступно из собственного API. Если вы изменяете реализации, то регистраторы-обертки работают так же, как и ваш код приложения, но они вызывают разные регистраторы реализации для фактического ведения журнала.

Но нет никакого стандарта между реализациями для конфигурации, поэтому внутренний код запуска Grails напрямую работает с API для настройки регистраторов, добавок, уровней и т. Д. Вы можете сделать то же самое - использовать традиционный код доступа Logger Logger для получения экземпляра по имени журнала, используя тот же самый, что и предварительно сконфигурированный регистратор Grails. Я никогда не могу вспомнить, соглашения об именах для лесорубов в артефактах, поэтому я обманываю и добавить строку кода

println log.name 

в методе, который я знаю, пробеги, и называю этот метод косвенно через любые действия контроллера может попасть. Так, например, если я хочу знать регистратор FractalService, поместите этот код в свой метод graphJuliaSet и вызовите действие контроллера, которое графы Julia Sets используют эту службу.

Log4j loggers являются одиночными, если вы обращаетесь к регистратору и меняете его, что повлияет на все будущие вызовы.

Так что регистратор доступен через что-то вроде:

String name = ... // the name from the println above 
Logger logger = Logger.getLogger(name) 
+0

благодаря Берт, я думаю, что я испортил мой импорт и не последовательно использовать log4j. Сейчас он работает как шарм – moeTi

Смежные вопросы