19
19
import ch .qos .logback .classic .Level ;
20
20
import ch .qos .logback .classic .LoggerContext ;
21
21
import ch .qos .logback .classic .encoder .PatternLayoutEncoder ;
22
+ import ch .qos .logback .classic .filter .ThresholdFilter ;
22
23
import ch .qos .logback .classic .spi .ILoggingEvent ;
23
24
import ch .qos .logback .classic .turbo .TurboFilter ;
24
25
import ch .qos .logback .classic .util .ContextInitializer ;
28
29
import ch .qos .logback .core .util .OptionHelper ;
29
30
import com .alipay .sofa .common .log .CommonLoggingConfigurations ;
30
31
import com .alipay .sofa .common .log .Constants ;
31
- import com .alipay .sofa .common .space .SpaceId ;
32
32
import com .alipay .sofa .common .log .adapter .level .AdapterLevel ;
33
+ import com .alipay .sofa .common .space .SpaceId ;
33
34
import com .alipay .sofa .common .utils .StringUtil ;
34
35
import org .slf4j .Logger ;
35
36
import org .slf4j .Marker ;
36
37
37
38
import java .net .URL ;
38
- import java .util .*;
39
+ import java .util .Map ;
40
+ import java .util .Properties ;
41
+ import java .util .concurrent .ConcurrentHashMap ;
42
+ import java .util .concurrent .ConcurrentMap ;
39
43
40
44
/**
41
45
* @author qilong.zql
@@ -47,18 +51,18 @@ public class LogbackLoggerSpaceFactory extends AbstractLoggerSpaceFactory {
47
51
private LoggerContext loggerContext ;
48
52
private Properties properties ;
49
53
50
- // Console appender on this logger context
51
- private final ConsoleAppender <ILoggingEvent > consoleAppender ;
52
- private final Level consoleLevel ;
54
+ /**
55
+ * key: spanId, value: consoleAppender
56
+ * each logger have their own consoleAppender if had configured
57
+ **/
58
+ private ConcurrentMap <String , ConsoleAppender <ILoggingEvent >> consoleAppenders = new ConcurrentHashMap <>();
53
59
54
60
public LogbackLoggerSpaceFactory (SpaceId spaceId , LoggerContext loggerContext ,
55
61
Properties properties , URL confFile , String source ) {
56
62
super (source );
57
63
this .spaceId = spaceId ;
58
64
this .loggerContext = loggerContext ;
59
65
this .properties = properties ;
60
- consoleAppender = createConsoleAppender (loggerContext , properties );
61
- consoleLevel = getConsoleLevel (spaceId .getSpaceName (), properties );
62
66
63
67
for (Map .Entry <Object , Object > entry : properties .entrySet ()) {
64
68
loggerContext .putProperty ((String ) entry .getKey (), (String ) entry .getValue ());
@@ -79,33 +83,39 @@ public LogbackLoggerSpaceFactory(SpaceId spaceId, LoggerContext loggerContext,
79
83
@ Override
80
84
public FilterReply decide (Marker marker , ch .qos .logback .classic .Logger logger ,
81
85
Level level , String format , Object [] params , Throwable t ) {
86
+ ConsoleAppender <ILoggingEvent > consoleAppender = getOrCreateConsoleAppender (logger .getName ());
82
87
if (CommonLoggingConfigurations .shouldAttachConsoleAppender (logger .getName ())
83
88
&& !logger .isAttached (consoleAppender )) {
84
89
logger .addAppender (consoleAppender );
85
- // effective level won't be null
86
- if (logger .getEffectiveLevel ().isGreaterOrEqual (consoleLevel )) {
87
- logger .setLevel (consoleLevel );
88
- }
89
90
}
90
91
return FilterReply .NEUTRAL ;
91
92
}
92
93
});
93
94
}
94
95
}
95
96
96
- private ConsoleAppender <ILoggingEvent > createConsoleAppender (LoggerContext loggerContext , Properties properties ) {
97
- ConsoleAppender <ILoggingEvent > appender = new ConsoleAppender <>();
98
- PatternLayoutEncoder encoder = new PatternLayoutEncoder ();
99
- String logPattern = properties .getProperty (
100
- Constants .SOFA_MIDDLEWARE_LOG_CONSOLE_LOGBACK_PATTERN ,
101
- Constants .SOFA_MIDDLEWARE_LOG_CONSOLE_LOGBACK_PATTERN_DEFAULT );
102
- encoder .setPattern (OptionHelper .substVars (logPattern , loggerContext ));
103
- encoder .setContext (loggerContext );
104
- encoder .start ();
105
- appender .setEncoder (encoder );
106
- appender .setName ("CONSOLE" );
107
- appender .start ();
108
- return appender ;
97
+ private ConsoleAppender <ILoggingEvent > getOrCreateConsoleAppender (String loggerName ) {
98
+ return consoleAppenders .computeIfAbsent (loggerName , k -> {
99
+ ConsoleAppender <ILoggingEvent > appender = new ConsoleAppender <>();
100
+ PatternLayoutEncoder encoder = new PatternLayoutEncoder ();
101
+ String logPattern = properties .getProperty (
102
+ Constants .SOFA_MIDDLEWARE_LOG_CONSOLE_LOGBACK_PATTERN ,
103
+ Constants .SOFA_MIDDLEWARE_LOG_CONSOLE_LOGBACK_PATTERN_DEFAULT );
104
+ // create appender filter
105
+ Level consoleLevel = getConsoleLevel (spaceId .getSpaceName ());
106
+ ThresholdFilter filter = new ThresholdFilter ();
107
+ filter .setLevel (consoleLevel .toString ());
108
+
109
+ encoder .setPattern (OptionHelper .substVars (logPattern , loggerContext ));
110
+ encoder .setContext (loggerContext );
111
+ encoder .start ();
112
+ appender .setEncoder (encoder );
113
+ appender .setName (CONSOLE );
114
+ filter .start ();
115
+ appender .addFilter (filter );
116
+ appender .start ();
117
+ return appender ;
118
+ });
109
119
}
110
120
111
121
public SpaceId getSpaceId () {
@@ -116,7 +126,7 @@ public Properties getProperties() {
116
126
return properties ;
117
127
}
118
128
119
- private Level getConsoleLevel (String spaceId , Properties properties ) {
129
+ private Level getConsoleLevel (String spaceId ) {
120
130
String defaultLevel = properties .getProperty (
121
131
Constants .SOFA_MIDDLEWARE_ALL_LOG_CONSOLE_LEVEL , "INFO" );
122
132
String level = properties .getProperty (
0 commit comments