1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
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 }