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 java.util.ArrayList;
20 import java.util.Collections;
21 import java.util.HashMap;
22 import java.util.Iterator;
23 import java.util.List;
25 import java.util.Map.Entry;
28 import org.apache.commons.lang3.StringUtils;
29 import org.opendaylight.controller.config.api.DependencyResolver;
30 import org.opendaylight.controller.config.api.DependencyResolverFactory;
31 import org.opendaylight.controller.config.api.ModuleIdentifier;
32 import org.osgi.framework.BundleContext;
33 import org.slf4j.LoggerFactory;
35 import ch.qos.logback.classic.Logger;
36 import ch.qos.logback.classic.LoggerContext;
37 import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
38 import ch.qos.logback.classic.spi.ILoggingEvent;
39 import ch.qos.logback.classic.spi.LoggerComparator;
40 import ch.qos.logback.core.Appender;
41 import ch.qos.logback.core.rolling.FixedWindowRollingPolicy;
42 import ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy;
43 import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
45 import com.google.common.base.Preconditions;
46 import com.google.common.collect.Lists;
47 import com.google.common.collect.Sets;
52 public class LogbackModuleFactory extends
53 org.opendaylight.controller.config.yang.logback.config.AbstractLogbackModuleFactory {
55 public static final String INSTANCE_NAME = "singleton";
56 private Map<String, LoggerTO> loggersDTOs;
57 private Map<String, RollingFileAppenderTO> rollingDTOs;
58 private Map<String, ConsoleAppenderTO> consoleDTOs;
59 private Map<String, FileAppenderTO> fileDTOs;
62 public LogbackModule instantiateModule(String instanceName, DependencyResolver dependencyResolver,
63 BundleContext bundleContext) {
64 Preconditions.checkArgument(instanceName.equals(INSTANCE_NAME),
65 "There should be just one instance of logback, named " + INSTANCE_NAME);
67 LogbackModule module = new LogbackModule(new ModuleIdentifier(getImplementationName(), INSTANCE_NAME),
69 module.setFileAppenderTO(Lists.newArrayList(fileDTOs.values()));
70 module.setConsoleAppenderTO(Lists.newArrayList(consoleDTOs.values()));
71 module.setRollingFileAppenderTO(Lists.newArrayList(rollingDTOs.values()));
72 module.setLoggerTO(Lists.newArrayList(loggersDTOs.values()));
77 public LogbackModule instantiateModule(String instanceName, DependencyResolver dependencyResolver,
78 LogbackModule oldModule, AutoCloseable oldInstance, BundleContext bundleContext) {
79 Preconditions.checkArgument(instanceName.equals(INSTANCE_NAME),
80 "There should be just one instance of logback, named " + INSTANCE_NAME);
82 LogbackModule module = new LogbackModule(new ModuleIdentifier(getImplementationName(), INSTANCE_NAME),
83 dependencyResolver, oldModule, oldInstance);
84 module.setConsoleAppenderTO(Lists.newArrayList(consoleDTOs.values()));
86 * module.setJCloudsAppender(Lists.newArrayList(jcloudsDTOs.values()));
88 module.setFileAppenderTO(Lists.newArrayList(fileDTOs.values()));
89 module.setRollingFileAppenderTO(Lists.newArrayList(rollingDTOs.values()));
90 module.setLoggerTO(Lists.newArrayList(loggersDTOs.values()));
94 private void prepareDTOs() {
95 LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
96 this.loggersDTOs = prepareLoggersDTOs(context);
97 prepareAppendersDTOs(context);
100 private void prepareAppendersDTOs(LoggerContext context) {
101 this.rollingDTOs = new HashMap<>();
102 this.consoleDTOs = new HashMap<>();
103 this.fileDTOs = new HashMap<>();
104 ch.qos.logback.core.rolling.RollingFileAppender<ILoggingEvent> rollingApp;
105 ch.qos.logback.core.ConsoleAppender<ILoggingEvent> consoleApp;
106 ch.qos.logback.core.FileAppender<ILoggingEvent> fileApp;
107 Map<Logger, List<Appender<ILoggingEvent>>> appendersAll = new HashMap<>();
108 for (Logger log : context.getLoggerList()) {
109 List<Appender<ILoggingEvent>> appenders = new ArrayList<>();
110 Iterator<Appender<ILoggingEvent>> iter = log.iteratorForAppenders();
111 while (iter.hasNext()) {
112 Appender<ILoggingEvent> element = iter.next();
113 appenders.add(element);
115 appendersAll.put(log, appenders);
117 for (List<ch.qos.logback.core.Appender<ILoggingEvent>> appEntry : appendersAll.values()) {
118 for (ch.qos.logback.core.Appender<ILoggingEvent> appender : appEntry) {
119 if (appender instanceof ch.qos.logback.core.rolling.RollingFileAppender<?>) {
120 RollingFileAppenderTO app = new RollingFileAppenderTO();
121 rollingApp = (ch.qos.logback.core.rolling.RollingFileAppender<ILoggingEvent>) appender;
122 app.setAppend(rollingApp.isAppend());
123 PatternLayoutEncoder encoder = (PatternLayoutEncoder) rollingApp.getEncoder();
124 app.setEncoderPattern(encoder.getPattern());
125 app.setFileName(rollingApp.getFile());
126 if (rollingApp.getRollingPolicy() instanceof FixedWindowRollingPolicy) {
127 FixedWindowRollingPolicy rollingPolicy = (FixedWindowRollingPolicy) rollingApp
129 app.setMaxIndex(rollingPolicy.getMaxIndex());
130 app.setMinIndex(rollingPolicy.getMinIndex());
131 app.setFileNamePattern(rollingPolicy.getFileNamePattern());
132 app.setRollingPolicyType("FixedWindowRollingPolicy");
133 } else if (rollingApp.getRollingPolicy() instanceof TimeBasedRollingPolicy<?>) {
134 TimeBasedRollingPolicy rollingPolicy = (TimeBasedRollingPolicy) rollingApp.getRollingPolicy();
135 app.setRollingPolicyType("TimeBasedRollingPolicy");
136 app.setFileNamePattern(rollingPolicy.getFileNamePattern());
137 app.setMaxHistory(rollingPolicy.getMaxHistory());
138 app.setCleanHistoryOnStart(rollingPolicy.isCleanHistoryOnStart());
140 SizeBasedTriggeringPolicy<ILoggingEvent> triggeringPolicy = (SizeBasedTriggeringPolicy<ILoggingEvent>) rollingApp
141 .getTriggeringPolicy();
142 app.setMaxFileSize(triggeringPolicy.getMaxFileSize());
143 app.setName(rollingApp.getName());
144 this.rollingDTOs.put(rollingApp.getName(), app);
145 } else if (appender instanceof ch.qos.logback.core.FileAppender<?>) {
146 FileAppenderTO app = new FileAppenderTO();
147 fileApp = (ch.qos.logback.core.FileAppender<ILoggingEvent>) appender;
148 app.setName(fileApp.getName());
149 app.setAppend(fileApp.isAppend());
150 app.setFileName(fileApp.getFile());
151 PatternLayoutEncoder encoder = (PatternLayoutEncoder) fileApp.getEncoder();
152 app.setEncoderPattern(encoder.getPattern());
153 this.fileDTOs.put(fileApp.getName(), app);
155 if (appender instanceof ch.qos.logback.core.ConsoleAppender<?>) {
156 ConsoleAppenderTO app = new ConsoleAppenderTO();
157 consoleApp = (ch.qos.logback.core.ConsoleAppender<ILoggingEvent>) appender;
158 consoleApp.getCopyOfAttachedFiltersList();
159 PatternLayoutEncoder encoder = (PatternLayoutEncoder) consoleApp.getEncoder();
160 app.setEncoderPattern(encoder.getPattern());
161 app.setName(consoleApp.getName());
162 app.setThresholdFilter(context.getLogger(Logger.ROOT_LOGGER_NAME).getEffectiveLevel().levelStr);
163 this.consoleDTOs.put(consoleApp.getName(), app);
169 private Map<String, LoggerTO> prepareLoggersDTOs(LoggerContext context) {
170 Map<String, LoggerTO> DTOs = new HashMap<>();
171 List<String> appenders = new ArrayList<>();
172 List<org.slf4j.Logger> loggersToBeAdd = removeUnusableLoggers(context.getLoggerList(),
173 context.getLogger(Logger.ROOT_LOGGER_NAME));
174 for (org.slf4j.Logger log : loggersToBeAdd) {
175 LoggerTO logger = new LoggerTO();
176 if (((Logger) log).getLevel() != null)
177 logger.setLevel(((Logger) log).getLevel().levelStr);
179 logger.setLevel(((Logger) log).getEffectiveLevel().levelStr);
180 logger.setLoggerName(log.getName());
181 Iterator<Appender<ILoggingEvent>> iter = ((Logger) log).iteratorForAppenders();
182 while (iter.hasNext()) {
183 Appender<ILoggingEvent> element = iter.next();
184 appenders.add(element.getName());
186 logger.setAppenders(appenders);
187 DTOs.put(log.getName(), logger);
188 appenders = new ArrayList<>();
194 private List<org.slf4j.Logger> removeUnusableLoggers(List<Logger> loggerList, Logger rootLogger) {
195 Collections.sort(loggerList, new LoggerComparator());
196 Map<String, org.slf4j.Logger> loggersToReturn = new HashMap<>();
198 for (org.slf4j.Logger log : loggerList) {
199 boolean shouldAdd = true;
200 for (Entry<String, org.slf4j.Logger> entry : loggersToReturn.entrySet()) {
201 if (StringUtils.contains(log.getName(), entry.getKey())) {
202 if (((Logger) log).getLevel() != null
203 && ((Logger) log).getLevel().equals(((Logger) entry.getValue()).getLevel())
204 && !((Logger) log).iteratorForAppenders().hasNext()) {
208 if (((Logger) log).getLevel() == null
209 && ((Logger) log).getEffectiveLevel().equals(
210 ((Logger) entry.getValue()).getEffectiveLevel())
211 && !((Logger) log).iteratorForAppenders().hasNext()) {
216 if (((Logger) log).getLevel() != null && ((Logger) log).getLevel().equals(rootLogger.getLevel())
217 && !((Logger) log).iteratorForAppenders().hasNext()) {
221 if (((Logger) log).getLevel() == null
222 && ((Logger) log).getEffectiveLevel().equals(rootLogger.getEffectiveLevel())
223 && !((Logger) log).iteratorForAppenders().hasNext()) {
229 loggersToReturn.put(log.getName(), log);
232 return Lists.newArrayList(loggersToReturn.values());
236 public Set<LogbackModule> getDefaultModules(DependencyResolverFactory dependencyResolverFactory,
237 BundleContext bundleContext) {
238 DependencyResolver resolver = dependencyResolverFactory.createDependencyResolver(new ModuleIdentifier(
239 getImplementationName(), INSTANCE_NAME));
240 LogbackModule defaultLogback = instantiateModule(INSTANCE_NAME, resolver, bundleContext);
241 Set<LogbackModule> defaultModules = Sets.newHashSet(defaultLogback);
242 return defaultModules;