2014-09-19 2 views
2

Я использую следующий подход для доступа к экземпляру лесоруба из классов в приложении Grails:добавляющих регистраторов для Grails классов

В Grails артефактах (контроллеры, услуги, классы предметной области и т.д.) Я просто использовать регистратор, который добавлено Grails, например

class MyController { 
    def someAction() { 
    log.debug "something" 
    } 
} 

Для классов под src/groovy я аннотировать их с @groovy.util.logging.Slf4j, например,

@Slf4j 
class Foo { 

    Foo() { 
    log.debug "log it" 
    } 
} 

Регистратор, кажется, правильно вести себя в обоих случаях, но это немного беспокоит меня, что класс лесорубов отличается. Когда я использую аннотацию, класс регистратора равен org.slf4j.impl.GrailsLog4jLoggerAdapter, но когда я использую регистратор, который автоматически добавляется в артефакты Grails, класс равен org.apache.commons.logging.impl.SLF4JLog.

Есть ли рекомендуемый (или лучший) подход к добавлению регистраторов к классам Grails?

ответ

2

Я не вижу никаких проблем с тем, что вы описали. SLF4J не является фреймворком протоколирования, это оболочка фреймворка. Но, помимо некоторых специфических крючков Grails в классе Grails, они реализуют один и тот же интерфейс и в конечном итоге делегируют их тем же регистраторам/appenders/etc. в реальной библиотеке реализации, как правило, Log4j.

То, что я уверен, отличается от категории/имени журнала, потому что вам нужно настроить базовую библиотеку на основе того, чем становятся имена журнала. С аннотациями имя регистратора совпадает с полным именем класса. С добавлением Grails добавляется дополнительный префикс, основанный на типе артефакта. Я всегда забываю соглашение об именах, но быстрый способ узнать имя регистратора - это его регистрация; добавить это в вашем классе, где он будет доступ во время выполнения:

println log.name 

и он будет печатать полное имя регистратора (с использованием println вместо метода log избежать возможных проблем настройки, которые могли бы сохранить сообщение от быть зарегистрированным

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

import org.apache.log4j.Logger 

а затем добавить это как поле класса:

Logger log = Logger.getLogger(getClass().name) 

Это может копировать/вставить в другие классы, так как там нет жестко закодированные имена. Он не будет работать в статическом объеме, поэтому для этого я хотел бы добавить

static Logger LOG = Logger.getLogger(this.name) 

, который также позволяет избежать жесткого кодирования, используя поддержку Groovy для «этого» в статическом объеме, чтобы обратиться к классу.

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