Я пытаюсь написать собственные приложения, которые имеют специальную конфигурацию, и мне нужно будет сделать соответствующие теги для их конфигурации 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>
У меня такое чувство, что я делаю это неоптимальным образом, есть ли лучшее решение?
Новые правила динамически интегрируются в исполняемый экземпляр конфигуратора при чтении XML-файла. Вероятно, я не понимаю ваш вопрос. – Ceki
Я лучше объяснил свою проблему – Edmondo1984
Если вы просто хотите установить пользовательские свойства 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). –