/
LogServiceLog4j2Impl.java
125 lines (110 loc) · 4.46 KB
/
LogServiceLog4j2Impl.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.karaf.log.core.internal;
import java.util.Collections;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.felix.utils.collections.DictionaryAsMap;
import org.apache.karaf.log.core.Level;
public class LogServiceLog4j2Impl implements LogServiceInternal {
static final String ROOT_LOGGER_LEVEL = "log4j2.rootLogger.level";
static final String LOGGER_PREFIX = "log4j2.logger.";
static final String NAME_SUFFIX = ".name";
static final String LEVEL_SUFFIX = ".level";
private final Map<String, Object> config;
public LogServiceLog4j2Impl(Dictionary<String, Object> config) {
this.config = new DictionaryAsMap<>(config);
}
public Map<String, String> getLevel(String logger) {
Map<String, String> loggers = new TreeMap<>();
String root = (String) config.get(ROOT_LOGGER_LEVEL);
loggers.put(ROOT_LOGGER, root);
if (ROOT_LOGGER.equals(logger)) {
return loggers;
}
Map<String, String> names = new HashMap<>();
Map<String, String> levels = new HashMap<>();
for (String key : config.keySet()) {
Matcher matcher = Pattern.compile("log4j2\\.logger\\.([a-zA-Z_]+)\\.name").matcher(key);
if (matcher.matches()) {
names.put(matcher.group(1), config.get(key).toString());
}
matcher = Pattern.compile("log4j2\\.logger\\.([a-zA-Z_]+)\\.level").matcher(key);
if (matcher.matches()) {
levels.put(matcher.group(1), config.get(key).toString());
}
}
for (Map.Entry<String, String> e : names.entrySet()) {
loggers.put(e.getValue(), levels.get(e.getKey()));
}
if (ALL_LOGGER.equalsIgnoreCase(logger)) {
return loggers;
}
String l = logger;
String val;
for (;;) {
val = loggers.get(l != null ? l : ROOT_LOGGER);
if (val != null || l == null) {
return Collections.singletonMap(logger, val);
}
int idx = l.lastIndexOf('.');
if (idx < 0) {
l = null;
} else {
l = l.substring(0, idx);
}
}
}
public void setLevel(String logger, String level) {
if (logger == null || LogServiceInternal.ROOT_LOGGER.equalsIgnoreCase(logger)) {
config.put(ROOT_LOGGER_LEVEL, level);
} else {
String loggerKey = null;
for (String key : config.keySet()) {
Matcher matcher = Pattern.compile("\\Q" + LOGGER_PREFIX + "\\E([a-zA-Z_]+)\\Q" + NAME_SUFFIX + "\\E").matcher(key);
if (matcher.matches()) {
String name = config.get(key).toString();
if (name.matches(logger)) {
loggerKey = matcher.group(1);
break;
}
}
}
if (loggerKey != null) {
if (Level.isDefault(level)) {
config.remove(level(loggerKey));
} else {
config.put(level(loggerKey), level);
}
} else {
loggerKey = logger.replace('.', '_').toLowerCase();
config.put(name(loggerKey), logger);
config.put(level(loggerKey), level);
}
}
}
private String name(String logger) {
return LOGGER_PREFIX + logger + NAME_SUFFIX;
}
private String level(String logger) {
return LOGGER_PREFIX + logger + LEVEL_SUFFIX;
}
}