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.reload4j;
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 public final class Reload4jLoggerAdapter extends LegacyAbstractLogger implements LocationAwareLogger, LoggingEventAware, Serializable {
63
64 private static final long serialVersionUID = 6989384227325275811L;
65
66 final transient org.apache.log4j.Logger logger;
67
68 final static String FQCN_NOMINAL = org.slf4j.helpers.AbstractLogger.class.getName();
69 final static String FQCN_SUBSTITUE = FQCN_NOMINAL;
70 final static String FQCN_FLUENT = org.slf4j.spi.DefaultLoggingEventBuilder.class.getName();
71
72
73
74 Reload4jLoggerAdapter(org.apache.log4j.Logger logger) {
75 this.logger = logger;
76 this.name = logger.getName();
77 }
78
79
80
81
82
83
84 public boolean isTraceEnabled() {
85 return logger.isTraceEnabled();
86 }
87
88
89
90
91
92
93 public boolean isDebugEnabled() {
94 return logger.isDebugEnabled();
95 }
96
97
98
99
100
101
102 public boolean isInfoEnabled() {
103 return logger.isInfoEnabled();
104 }
105
106
107
108
109
110
111 public boolean isWarnEnabled() {
112 return logger.isEnabledFor(Level.WARN);
113 }
114
115
116
117
118
119
120 public boolean isErrorEnabled() {
121 return logger.isEnabledFor(Level.ERROR);
122 }
123
124 @Override
125 public void log(Marker marker, String callerFQCN, int level, String msg, Object[] arguments, Throwable t) {
126 Level log4jLevel = toLog4jLevel(level);
127 NormalizedParameters np = NormalizedParameters.normalize(msg, arguments, t);
128 String formattedMessage = MessageFormatter.basicArrayFormat(np.getMessage(), np.getArguments());
129 logger.log(callerFQCN, log4jLevel, formattedMessage, np.getThrowable());
130 }
131
132 @Override
133 protected void handleNormalizedLoggingCall(org.slf4j.event.Level level, Marker marker, String msg, Object[] arguments, Throwable throwable) {
134 Level log4jLevel = toLog4jLevel(level.toInt());
135 String formattedMessage = MessageFormatter.basicArrayFormat(msg, arguments);
136 logger.log(getFullyQualifiedCallerName(), log4jLevel, formattedMessage, throwable);
137 }
138
139
140
141
142
143 public void log(LoggingEvent event) {
144 Level log4jLevel = toLog4jLevel(event.getLevel().toInt());
145 if (!logger.isEnabledFor(log4jLevel))
146 return;
147
148 org.apache.log4j.spi.LoggingEvent log4jevent = event2Log4jEvent(event, log4jLevel);
149 logger.callAppenders(log4jevent);
150
151 }
152
153 private org.apache.log4j.spi.LoggingEvent event2Log4jEvent(LoggingEvent event, Level log4jLevel) {
154
155 String formattedMessage = MessageFormatter.basicArrayFormat(event.getMessage(), event.getArgumentArray());
156
157 LocationInfo locationInfo = null;
158 String fqcn = null;
159
160 if (event instanceof SubstituteLoggingEvent) {
161 locationInfo = new LocationInfo(NA_SUBST, NA_SUBST, NA_SUBST, "0");
162 fqcn = FQCN_SUBSTITUE;
163 } else {
164 fqcn = FQCN_FLUENT;
165 }
166
167 ThrowableInformation ti = null;
168 Throwable t = event.getThrowable();
169 if (t != null)
170 ti = new ThrowableInformation(t);
171
172 org.apache.log4j.spi.LoggingEvent log4jEvent = new org.apache.log4j.spi.LoggingEvent(fqcn, logger, event.getTimeStamp(), log4jLevel, formattedMessage,
173 event.getThreadName(), ti, null, locationInfo, null);
174
175 return log4jEvent;
176 }
177
178 private Level toLog4jLevel(int slf4jLevelInt) {
179 Level log4jLevel;
180 switch (slf4jLevelInt) {
181 case LocationAwareLogger.TRACE_INT:
182 log4jLevel = Level.TRACE;
183 break;
184 case LocationAwareLogger.DEBUG_INT:
185 log4jLevel = Level.DEBUG;
186 break;
187 case LocationAwareLogger.INFO_INT:
188 log4jLevel = Level.INFO;
189 break;
190 case LocationAwareLogger.WARN_INT:
191 log4jLevel = Level.WARN;
192 break;
193 case LocationAwareLogger.ERROR_INT:
194 log4jLevel = Level.ERROR;
195 break;
196 default:
197 throw new IllegalStateException("Level number " + slf4jLevelInt + " is not recognized.");
198 }
199 return log4jLevel;
200 }
201
202 @Override
203 protected String getFullyQualifiedCallerName() {
204 return FQCN_NOMINAL;
205 }
206
207 }