2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.config.yang.logback.config;
10 import static org.junit.Assert.assertEquals;
12 import ch.qos.logback.classic.LoggerContext;
13 import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
14 import ch.qos.logback.classic.joran.JoranConfigurator;
15 import ch.qos.logback.classic.spi.ILoggingEvent;
16 import ch.qos.logback.core.joran.spi.JoranException;
17 import ch.qos.logback.core.rolling.FixedWindowRollingPolicy;
18 import ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy;
19 import com.google.common.collect.Lists;
21 import java.io.IOException;
22 import java.lang.management.ManagementFactory;
23 import java.util.ArrayList;
24 import java.util.Arrays;
25 import java.util.List;
26 import javax.management.InstanceAlreadyExistsException;
27 import javax.management.InstanceNotFoundException;
28 import javax.management.JMX;
29 import javax.management.MalformedObjectNameException;
30 import javax.management.ObjectName;
31 import org.apache.commons.io.FileUtils;
32 import org.junit.Before;
33 import org.junit.Test;
34 import org.opendaylight.controller.config.api.ConflictingVersionException;
35 import org.opendaylight.controller.config.api.ValidationException;
36 import org.opendaylight.controller.config.api.jmx.ObjectNameUtil;
37 import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
38 import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
39 import org.opendaylight.controller.config.util.ConfigTransactionClient;
40 import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
41 import org.slf4j.LoggerFactory;
43 public class LogbackModuleWithInitialConfigurationTest extends AbstractConfigTest {
45 private LogbackModuleFactory factory;
48 public void setUp() throws IOException, ClassNotFoundException {
50 factory = new LogbackModuleFactory();
51 super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(mockedContext,factory));
55 * Tests that initial configuration was changed. Changed attributes:
56 * location, fileName, duplicateInsertTries. Added new FileAppender.
59 public void test() throws Exception {
63 ConfigTransactionClient transaction = configRegistryClient.createTransaction();
65 LogbackModuleMXBean bean = JMX.newMXBeanProxy(ManagementFactory.getPlatformMBeanServer(),
66 transaction.lookupConfigBean("logback", "singleton"), LogbackModuleMXBean.class);
67 assertEquals(1, bean.getConsoleAppenderTO().size());
68 assertEquals(1, bean.getRollingFileAppenderTO().size());
69 assertEquals(0, bean.getFileAppenderTO().size());
70 assertEquals(1, bean.getLoggerTO().size());
72 RollingFileAppenderTO rolling = new RollingFileAppenderTO();
73 RollingFileAppenderTO old = bean.getRollingFileAppenderTO().get(0);
74 rolling.setAppend(old.getAppend());
75 rolling.setEncoderPattern(old.getEncoderPattern());
76 rolling.setRollingPolicyType(old.getRollingPolicyType());
77 rolling.setFileName("target/logFile1.log");
78 rolling.setFileNamePattern("target/%i.log");
79 rolling.setMaxFileSize(old.getMaxFileSize());
80 rolling.setMinIndex(old.getMinIndex());
81 rolling.setMaxIndex(old.getMaxIndex());
82 rolling.setName("FILE");
84 ConsoleAppenderTO console = new ConsoleAppenderTO();
85 console.setEncoderPattern("%date %level [%thread] %logger{10} %msg%n");
86 console.setName("SYSTEM");
87 console.setThresholdFilter("DEBUG");
89 FileAppenderTO file = new FileAppenderTO();
90 file.setName("FILE_APPENDER");
92 file.setEncoderPattern("%-4relative [%thread] %-5level %logger{35} - %msg%n");
93 file.setFileName("target/testFile.log");
95 bean.setConsoleAppenderTO(Lists.newArrayList(console));
96 bean.setRollingFileAppenderTO(Lists.newArrayList(rolling));
97 bean.setFileAppenderTO(Lists.newArrayList(file));
99 LoggerTO logger = new LoggerTO();
100 logger.setLevel("INFO");
101 logger.setLoggerName("logger");
102 logger.setAppenders(Lists.newArrayList("SYSTEM"));
104 LoggerTO fileLogger = new LoggerTO();
105 fileLogger.setLevel("DEBUG");
106 fileLogger.setLoggerName("fileLogger");
107 fileLogger.setAppenders(Lists.newArrayList("FILE_APPENDER"));
109 List<LoggerTO> loggers = Lists.newArrayList(logger, fileLogger);
110 bean.setLoggerTO(loggers);
112 transaction.commit();
114 LogbackModuleMXBean logback = configRegistryClient.newMXBeanProxy(
115 ObjectNameUtil.createReadOnlyModuleON("logback", "singleton"), LogbackModuleMXBean.class);
117 List<RollingFileAppenderTO> rollingList = logback.getRollingFileAppenderTO();
118 assertEquals(1, rollingList.size());
120 RollingFileAppenderTO rollingApp = rollingList.get(0);
121 assertEquals(rollingApp.getFileName(), "target/logFile1.log");
122 assertEquals(rollingApp.getName(), "FILE");
124 List<ConsoleAppenderTO> consoleList = logback.getConsoleAppenderTO();
125 assertEquals(1, consoleList.size());
127 ConsoleAppenderTO consoleApp = consoleList.get(0);
128 assertEquals(consoleApp.getThresholdFilter(), "DEBUG");
129 assertEquals(consoleApp.getName(), "SYSTEM");
131 List<FileAppenderTO> fileList = logback.getFileAppenderTO();
132 assertEquals(1, fileList.size());
134 FileAppenderTO fileApp = fileList.get(0);
135 assertEquals(fileApp.getFileName(), "target/testFile.log");
136 assertEquals(fileApp.getName(), "FILE_APPENDER");
138 loggers = logback.getLoggerTO();
139 assertEquals(2, loggers.size());
140 assertEquals("logger", loggers.get(0).getLoggerName());
141 assertEquals("fileLogger", loggers.get(1).getLoggerName());
145 public ObjectName createBeans() throws JoranException, InstanceAlreadyExistsException, IOException,
146 MalformedObjectNameException, InstanceNotFoundException, ValidationException, ConflictingVersionException {
148 LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
150 JoranConfigurator configurator = new JoranConfigurator();
151 configurator.setContext(lc);
152 configurator.doConfigure("src/test/resources/simple_config_logback.xml");
153 File f = new File("target/it");
155 FileUtils.cleanDirectory(f);
156 ch.qos.logback.classic.Logger logger = lc.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME);
157 ch.qos.logback.core.rolling.RollingFileAppender<ILoggingEvent> fileAppender = (ch.qos.logback.core.rolling.RollingFileAppender<ILoggingEvent>) logger
158 .getAppender("VARLOGFILE");
159 fileAppender.start();
161 ch.qos.logback.core.ConsoleAppender<ILoggingEvent> consoleAppender = (ch.qos.logback.core.ConsoleAppender<ILoggingEvent>) logger
162 .getAppender("STDOUT");
163 consoleAppender.start();
164 List<RollingFileAppenderTO> rollingAppenders = new ArrayList<>();
165 RollingFileAppenderTO rollingApp = new RollingFileAppenderTO();
166 rollingApp.setAppend(fileAppender.isAppend());
167 PatternLayoutEncoder enc = (PatternLayoutEncoder) fileAppender.getEncoder();
168 rollingApp.setEncoderPattern(enc.getPattern());
169 rollingApp.setFileName(fileAppender.getFile());
170 FixedWindowRollingPolicy rollingPolicy = (FixedWindowRollingPolicy) fileAppender.getRollingPolicy();
171 rollingApp.setRollingPolicyType("FixedWindowRollingPolicy");
172 rollingApp.setMaxIndex(rollingPolicy.getMaxIndex());
173 rollingApp.setMinIndex(rollingPolicy.getMinIndex());
174 SizeBasedTriggeringPolicy<ILoggingEvent> triggeringPolicy = (SizeBasedTriggeringPolicy<ILoggingEvent>) fileAppender
175 .getTriggeringPolicy();
176 rollingApp.setMaxFileSize(triggeringPolicy.getMaxFileSize());
177 rollingApp.setName(fileAppender.getName());
178 rollingApp.setFileNamePattern(rollingPolicy.getFileNamePattern());
179 rollingAppenders.add(rollingApp);
181 assertEquals(rollingApp.getFileName(), "target/osgi.log");
182 assertEquals(rollingApp.getMaxFileSize(), "50MB");
183 assertEquals(rollingApp.getName(), "VARLOGFILE");
185 List<ConsoleAppenderTO> consoleAppenders = new ArrayList<>();
186 ConsoleAppenderTO consoleApp = new ConsoleAppenderTO();
187 enc = (PatternLayoutEncoder) consoleAppender.getEncoder();
188 consoleApp.setEncoderPattern(enc.getPattern());
189 consoleApp.setName(consoleAppender.getName());
190 consoleApp.setThresholdFilter("ALL");
191 consoleAppenders.add(consoleApp);
193 List<FileAppenderTO> fileAppenders = new ArrayList<>();
195 List<LoggerTO> loggersDTOs = new ArrayList<>();
196 LoggerTO log = new LoggerTO();
197 log.setAppenders(Arrays.asList(fileAppender.getName(), consoleApp.getName()));
199 log.setLevel(logger.getLevel().toString());
200 log.setLoggerName(logger.getName());
201 loggersDTOs.add(log);
203 ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
204 ObjectName nameRetrieved = transaction.lookupConfigBean(factory.getImplementationName(), LogbackModuleFactory.INSTANCE_NAME);
205 LogbackModuleMXBean bean = transaction.newMXBeanProxy(nameRetrieved, LogbackModuleMXBean.class);
207 bean.setLoggerTO(loggersDTOs);
208 bean.setRollingFileAppenderTO(rollingAppenders);
209 bean.setConsoleAppenderTO(consoleAppenders);
210 bean.setFileAppenderTO(fileAppenders);
212 transaction.commit();
214 return nameRetrieved;