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 package org.slf4j.bridge;
33
34 import java.text.MessageFormat;
35 import java.util.MissingResourceException;
36 import java.util.ResourceBundle;
37 import java.util.logging.Handler;
38 import java.util.logging.Level;
39 import java.util.logging.LogManager;
40 import java.util.logging.LogRecord;
41
42 import org.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
44 import org.slf4j.spi.LocationAwareLogger;
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 public class SLF4JBridgeHandler extends Handler {
86
87
88 private static final String FQCN = java.util.logging.Logger.class.getName();
89 private static final String UNKNOWN_LOGGER_NAME = "unknown.jul.logger";
90
91 private static final int TRACE_LEVEL_THRESHOLD = Level.FINEST.intValue();
92 private static final int DEBUG_LEVEL_THRESHOLD = Level.FINE.intValue();
93 private static final int INFO_LEVEL_THRESHOLD = Level.INFO.intValue();
94 private static final int WARN_LEVEL_THRESHOLD = Level.WARNING.intValue();
95
96
97
98
99
100
101
102
103
104
105 public static void install() {
106 LogManager.getLogManager().getLogger("").addHandler(
107 new SLF4JBridgeHandler());
108 }
109
110
111
112
113
114
115
116
117
118
119 public static void uninstall() throws SecurityException {
120 java.util.logging.Logger rootLogger = LogManager.getLogManager().getLogger(
121 "");
122 Handler[] handlers = rootLogger.getHandlers();
123 for (int i = 0; i < handlers.length; i++) {
124 if (handlers[i] instanceof SLF4JBridgeHandler) {
125 rootLogger.removeHandler(handlers[i]);
126 }
127 }
128 }
129
130
131
132
133
134 public SLF4JBridgeHandler() {
135 }
136
137
138
139
140 public void close() {
141
142 }
143
144
145
146
147 public void flush() {
148
149 }
150
151
152
153
154 protected Logger getSLF4JLogger(LogRecord record) {
155 String name = record.getLoggerName();
156 if (name == null) {
157 name = UNKNOWN_LOGGER_NAME;
158 }
159 return LoggerFactory.getLogger(name);
160 }
161
162 protected void callLocationAwareLogger(LocationAwareLogger lal,
163 LogRecord record) {
164 int julLevelValue = record.getLevel().intValue();
165 int slf4jLevel;
166
167 if (julLevelValue <= TRACE_LEVEL_THRESHOLD) {
168 slf4jLevel = LocationAwareLogger.TRACE_INT;
169 } else if (julLevelValue <= DEBUG_LEVEL_THRESHOLD) {
170 slf4jLevel = LocationAwareLogger.DEBUG_INT;
171 } else if (julLevelValue <= INFO_LEVEL_THRESHOLD) {
172 slf4jLevel = LocationAwareLogger.INFO_INT;
173 } else if (julLevelValue <= WARN_LEVEL_THRESHOLD) {
174 slf4jLevel = LocationAwareLogger.WARN_INT;
175 } else {
176 slf4jLevel = LocationAwareLogger.ERROR_INT;
177 }
178 String i18nMessage = getMessageI18N(record);
179 lal.log(null, FQCN, slf4jLevel, i18nMessage, record.getThrown());
180 }
181
182 protected void callPlainSLF4JLogger(Logger slf4jLogger, LogRecord record) {
183 String i18nMessage = getMessageI18N(record);
184 int julLevelValue = record.getLevel().intValue();
185 if (julLevelValue <= TRACE_LEVEL_THRESHOLD) {
186 slf4jLogger.trace(i18nMessage, record.getThrown());
187 } else if (julLevelValue <= DEBUG_LEVEL_THRESHOLD) {
188 slf4jLogger.debug(i18nMessage, record.getThrown());
189 } else if (julLevelValue <= INFO_LEVEL_THRESHOLD) {
190 slf4jLogger.info(i18nMessage, record.getThrown());
191 } else if (julLevelValue <= WARN_LEVEL_THRESHOLD) {
192 slf4jLogger.warn(i18nMessage, record.getThrown());
193 } else {
194 slf4jLogger.error(i18nMessage, record.getThrown());
195 }
196 }
197
198
199
200
201
202
203
204 private String getMessageI18N(LogRecord record) {
205 String message = record.getMessage();
206
207 if (message == null) {
208 return null;
209 }
210
211 ResourceBundle bundle = record.getResourceBundle();
212 if (bundle != null) {
213 try {
214 message = bundle.getString(message);
215 } catch (MissingResourceException e) {
216 }
217 }
218 Object[] params = record.getParameters();
219 if (params != null) {
220 message = MessageFormat.format(message, params);
221 }
222 return message;
223 }
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238 public void publish(LogRecord record) {
239
240 if (record == null) {
241 return;
242 }
243
244 Logger slf4jLogger = getSLF4JLogger(record);
245 String message = record.getMessage();
246
247
248 if (message == null) {
249 return;
250 }
251 if (slf4jLogger instanceof LocationAwareLogger) {
252 callLocationAwareLogger((LocationAwareLogger) slf4jLogger, record);
253 } else {
254 callPlainSLF4JLogger(slf4jLogger, record);
255 }
256 }
257
258 }