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
12 * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
13 * Generated at: Wed Jul 17 15:26:45 CEST 2013
15 * Do not modifiy this file unless it is present under src/main directory
17 package org.opendaylight.controller.config.yang.logback.config;
19 import ch.qos.logback.classic.Logger;
20 import ch.qos.logback.classic.LoggerContext;
21 import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
22 import ch.qos.logback.classic.spi.ILoggingEvent;
23 import ch.qos.logback.classic.spi.LoggerComparator;
24 import ch.qos.logback.core.Appender;
25 import ch.qos.logback.core.rolling.FixedWindowRollingPolicy;
26 import ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy;
27 import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
28 import com.google.common.base.Preconditions;
29 import com.google.common.collect.Lists;
30 import com.google.common.collect.Sets;
31 import java.util.ArrayList;
32 import java.util.Collections;
33 import java.util.HashMap;
34 import java.util.Iterator;
35 import java.util.List;
37 import java.util.Map.Entry;
39 import org.apache.commons.lang3.StringUtils;
40 import org.opendaylight.controller.config.api.DependencyResolver;
41 import org.opendaylight.controller.config.api.DependencyResolverFactory;
42 import org.opendaylight.controller.config.api.ModuleIdentifier;
43 import org.osgi.framework.BundleContext;
44 import org.slf4j.LoggerFactory;
49 public class LogbackModuleFactory extends
50 org.opendaylight.controller.config.yang.logback.config.AbstractLogbackModuleFactory {
52 public static final String INSTANCE_NAME = "singleton";
53 private Map<String, LoggerTO> loggersDTOs;
54 private Map<String, RollingFileAppenderTO> rollingDTOs;
55 private Map<String, ConsoleAppenderTO> consoleDTOs;
56 private Map<String, FileAppenderTO> fileDTOs;
59 public LogbackModule instantiateModule(final String instanceName, final DependencyResolver dependencyResolver,
60 final BundleContext bundleContext) {
61 Preconditions.checkArgument(instanceName.equals(INSTANCE_NAME),
62 "There should be just one instance of logback, named " + INSTANCE_NAME);
64 LogbackModule module = new LogbackModule(new ModuleIdentifier(getImplementationName(), INSTANCE_NAME),
66 module.setFileAppenderTO(Lists.newArrayList(fileDTOs.values()));
67 module.setConsoleAppenderTO(Lists.newArrayList(consoleDTOs.values()));
68 module.setRollingFileAppenderTO(Lists.newArrayList(rollingDTOs.values()));
69 module.setLoggerTO(Lists.newArrayList(loggersDTOs.values()));
74 public LogbackModule instantiateModule(final String instanceName, final DependencyResolver dependencyResolver,
75 final LogbackModule oldModule, final AutoCloseable oldInstance, final BundleContext bundleContext) {
76 Preconditions.checkArgument(instanceName.equals(INSTANCE_NAME),
77 "There should be just one instance of logback, named " + INSTANCE_NAME);
79 LogbackModule module = new LogbackModule(new ModuleIdentifier(getImplementationName(), INSTANCE_NAME),
80 dependencyResolver, oldModule, oldInstance);
81 module.setConsoleAppenderTO(Lists.newArrayList(consoleDTOs.values()));
83 * module.setJCloudsAppender(Lists.newArrayList(jcloudsDTOs.values()));
85 module.setFileAppenderTO(Lists.newArrayList(fileDTOs.values()));
86 module.setRollingFileAppenderTO(Lists.newArrayList(rollingDTOs.values()));
87 module.setLoggerTO(Lists.newArrayList(loggersDTOs.values()));
91 private void prepareDTOs() {
92 LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
93 this.loggersDTOs = prepareLoggersDTOs(context);
94 prepareAppendersDTOs(context);
97 private void prepareAppendersDTOs(final LoggerContext context) {
98 this.rollingDTOs = new HashMap<>();
99 this.consoleDTOs = new HashMap<>();
100 this.fileDTOs = new HashMap<>();
101 ch.qos.logback.core.rolling.RollingFileAppender<ILoggingEvent> rollingApp;
102 ch.qos.logback.core.ConsoleAppender<ILoggingEvent> consoleApp;
103 ch.qos.logback.core.FileAppender<ILoggingEvent> fileApp;
104 Map<Logger, List<Appender<ILoggingEvent>>> appendersAll = new HashMap<>();
105 for (Logger log : context.getLoggerList()) {
106 List<Appender<ILoggingEvent>> appenders = new ArrayList<>();
107 Iterator<Appender<ILoggingEvent>> iter = log.iteratorForAppenders();
108 while (iter.hasNext()) {
109 Appender<ILoggingEvent> element = iter.next();
110 appenders.add(element);
112 appendersAll.put(log, appenders);
114 for (List<ch.qos.logback.core.Appender<ILoggingEvent>> appEntry : appendersAll.values()) {
115 for (ch.qos.logback.core.Appender<ILoggingEvent> appender : appEntry) {
116 if (appender instanceof ch.qos.logback.core.rolling.RollingFileAppender<?>) {
117 RollingFileAppenderTO app = new RollingFileAppenderTO();
118 rollingApp = (ch.qos.logback.core.rolling.RollingFileAppender<ILoggingEvent>) appender;
119 app.setAppend(rollingApp.isAppend());
120 PatternLayoutEncoder encoder = (PatternLayoutEncoder) rollingApp.getEncoder();
121 app.setEncoderPattern(encoder.getPattern());
122 app.setFileName(rollingApp.getFile());
123 if (rollingApp.getRollingPolicy() instanceof FixedWindowRollingPolicy) {
124 FixedWindowRollingPolicy rollingPolicy = (FixedWindowRollingPolicy) rollingApp
126 app.setMaxIndex(rollingPolicy.getMaxIndex());
127 app.setMinIndex(rollingPolicy.getMinIndex());
128 app.setFileNamePattern(rollingPolicy.getFileNamePattern());
129 app.setRollingPolicyType("FixedWindowRollingPolicy");
130 } else if (rollingApp.getRollingPolicy() instanceof TimeBasedRollingPolicy<?>) {
131 TimeBasedRollingPolicy<ILoggingEvent> rollingPolicy = (TimeBasedRollingPolicy<ILoggingEvent>) rollingApp.getRollingPolicy();
132 app.setRollingPolicyType("TimeBasedRollingPolicy");
133 app.setFileNamePattern(rollingPolicy.getFileNamePattern());
134 app.setMaxHistory(rollingPolicy.getMaxHistory());
135 app.setCleanHistoryOnStart(rollingPolicy.isCleanHistoryOnStart());
137 SizeBasedTriggeringPolicy<ILoggingEvent> triggeringPolicy = (SizeBasedTriggeringPolicy<ILoggingEvent>) rollingApp
138 .getTriggeringPolicy();
139 app.setMaxFileSize(triggeringPolicy.getMaxFileSize());
140 app.setName(rollingApp.getName());
141 this.rollingDTOs.put(rollingApp.getName(), app);
142 } else if (appender instanceof ch.qos.logback.core.FileAppender<?>) {
143 FileAppenderTO app = new FileAppenderTO();
144 fileApp = (ch.qos.logback.core.FileAppender<ILoggingEvent>) appender;
145 app.setName(fileApp.getName());
146 app.setAppend(fileApp.isAppend());
147 app.setFileName(fileApp.getFile());
148 PatternLayoutEncoder encoder = (PatternLayoutEncoder) fileApp.getEncoder();
149 app.setEncoderPattern(encoder.getPattern());
150 this.fileDTOs.put(fileApp.getName(), app);
152 if (appender instanceof ch.qos.logback.core.ConsoleAppender<?>) {
153 ConsoleAppenderTO app = new ConsoleAppenderTO();
154 consoleApp = (ch.qos.logback.core.ConsoleAppender<ILoggingEvent>) appender;
155 consoleApp.getCopyOfAttachedFiltersList();
156 PatternLayoutEncoder encoder = (PatternLayoutEncoder) consoleApp.getEncoder();
157 app.setEncoderPattern(encoder.getPattern());
158 app.setName(consoleApp.getName());
159 app.setThresholdFilter(context.getLogger(Logger.ROOT_LOGGER_NAME).getEffectiveLevel().levelStr);
160 this.consoleDTOs.put(consoleApp.getName(), app);
166 private Map<String, LoggerTO> prepareLoggersDTOs(final LoggerContext context) {
167 Map<String, LoggerTO> DTOs = new HashMap<>();
168 List<String> appenders = new ArrayList<>();
169 List<org.slf4j.Logger> loggersToBeAdd = removeUnusableLoggers(context.getLoggerList(),
170 context.getLogger(Logger.ROOT_LOGGER_NAME));
171 for (org.slf4j.Logger log : loggersToBeAdd) {
172 LoggerTO logger = new LoggerTO();
173 if (((Logger) log).getLevel() != null) {
174 logger.setLevel(((Logger) log).getLevel().levelStr);
176 logger.setLevel(((Logger) log).getEffectiveLevel().levelStr);
178 logger.setLoggerName(log.getName());
179 Iterator<Appender<ILoggingEvent>> iter = ((Logger) log).iteratorForAppenders();
180 while (iter.hasNext()) {
181 Appender<ILoggingEvent> element = iter.next();
182 appenders.add(element.getName());
184 logger.setAppenders(appenders);
185 DTOs.put(log.getName(), logger);
186 appenders = new ArrayList<>();
192 private List<org.slf4j.Logger> removeUnusableLoggers(final List<Logger> loggerList, final Logger rootLogger) {
193 Collections.sort(loggerList, new LoggerComparator());
194 Map<String, org.slf4j.Logger> loggersToReturn = new HashMap<>();
196 for (org.slf4j.Logger log : loggerList) {
197 boolean shouldAdd = true;
198 for (Entry<String, org.slf4j.Logger> entry : loggersToReturn.entrySet()) {
199 if (StringUtils.contains(log.getName(), entry.getKey())) {
200 if (((Logger) log).getLevel() != null
201 && ((Logger) log).getLevel().equals(((Logger) entry.getValue()).getLevel())
202 && !((Logger) log).iteratorForAppenders().hasNext()) {
206 if (((Logger) log).getLevel() == null
207 && ((Logger) log).getEffectiveLevel().equals(
208 ((Logger) entry.getValue()).getEffectiveLevel())
209 && !((Logger) log).iteratorForAppenders().hasNext()) {
214 if (((Logger) log).getLevel() != null && ((Logger) log).getLevel().equals(rootLogger.getLevel())
215 && !((Logger) log).iteratorForAppenders().hasNext()) {
219 if (((Logger) log).getLevel() == null
220 && ((Logger) log).getEffectiveLevel().equals(rootLogger.getEffectiveLevel())
221 && !((Logger) log).iteratorForAppenders().hasNext()) {
227 loggersToReturn.put(log.getName(), log);
230 return Lists.newArrayList(loggersToReturn.values());
234 public Set<LogbackModule> getDefaultModules(final DependencyResolverFactory dependencyResolverFactory,
235 final BundleContext bundleContext) {
236 DependencyResolver resolver = dependencyResolverFactory.createDependencyResolver(new ModuleIdentifier(
237 getImplementationName(), INSTANCE_NAME));
238 LogbackModule defaultLogback = instantiateModule(INSTANCE_NAME, resolver, bundleContext);
239 Set<LogbackModule> defaultModules = Sets.newHashSet(defaultLogback);
240 return defaultModules;