--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>config-plugin-parent</artifactId>
+ <version>0.2.5-SNAPSHOT</version>
+ <relativePath>../config-plugin-parent</relativePath>
+ </parent>
+ <artifactId>logback-config-loader</artifactId>
+ <packaging>bundle</packaging>
+ <name>${project.artifactId}</name>
+ <prerequisites>
+ <maven>3.0.4</maven>
+ </prerequisites>
+
+ <dependencies>
+ <dependency>
+ <groupId>ch.qos.logback</groupId>
+ <artifactId>logback-classic</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>ch.qos.logback</groupId>
+ <artifactId>logback-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ </dependency>
+
+ <!-- test dependencies -->
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <configuration>
+ <instructions>
+ <Bundle-Activator>org.opendaylight.controller.logback.config.loader.Activator</Bundle-Activator>
+ </instructions>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
--- /dev/null
+/**
+ * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.logback.config.loader;
+
+import java.io.File;
+import java.util.List;
+
+import org.opendaylight.controller.logback.config.loader.impl.LogbackConfigUtil;
+import org.opendaylight.controller.logback.config.loader.impl.LogbackConfigurationLoader;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * default activator for loading multiple logback configuration files
+ */
+public class Activator implements BundleActivator {
+
+ /**
+ * expected environment variable name, containing the root folder containing
+ * logback configurations
+ */
+ private static final String LOGBACK_CONFIG_D = "logback.config.d";
+ private static Logger LOG = LoggerFactory.getLogger(Activator.class);
+
+ @Override
+ public void start(BundleContext context) {
+ LOG.info("Starting logback configuration loader");
+ String logbackConfigRoot = System.getProperty(LOGBACK_CONFIG_D);
+ LOG.debug("configRoot: {}", logbackConfigRoot);
+ if (logbackConfigRoot != null) {
+ File logbackConfigRootFile = new File(logbackConfigRoot);
+ List<File> sortedConfigFiles = LogbackConfigUtil.harvestSortedConfigFiles(logbackConfigRootFile);
+ LogbackConfigurationLoader.load(true, sortedConfigFiles.toArray());
+ }
+ }
+
+ @Override
+ public void stop(BundleContext context) {
+ LOG.info("Stopping logback configuration loader");
+ // TODO: need reset/reload default config?
+ }
+
+}
--- /dev/null
+/**
+ * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.logback.config.loader.impl;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.regex.Pattern;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * logback config utils
+ */
+public final class LogbackConfigUtil {
+
+ /** logback config file pattern (*.xml) */
+ protected static final String LOGBACK_CONFIG_FILE_REGEX_SEED = ".+\\.xml";
+ private static final Logger LOG = LoggerFactory
+ .getLogger(LogbackConfigUtil.class);
+
+ /**
+ * forbidden ctor
+ */
+ private LogbackConfigUtil() {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * @param logConfigRoot folder containing configuration files
+ * @return sorted list of found files
+ */
+ public static List<File> harvestSortedConfigFiles(File logConfigRoot) {
+ final Pattern xmlFilePattern = Pattern.compile(LOGBACK_CONFIG_FILE_REGEX_SEED);
+ File[] configs = logConfigRoot.listFiles(new FileFilter() {
+ @Override
+ public boolean accept(File pathname) {
+ return pathname.isFile()
+ && xmlFilePattern.matcher(pathname.getName()).find();
+ }
+ });
+
+ List<File> sortedConfigFiles = new ArrayList<File>(configs.length);
+ for (File cfgItem : configs) {
+ LOG.trace("config: {}", cfgItem.toURI());
+ sortedConfigFiles.add(cfgItem);
+ }
+ Collections.sort(sortedConfigFiles);
+
+ return sortedConfigFiles;
+ }
+
+}
--- /dev/null
+/**
+ * Copyright (c) 201 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.logback.config.loader.impl;
+
+import java.io.File;
+import java.net.URL;
+
+import org.slf4j.ILoggerFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.joran.JoranConfigurator;
+import ch.qos.logback.core.joran.spi.JoranException;
+import ch.qos.logback.core.util.StatusPrinter;
+
+/**
+ * Logback configuration loader.
+ * Strategy:
+ * <ol>
+ * <li>reset actual configuration (probably default configuration)</li>
+ * <li>load all given logback config xml files in given order</li>
+ * </ol>
+ */
+public final class LogbackConfigurationLoader {
+
+ private static final Logger LOG = LoggerFactory
+ .getLogger(LogbackConfigurationLoader.class);
+
+ /**
+ * forbidden ctor
+ */
+ private LogbackConfigurationLoader() {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * load given logback configurations in given order, reset existing configuration before applying first one
+ * @param purgeBefore require reset before loading first config
+ * @param args
+ */
+ public static void load(boolean purgeBefore, Object...args) {
+ try {
+ if (purgeBefore) {
+ resetExistingConfiguration();
+ }
+ for (Object logbackConfig : args) {
+ load(logbackConfig);
+ }
+ } catch (IllegalStateException e) {
+ LOG.warn("loading of multiple logback configurations failed", e);
+ }
+ }
+
+ /**
+ * purge existing logback configuration
+ */
+ public static void resetExistingConfiguration() {
+ LOG.trace("resetting existing logback configuration");
+ LoggerContext context = getLoggerContext();
+ JoranConfigurator configurator = new JoranConfigurator();
+ configurator.setContext(context);
+ context.reset();
+ }
+
+ /**
+ * @return logback context
+ */
+ private static LoggerContext getLoggerContext() {
+ ILoggerFactory context = LoggerFactory.getILoggerFactory();
+ if (context != null && context instanceof LoggerContext) {
+ // now SLF4J is bound to logback in the current environment
+ return (LoggerContext) context;
+ }
+ throw new IllegalStateException("current logger factory is not supported: " + context);
+ }
+
+ /**
+ * @param logbackConfig
+ * @param reset true if previous configuration needs to get purged
+ */
+ public static void load(Object logbackConfig) {
+ LOG.trace("BEFORE logback reconfig");
+ try {
+ LoggerContext context = getLoggerContext();
+ JoranConfigurator configurator = new JoranConfigurator();
+ configurator.setContext(context);
+ if (logbackConfig instanceof String) {
+ configurator.doConfigure((String) logbackConfig);
+ } else if (logbackConfig instanceof URL) {
+ configurator.doConfigure((URL) logbackConfig);
+ } else if (logbackConfig instanceof File) {
+ configurator.doConfigure((File) logbackConfig);
+ }
+
+ LOG.trace("applied {}", logbackConfig);
+ StatusPrinter.printInCaseOfErrorsOrWarnings(context);
+ } catch (IllegalStateException | JoranException je) {
+ LOG.warn("Logback configuration loading failed: {}", logbackConfig);
+ }
+ LOG.trace("AFTER logback reconfig");
+ }
+
+}
--- /dev/null
+/**
+ * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.logback.config.loader.test;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.opendaylight.controller.logback.config.loader.impl.LogbackConfigUtil;
+import org.opendaylight.controller.logback.config.loader.impl.LogbackConfigurationLoader;
+import org.opendaylight.controller.logback.config.loader.test.logwork.Debugger;
+import org.opendaylight.controller.logback.config.loader.test.logwork.Errorer;
+import org.opendaylight.controller.logback.config.loader.test.logwork.Informer;
+import org.opendaylight.controller.logback.config.loader.test.logwork.Tracer;
+import org.opendaylight.controller.logback.config.loader.test.logwork.Warner;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * test of logging config loader - {@link LogbackConfigurationLoader}
+ */
+@RunWith(JUnit4.class)
+public class LogbackConfigurationLoaderTest {
+
+ /** logback config root */
+ private static final String LOGBACK_D = "/logback.d";
+ private static Logger LOG = LoggerFactory
+ .getLogger(LogbackConfigurationLoaderTest.class);
+
+ /**
+ * Test of method {@link LogbackConfigurationLoader#load(boolean, Object[])}
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testLoad() throws Exception {
+ File logConfigRoot = new File(LogbackConfigurationLoaderTest.class
+ .getResource(LOGBACK_D).getFile());
+ List<File> sortedConfigFiles = LogbackConfigUtil.harvestSortedConfigFiles(logConfigRoot);
+ LogbackConfigurationLoader.load(true, sortedConfigFiles.toArray());
+
+ LOG.info("LOGBACK ready -> about to use it");
+
+ Tracer.doSomeAction();
+ Debugger.doSomeAction();
+ Informer.doSomeAction();
+ Warner.doSomeAction();
+ Errorer.doSomeAction();
+
+ // check logs
+ String[] expectedLogs = new String[] {
+ "LoggingEvent -> [INFO] org.opendaylight.controller.logback.config.loader.test.LogbackConfigurationLoaderTest: LOGBACK ready -> about to use it",
+ "LoggingEvent -> [TRACE] org.opendaylight.controller.logback.config.loader.test.logwork.Tracer: tracing",
+ "LoggingEvent -> [DEBUG] org.opendaylight.controller.logback.config.loader.test.logwork.Tracer: debugging",
+ "LoggingEvent -> [INFO] org.opendaylight.controller.logback.config.loader.test.logwork.Tracer: infoing",
+ "LoggingEvent -> [WARN] org.opendaylight.controller.logback.config.loader.test.logwork.Tracer: warning",
+ "LoggingEvent -> [ERROR] org.opendaylight.controller.logback.config.loader.test.logwork.Tracer: erroring",
+ "LoggingEvent -> [DEBUG] org.opendaylight.controller.logback.config.loader.test.logwork.Debugger: debugging",
+ "LoggingEvent -> [INFO] org.opendaylight.controller.logback.config.loader.test.logwork.Debugger: infoing",
+ "LoggingEvent -> [WARN] org.opendaylight.controller.logback.config.loader.test.logwork.Debugger: warning",
+ "LoggingEvent -> [ERROR] org.opendaylight.controller.logback.config.loader.test.logwork.Debugger: erroring",
+ "LoggingEvent -> [INFO] org.opendaylight.controller.logback.config.loader.test.logwork.Informer: infoing",
+ "LoggingEvent -> [WARN] org.opendaylight.controller.logback.config.loader.test.logwork.Informer: warning",
+ "LoggingEvent -> [ERROR] org.opendaylight.controller.logback.config.loader.test.logwork.Informer: erroring",
+ "LoggingEvent -> [WARN] org.opendaylight.controller.logback.config.loader.test.logwork.Warner: warning",
+ "LoggingEvent -> [ERROR] org.opendaylight.controller.logback.config.loader.test.logwork.Warner: erroring",
+ "LoggingEvent -> [ERROR] org.opendaylight.controller.logback.config.loader.test.logwork.Errorer: erroring"
+
+ };
+
+ List<String> logSnapshot = new ArrayList<>(TestAppender.getLogRecord());
+ for (String logLine : logSnapshot) {
+ LOG.info("\"{}\",", logLine);
+ }
+
+ Assert.assertArrayEquals(expectedLogs, logSnapshot.toArray());
+ }
+}
--- /dev/null
+/**
+ * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.logback.config.loader.test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import ch.qos.logback.classic.spi.LoggingEvent;
+import ch.qos.logback.core.Appender;
+import ch.qos.logback.core.Context;
+import ch.qos.logback.core.LogbackException;
+import ch.qos.logback.core.filter.Filter;
+import ch.qos.logback.core.spi.FilterReply;
+import ch.qos.logback.core.status.Status;
+
+/**
+ * dummy appender for collecting log messages
+ *
+ * @param <E>
+ */
+public class TestAppender<E> implements Appender<E> {
+
+ private boolean started;
+ private Context context;
+ private String name;
+
+ private static List<String> logRecord = new ArrayList<>();
+
+ @Override
+ public void start() {
+ started = true;
+ }
+
+ @Override
+ public void stop() {
+ started = false;
+ }
+
+ @Override
+ public boolean isStarted() {
+ return started;
+ }
+
+ @Override
+ public void setContext(Context context) {
+ this.context = context;
+ }
+
+ @Override
+ public Context getContext() {
+ return context;
+ }
+
+ @Override
+ public void addStatus(Status status) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public void addInfo(String msg) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public void addInfo(String msg, Throwable ex) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public void addWarn(String msg) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public void addWarn(String msg, Throwable ex) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public void addError(String msg) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public void addError(String msg, Throwable ex) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public void addFilter(Filter<E> newFilter) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public void clearAllFilters() {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public List<Filter<E>> getCopyOfAttachedFiltersList() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public FilterReply getFilterChainDecision(E event) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public void doAppend(E event) throws LogbackException {
+ if (event instanceof LoggingEvent) {
+ LoggingEvent lEvent = (LoggingEvent) event;
+ logRecord.add(String.format("%s -> [%s] %s: %s", event.getClass()
+ .getSimpleName(), lEvent.getLevel(),
+ lEvent.getLoggerName(), lEvent.getMessage()));
+ } else {
+ logRecord.add(event.getClass() + " -> " + event.toString());
+ }
+ }
+
+ @Override
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * @return the logRecord
+ */
+ public static List<String> getLogRecord() {
+ return logRecord;
+ }
+
+}
--- /dev/null
+/**
+ * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.logback.config.loader.test.logwork;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * dummy logging guy
+ */
+public class Debugger {
+
+ private static Logger LOG = LoggerFactory.getLogger(Debugger.class);
+
+ /**
+ * all logging
+ */
+ public static void doSomeAction() {
+ LOG.trace("tracing");
+ LOG.debug("debugging");
+ LOG.info("infoing");
+ LOG.warn("warning");
+ LOG.error("erroring");
+ }
+
+}
--- /dev/null
+/**
+ * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.logback.config.loader.test.logwork;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * dummy logging guy
+ */
+public class Errorer {
+
+ private static Logger LOG = LoggerFactory.getLogger(Errorer.class);
+
+ /**
+ * all logging
+ */
+ public static void doSomeAction() {
+ LOG.trace("tracing");
+ LOG.debug("debugging");
+ LOG.info("infoing");
+ LOG.warn("warning");
+ LOG.error("erroring");
+ }
+
+}
--- /dev/null
+/**
+ * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.logback.config.loader.test.logwork;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * dummy logging guy
+ */
+public class Informer {
+
+ private static Logger LOG = LoggerFactory.getLogger(Informer.class);
+
+ /**
+ * all logging
+ */
+ public static void doSomeAction() {
+ LOG.trace("tracing");
+ LOG.debug("debugging");
+ LOG.info("infoing");
+ LOG.warn("warning");
+ LOG.error("erroring");
+ }
+
+}
--- /dev/null
+/**
+ * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.logback.config.loader.test.logwork;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * dummy logging guy
+ */
+public class Tracer {
+
+ private static Logger LOG = LoggerFactory.getLogger(Tracer.class);
+
+ /**
+ * all logging
+ */
+ public static void doSomeAction() {
+ LOG.trace("tracing");
+ LOG.debug("debugging");
+ LOG.info("infoing");
+ LOG.warn("warning");
+ LOG.error("erroring");
+ }
+
+}
--- /dev/null
+/**
+ * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.logback.config.loader.test.logwork;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * dummy logging guy
+ */
+public class Warner {
+
+ private static Logger LOG = LoggerFactory.getLogger(Warner.class);
+
+ /**
+ * all logging
+ */
+ public static void doSomeAction() {
+ LOG.trace("tracing");
+ LOG.debug("debugging");
+ LOG.info("infoing");
+ LOG.warn("warning");
+ LOG.error("erroring");
+ }
+
+}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<configuration debug="true">\r
+\r
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">\r
+ <encoder>\r
+ <pattern>%date{"yyyy-MM-dd HH:mm:ss.SSS z"} [%thread] %-5level %logger{36} - %msg%n</pattern>\r
+ </encoder>\r
+ </appender>\r
+\r
+ <root level="INFO">\r
+ <appender-ref ref="STDOUT" />\r
+ </root>\r
+\r
+ <!-- Base log level -->\r
+ <logger name="org.opendaylight.controller.logback.config.loader" level="DEBUG"/>\r
+\r
+</configuration>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<configuration debug="false">\r
+\r
+ <appender name="TEST" class="org.opendaylight.controller.logback.config.loader.test.TestAppender"/>\r
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">\r
+ <encoder>\r
+ <pattern>%date{"yyyy-MM-dd HH:mm:ss.SSS z"} [%thread] %-5level %logger{36} - %msg%n</pattern>\r
+ </encoder>\r
+ </appender>\r
+\r
+ <root level="INFO">\r
+ <appender-ref ref="TEST" />\r
+ <appender-ref ref="STDOUT" />\r
+ </root>\r
+\r
+ <!-- Base log level -->\r
+ <logger name="org.opendaylight.controller.logback.config.loader" level="INFO"/>\r
+\r
+</configuration>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<configuration debug="false">\r
+\r
+ <!-- Base log level -->\r
+ <logger name="org.opendaylight.controller.logback.config.loader" level="DEBUG"/>\r
+ <logger name="org.opendaylight.controller.logback.config.loader.test.logwork.Tracer" level="TRACE"/>\r
+<!-- <logger name="org.opendaylight.controller.logback.config.loader.test.logwork.Debugger" level="DEBUG"/> -->\r
+ <logger name="org.opendaylight.controller.logback.config.loader.test.logwork.Informer" level="DEBUG"/>\r
+ <logger name="org.opendaylight.controller.logback.config.loader.test.logwork.Warner" level="ERROR"/>\r
+ <logger name="org.opendaylight.controller.logback.config.loader.test.logwork.Errorer" level="ERROR"/>\r
+\r
+</configuration>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<configuration debug="false">\r
+ <root level="INFO">\r
+ <appender-ref ref="TEST" />\r
+ </root>\r
+\r
+ <logger name="org.opendaylight.controller.logback.config.loader.test.logwork.Informer" level="INFO"/>\r
+ <logger name="org.opendaylight.controller.logback.config.loader.test.logwork.Warner" level="WARN"/>\r
+\r
+ <logger name="org.opendaylight.controller.logback.config.loader.test.LogbackConfigurationLoaderTest" level="TRACE"/>\r
+</configuration>\r