2013-08-14 2 views
1

Я пытаюсь написать собственные приложения, которые имеют специальную конфигурацию, и мне нужно будет сделать соответствующие теги для их конфигурации xml. Из справочника журнала ясно, как это должно быть сделано: добавив новые правила в конфигуратор, как описано здесь: http://logback.qos.ch/manual/onJoran.htmlДобавить теги в конфигурацию журнала

Моя проблема заключается в том, как добавить это правило, когда конфигуратор не создается напрямую, но когда он создается с помощью slf4j. Когда вы впервые получаете доступ к slf4j-api LoggerFactory, slf4j-api будет искать доступное связывание в пути к классам. Если вы правильно указали logback-classic, будет найдено переплет, это класс StaticLoggerBinder. Его инициализация показывает

try { 
     try { 
     new ContextInitializer(defaultLoggerContext).autoConfig(); 
     } catch (JoranException je) { 
     Util.report("Failed to auto configure default logger context", je); 
     } 
     // logback-292 
     if(!StatusUtil.contextHasStatusListener(defaultLoggerContext)) { 
     StatusPrinter.printInCaseOfErrorsOrWarnings(defaultLoggerContext); 
     } 
     contextSelectorBinder.init(defaultLoggerContext, KEY); 
     initialized = true; 
    } catch (Throwable t) { 
     // we should never get here 
     Util.report("Failed to instantiate [" + LoggerContext.class.getName() 
      + "]", t); 
    } 
    } 

Если заглянуть внутрь ContextInitializer.autoconfig() мы видим, что если файл инициализации доступен, он делегирует работа

public void configureByResource(URL url) throws JoranException { 
    if (url == null) { 
     throw new IllegalArgumentException("URL argument cannot be null"); 
    } 
    if (url.toString().endsWith("groovy")) { 
     if (EnvUtil.isGroovyAvailable()) { 
     // avoid directly referring to GafferConfigurator so as to avoid 
     // loading groovy.lang.GroovyObject . See also http://jira.qos.ch/browse/LBCLASSIC-214 
     GafferUtil.runGafferConfiguratorOn(loggerContext, this, url); 
     } else { 
     StatusManager sm = loggerContext.getStatusManager(); 
     sm.add(new ErrorStatus("Groovy classes are not available on the class path. ABORTING INITIALIZATION.", 
       loggerContext)); 
     } 
    } 
    if (url.toString().endsWith("xml")) { 
     JoranConfigurator configurator = new JoranConfigurator(); 
     configurator.setContext(loggerContext); 
     configurator.doConfigure(url); 
    } 
    } 

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

<newRule pattern="*/appender/asynclogger" actionClass="com.logentries.logback.joran.AsyncLoggerAction"/> 


    <appender name="LE" class="com.logentries.logback.LogentriesAppender"> 
     <asynclogger> 
      <logentries-httpput ssl="false" account="myAccount" key="myKey"/> 
      <ignore-exceptions/> 
     </asynclogger> 
     <facility>USER</facility> 
     <layout> 
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
     </layout> 
    </appender> 

У меня такое чувство, что я делаю это неоптимальным образом, есть ли лучшее решение?

+0

Новые правила динамически интегрируются в исполняемый экземпляр конфигуратора при чтении XML-файла. Вероятно, я не понимаю ваш вопрос. – Ceki

+0

Я лучше объяснил свою проблему – Edmondo1984

+0

Если вы просто хотите установить пользовательские свойства bean-компонента в своем приложении, вам не нужно ничего делать на уровне Joran. Например, чтобы настроить [ZMQSocketAppender] (https://github.com/tlrx/slf4j-logback-zeromq/blob/master/src/main/java/org/tlrx/logback/appender/ZMQSocketAppender.java), вы просто добавьте [элементы, соответствующие свойствам] (https://github.com/tlrx/slf4j-logback-zeromq#configuration). –

ответ

2

Имеет ли logentries-httpput какое-то поле LogentriesAppender? Если да, просто напишите:

<appender name="LE" class="com.logentries.logback.LogentriesAppender"> 
     <logentries-httpput class="fully-qualified-class-name-for-logentries-httpput"> 
      <ssl>false</ssl> 
      <account>myAccount</account> 
      <key>myKey</key> 
     </logentries-httpput> 
     <ignore-exceptions/> 
     <facility>USER</facility> 
     <layout> 
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
     </layout> 
    </appender> 

Joran выполнит проводку самостоятельно. Вам не нужно указывать какие-либо правила.

+0

делает ли обозначение всегда работать? Могу ли я использовать его вложенным? Спасибо – Edmondo1984

+0

Да, вложенность таких элементов поддерживается. – Ceki

+0

На самом деле это не то, что я вижу: 14: 35: 41,907 | -ERROR в [email protected]: 71 - не применимо действие для [asynclogger], текущий шаблон [[ Конфигурация] [appender] [asynclogger]] Edmondo1984

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