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 package org.slf4j.log4j12;
26
27 import static org.slf4j.event.EventConstants.NA_SUBST;
28
29 import java.io.Serializable;
30
31 import org.apache.log4j.Level;
32 import org.apache.log4j.spi.LocationInfo;
33 import org.apache.log4j.spi.ThrowableInformation;
34 import org.slf4j.Logger;
35 import org.slf4j.Marker;
36 import org.slf4j.event.LoggingEvent;
37 import org.slf4j.event.SubstituteLoggingEvent;
38 import org.slf4j.helpers.LegacyAbstractLogger;
39 import org.slf4j.helpers.MessageFormatter;
40 import org.slf4j.helpers.NormalizedParameters;
41 import org.slf4j.helpers.SubstituteLogger;
42 import org.slf4j.spi.LocationAwareLogger;
43 import org.slf4j.spi.LoggingEventAware;
44 import org.slf4j.spi.LoggingEventBuilder;
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 public final class Log4jLoggerAdapter extends LegacyAbstractLogger implements LocationAwareLogger, LoggingEventAware, Serializable {
65
66 private static final long serialVersionUID = 6182834493563598289L;
67
68 final transient org.apache.log4j.Logger logger;
69
70
71
72
73
74
75 final static String FQCN_NOMINAL = org.slf4j.helpers.AbstractLogger.class.getName();
76 final static String FQCN_SUBSTITUE = FQCN_NOMINAL;
77 final static String FQCN_FLUENT = org.slf4j.spi.DefaultLoggingEventBuilder.class.getName();
78
79
80
81 final boolean traceCapable;
82
83
84
85 Log4jLoggerAdapter(org.apache.log4j.Logger logger) {
86 this.logger = logger;
87 this.name = logger.getName();
88 traceCapable = isTraceCapable();
89 }
90
91 private boolean isTraceCapable() {
92 try {
93 logger.isTraceEnabled();
94 return true;
95 } catch (NoSuchMethodError e) {
96 return false;
97 }
98 }
99
100
101
102
103
104
105 public boolean isTraceEnabled() {
106 if (traceCapable) {
107 return logger.isTraceEnabled();
108 } else {
109 return logger.isDebugEnabled();
110 }
111 }
112
113
114
115
116
117
118 public boolean isDebugEnabled() {
119 return logger.isDebugEnabled();
120 }
121
122
123
124
125
126
127 public boolean isInfoEnabled() {
128 return logger.isInfoEnabled();
129 }
130
131
132
133
134
135
136 public boolean isWarnEnabled() {
137 return logger.isEnabledFor(Level.WARN);
138 }
139
140
141
142
143
144
145 public boolean isErrorEnabled() {
146 return logger.isEnabledFor(Level.ERROR);
147 }
148
149 @Override
150 public void log(Marker marker, String callerFQCN, int level, String msg, Object[] arguments, Throwable t) {
151 Level log4jLevel = toLog4jLevel(level);
152 NormalizedParameters np = NormalizedParameters.normalize(msg, arguments, t);
153 String formattedMessage = MessageFormatter.basicArrayFormat(np.getMessage(), np.getArguments());
154 logger.log(callerFQCN, log4jLevel, formattedMessage, np.getThrowable());
155 }
156
157 @Override
158 protected void handleNormalizedLoggingCall(org.slf4j.event.Level level, Marker marker, String msg, Object[] arguments, Throwable throwable) {
159 Level log4jLevel = toLog4jLevel(level.toInt());
160 String formattedMessage = MessageFormatter.basicArrayFormat(msg, arguments);
161 logger.log(getFullyQualifiedCallerName(), log4jLevel, formattedMessage, throwable);
162 }
163
164
165
166
167
168 public void log(LoggingEvent event) {
169 Level log4jLevel = toLog4jLevel(event.getLevel().toInt());
170 if (!logger.isEnabledFor(log4jLevel))
171 return;
172
173 org.apache.log4j.spi.LoggingEvent log4jevent = event2Log4jEvent(event, log4jLevel);
174 logger.callAppenders(log4jevent);
175
176 }
177
178 private org.apache.log4j.spi.LoggingEvent event2Log4jEvent(LoggingEvent event, Level log4jLevel) {
179
180 String formattedMessage = MessageFormatter.basicArrayFormat(event.getMessage(), event.getArgumentArray());
181
182 LocationInfo locationInfo = null;
183 String fcqn = null;
184
185 if (event instanceof SubstituteLoggingEvent) {
186 locationInfo = new LocationInfo(NA_SUBST, NA_SUBST, NA_SUBST, "0");
187 fcqn = FQCN_SUBSTITUE;
188 } else {
189 fcqn = FQCN_FLUENT;
190 }
191
192 ThrowableInformation ti = null;
193 Throwable t = event.getThrowable();
194 if (t != null)
195 ti = new ThrowableInformation(t);
196
197 org.apache.log4j.spi.LoggingEvent log4jEvent = new org.apache.log4j.spi.LoggingEvent(fcqn, logger, event.getTimeStamp(), log4jLevel, formattedMessage,
198 event.getThreadName(), ti, null, locationInfo, null);
199
200 return log4jEvent;
201 }
202
203 private Level toLog4jLevel(int slf4jLevelInt) {
204 Level log4jLevel;
205 switch (slf4jLevelInt) {
206 case LocationAwareLogger.TRACE_INT:
207 log4jLevel = traceCapable ? Level.TRACE : Level.DEBUG;
208 break;
209 case LocationAwareLogger.DEBUG_INT:
210 log4jLevel = Level.DEBUG;
211 break;
212 case LocationAwareLogger.INFO_INT:
213 log4jLevel = Level.INFO;
214 break;
215 case LocationAwareLogger.WARN_INT:
216 log4jLevel = Level.WARN;
217 break;
218 case LocationAwareLogger.ERROR_INT:
219 log4jLevel = Level.ERROR;
220 break;
221 default:
222 throw new IllegalStateException("Level number " + slf4jLevelInt + " is not recognized.");
223 }
224 return log4jLevel;
225 }
226
227 @Override
228 protected String getFullyQualifiedCallerName() {
229 return FQCN_NOMINAL;
230 }
231
232 }