4 * Generated from: yang module name: config-test yang module local name: testing
5 * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
6 * Generated at: Fri Sep 27 14:06:33 CEST 2013
8 * Do not modify this file unless it is present under src/main directory
10 package org.opendaylight.controller.config.yang.logback.config;
12 import java.io.Closeable;
13 import java.io.IOException;
14 import java.util.HashMap;
15 import java.util.Iterator;
16 import java.util.List;
20 import org.slf4j.LoggerFactory;
22 import ch.qos.logback.classic.Level;
23 import ch.qos.logback.classic.LoggerContext;
24 import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
25 import ch.qos.logback.classic.filter.ThresholdFilter;
26 import ch.qos.logback.classic.spi.ILoggingEvent;
27 import ch.qos.logback.core.Appender;
28 import ch.qos.logback.core.rolling.FixedWindowRollingPolicy;
29 import ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy;
30 import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
32 import com.google.common.base.Optional;
33 import com.google.common.base.Preconditions;
34 import com.google.common.collect.Sets;
37 * Implementation of {@link ContextSetter}. Resets running logback
40 public class ContextSetterImpl implements ContextSetter, Closeable {
42 private final LogbackStatusListener statusListener;
43 private static final org.slf4j.Logger classLogger = LoggerFactory.getLogger(ContextSetterImpl.class);
45 public ContextSetterImpl(LogbackRuntimeRegistrator rootRuntimeBeanRegistratorWrapper) {
46 statusListener = new LogbackStatusListener(rootRuntimeBeanRegistratorWrapper);
47 statusListener.register();
50 public void updateContext(LogbackModule module) {
51 LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
53 List<ch.qos.logback.classic.Logger> loggersBefore = context.getLoggerList();
55 createLoggers(context, module, Sets.newHashSet(loggersBefore));
58 private Map<String, Appender<ILoggingEvent>> createConsoleAppenders(LoggerContext context, LogbackModule module) {
59 Map<String, Appender<ILoggingEvent>> appendersMap = new HashMap<>();
60 for (ConsoleAppenderTO appender : module.getConsoleAppenderTO()) {
61 Preconditions.checkState(appendersMap.containsKey(appender.getName()) == false,
62 "Duplicate appender name %s", appender.getName());
63 ch.qos.logback.core.ConsoleAppender app = new ch.qos.logback.core.ConsoleAppender();
64 app.setContext(context);
65 PatternLayoutEncoder encoder = new PatternLayoutEncoder();
66 encoder.setContext(context);
67 encoder.setPattern(appender.getEncoderPattern());
69 app.setEncoder(encoder);
70 ThresholdFilter filter = new ThresholdFilter();
71 filter.setContext(context);
72 filter.setLevel(appender.getThresholdFilter());
74 app.getCopyOfAttachedFiltersList().add(filter);
75 app.setName(appender.getName());
77 appendersMap.put(app.getName(), app);
82 private void createLoggers(LoggerContext context, LogbackModule module,
83 Set<ch.qos.logback.classic.Logger> loggersBefore) {
85 Map<String, Appender<ILoggingEvent>> appendersMap = getAppenders(module, context);
87 for (LoggerTO logger : module.getLoggerTO()) {
88 classLogger.trace("Setting configuration for logger {}", logger.getLoggerName());
89 final ch.qos.logback.classic.Logger logbackLogger = context.getLogger(logger.getLoggerName());
91 Optional<Set<Appender<ILoggingEvent>>> appendersBefore = getAppendersBefore(loggersBefore, logbackLogger);
92 classLogger.trace("Logger {}: Appenders registered before: {}", logger.getLoggerName(),
93 appendersBefore.isPresent() ? appendersBefore.get() : "NO APPENDERS BEFORE");
95 logbackLogger.setLevel(Level.toLevel(logger.getLevel()));
97 addNewAppenders(appendersMap, logger, logbackLogger, appendersBefore);
98 removeBeforeAppenders(loggersBefore, logger, logbackLogger, appendersBefore);
102 private void addNewAppenders(Map<String, Appender<ILoggingEvent>> appendersMap, LoggerTO logger,
103 ch.qos.logback.classic.Logger logbackLogger, Optional<Set<Appender<ILoggingEvent>>> appendersBefore) {
104 if (logger.getAppenders() != null) {
105 for (String appenderName : logger.getAppenders()) {
106 if (appendersMap.containsKey(appenderName)) {
107 logbackLogger.addAppender(appendersMap.get(appenderName));
108 classLogger.trace("Logger {}: Adding new appender: {}", logger.getLoggerName(), appenderName);
110 throw new IllegalStateException("No appender " + appenderName
111 + " found. This error should have been discovered by validation");
117 private void removeBeforeAppenders(Set<ch.qos.logback.classic.Logger> loggersBefore, LoggerTO logger,
118 ch.qos.logback.classic.Logger logbackLogger, Optional<Set<Appender<ILoggingEvent>>> appendersBefore) {
119 if (appendersBefore.isPresent()) {
120 for (Appender<ILoggingEvent> appenderBefore : appendersBefore.get()) {
121 logbackLogger.detachAppender(appenderBefore);
122 appenderBefore.stop();
123 classLogger.trace("Logger {}: Removing old appender: {}", logger.getLoggerName(),
124 appenderBefore.getName());
126 loggersBefore.remove(logbackLogger);
130 private Optional<Set<Appender<ILoggingEvent>>> getAppendersBefore(Set<ch.qos.logback.classic.Logger> loggersBefore,
131 ch.qos.logback.classic.Logger logbackLogger) {
132 if (loggersBefore.contains(logbackLogger)) {
133 Iterator<Appender<ILoggingEvent>> appenderIt = logbackLogger.iteratorForAppenders();
134 Set<Appender<ILoggingEvent>> appendersBefore = Sets.newHashSet();
135 while (appenderIt.hasNext()) {
136 appendersBefore.add(appenderIt.next());
138 return Optional.of(appendersBefore);
140 return Optional.absent();
144 private Map<String, Appender<ILoggingEvent>> getAppenders(LogbackModule module, LoggerContext context) {
145 Map<String, Appender<ILoggingEvent>> appendersMap = new HashMap<>();
146 addAllAppenders(appendersMap, createRollingAppenders(context, module));
147 addAllAppenders(appendersMap, createFileAppenders(context, module));
148 addAllAppenders(appendersMap, createConsoleAppenders(context, module));
153 private void addAllAppenders(Map<String, Appender<ILoggingEvent>> allAppenders,
154 Map<String, Appender<ILoggingEvent>> appendersToAdd) {
155 for (String appenderName : appendersToAdd.keySet()) {
156 Preconditions.checkState(allAppenders.containsKey(appenderName) == false, "Duplicate appender name %s",
158 allAppenders.put(appenderName, appendersToAdd.get(appenderName));
162 private Map<String, Appender<ILoggingEvent>> createFileAppenders(LoggerContext context, LogbackModule module) {
163 Map<String, Appender<ILoggingEvent>> appendersMap = new HashMap<>();
164 for (FileAppenderTO appender : module.getFileAppenderTO()) {
165 Preconditions.checkState(appendersMap.containsKey(appender.getName()) == false,
166 "Duplicate appender name %s", appender.getName());
167 ch.qos.logback.core.FileAppender app = new ch.qos.logback.core.FileAppender<>();
168 app.setAppend(appender.getAppend());
169 app.setContext(context);
170 PatternLayoutEncoder encoder = new PatternLayoutEncoder();
171 encoder.setContext(context);
172 encoder.setPattern(appender.getEncoderPattern());
174 app.setEncoder(encoder);
175 app.setFile(appender.getFileName());
176 app.setName(appender.getName());
178 appendersMap.put(app.getName(), app);
184 private Map<String, Appender<ILoggingEvent>> createRollingAppenders(LoggerContext context, LogbackModule module) {
185 Map<String, Appender<ILoggingEvent>> appendersMap = new HashMap<>();
186 for (RollingFileAppenderTO appender : module.getRollingFileAppenderTO()) {
187 Preconditions.checkState(appendersMap.containsKey(appender.getName()) == false,
188 "Duplicate appender name %s", appender.getName());
189 ch.qos.logback.core.rolling.RollingFileAppender app = new ch.qos.logback.core.rolling.RollingFileAppender<>();
190 app.setAppend(appender.getAppend());
191 app.setContext(context);
192 PatternLayoutEncoder encoder = new PatternLayoutEncoder();
193 encoder.setContext(context);
194 encoder.setPattern(appender.getEncoderPattern());
196 app.setEncoder(encoder);
197 app.setFile(appender.getFileName());
198 if (appender.getRollingPolicyType().equals("FixedWindowRollingPolicy")) {
199 FixedWindowRollingPolicy policy = new FixedWindowRollingPolicy();
200 policy.setContext(context);
201 policy.setMaxIndex(appender.getMaxIndex());
202 policy.setMinIndex(appender.getMinIndex());
203 policy.setFileNamePattern(appender.getFileNamePattern());
204 policy.setParent(app);
206 app.setRollingPolicy(policy);
207 } else if (appender.getRollingPolicyType().equals("TimeBasedRollingPolicy")) {
208 TimeBasedRollingPolicy policy = new TimeBasedRollingPolicy();
209 policy.setContext(context);
210 policy.setMaxHistory(appender.getMaxHistory());
211 if (appender.getCleanHistoryOnStart() != null) {
212 policy.setCleanHistoryOnStart(appender.getCleanHistoryOnStart());
214 policy.setFileNamePattern(appender.getFileNamePattern());
215 policy.setParent(app);
217 app.setRollingPolicy(policy);
219 SizeBasedTriggeringPolicy triggeringPolicy = new SizeBasedTriggeringPolicy();
220 triggeringPolicy.setContext(context);
221 triggeringPolicy.setMaxFileSize(appender.getMaxFileSize());
222 triggeringPolicy.start();
223 app.setTriggeringPolicy(triggeringPolicy);
224 app.setName(appender.getName());
226 appendersMap.put(app.getName(), app);
232 public void close() throws IOException {
233 statusListener.close();