View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.shardingsphere.logging.rule.builder;
19  
20  import org.slf4j.Logger;
21  import ch.qos.logback.classic.LoggerContext;
22  import ch.qos.logback.classic.PatternLayout;
23  import ch.qos.logback.classic.spi.ILoggingEvent;
24  import ch.qos.logback.core.Appender;
25  import ch.qos.logback.core.FileAppender;
26  import ch.qos.logback.core.OutputStreamAppender;
27  import ch.qos.logback.core.encoder.LayoutWrappingEncoder;
28  import org.apache.shardingsphere.infra.rule.builder.global.DefaultGlobalRuleConfigurationBuilder;
29  import org.apache.shardingsphere.logging.config.LoggingRuleConfiguration;
30  import org.apache.shardingsphere.logging.constant.LoggingOrder;
31  import org.apache.shardingsphere.logging.logger.ShardingSphereAppender;
32  import org.apache.shardingsphere.logging.logger.ShardingSphereLogger;
33  import org.slf4j.LoggerFactory;
34  
35  import java.util.Collection;
36  import java.util.Comparator;
37  import java.util.Iterator;
38  import java.util.Objects;
39  import java.util.TreeSet;
40  import java.util.stream.Collectors;
41  
42  /**
43   * Default logging rule configuration builder.
44   */
45  public final class DefaultLoggingRuleConfigurationBuilder implements DefaultGlobalRuleConfigurationBuilder<LoggingRuleConfiguration, LoggingRuleBuilder> {
46      
47      @Override
48      public LoggingRuleConfiguration build() {
49          LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
50          return new LoggingRuleConfiguration(getDefaultLoggers(loggerContext), getDefaultAppenders(loggerContext));
51      }
52      
53      private Collection<ShardingSphereLogger> getDefaultLoggers(final LoggerContext loggerContext) {
54          return loggerContext.getLoggerList().stream().filter(each -> null != each.getLevel()).filter(each -> !Logger.ROOT_LOGGER_NAME.equalsIgnoreCase(each.getName()))
55                  .map(each -> new ShardingSphereLogger(each.getName(), each.getLevel().levelStr, each.isAdditive(),
56                          each.iteratorForAppenders().hasNext() ? each.iteratorForAppenders().next().getName() : null))
57                  .collect(Collectors.toList());
58      }
59      
60      private Collection<ShardingSphereAppender> getDefaultAppenders(final LoggerContext loggerContext) {
61          return loggerContext.getLoggerList().stream().filter(each -> null != each.getLevel()).filter(each -> !Logger.ROOT_LOGGER_NAME.equalsIgnoreCase(each.getName())).map(each -> {
62              Iterator<Appender<ILoggingEvent>> appenderIterator = each.iteratorForAppenders();
63              if (appenderIterator.hasNext()) {
64                  Appender<ILoggingEvent> appender = appenderIterator.next();
65                  ShardingSphereAppender shardingSphereAppender = new ShardingSphereAppender(appender.getName(), appender.getClass().getName(), getAppenderPattern(appender));
66                  getFileOutput(appender, shardingSphereAppender);
67                  return shardingSphereAppender;
68              }
69              return null;
70          }).filter(Objects::nonNull).collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(ShardingSphereAppender::getAppenderName))));
71      }
72      
73      private String getAppenderPattern(final Appender<ILoggingEvent> appender) {
74          if (appender instanceof OutputStreamAppender) {
75              OutputStreamAppender<ILoggingEvent> consoleAppender = (OutputStreamAppender<ILoggingEvent>) appender;
76              LayoutWrappingEncoder<ILoggingEvent> encoder = (LayoutWrappingEncoder<ILoggingEvent>) consoleAppender.getEncoder();
77              PatternLayout layout = (PatternLayout) encoder.getLayout();
78              return layout.getPattern();
79          }
80          return "";
81      }
82      
83      private void getFileOutput(final Appender<ILoggingEvent> appender, final ShardingSphereAppender shardingSphereAppender) {
84          if (appender instanceof FileAppender) {
85              shardingSphereAppender.setFile(((FileAppender<ILoggingEvent>) appender).getFile());
86          }
87      }
88      
89      @Override
90      public int getOrder() {
91          return LoggingOrder.ORDER;
92      }
93      
94      @Override
95      public Class<LoggingRuleBuilder> getTypeClass() {
96          return LoggingRuleBuilder.class;
97      }
98  }