View Javadoc
1   /*
2    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
3    * The software in this package is published under the terms of the CPAL v1.0
4    * license, a copy of which has been included with this distribution in the
5    * LICENSE.txt file.
6    */
7   package org.mule.module.logging;
8   
9   import org.slf4j.Logger;
10  import org.slf4j.Marker;
11  
12  /**
13   * A solution for logger references saved as static fields. When such logger is declared
14   * the log entries end up in the wrong hierarchy/appender.
15   */
16  public class DispatchingLogger implements Logger
17  {
18      protected static final Integer NO_CCL_CLASSLOADER = 0;
19  
20      protected Logger originalLogger;
21      protected Integer originalClassLoaderHash;
22      private String name;
23      private MuleLoggerFactory factory;
24  
25      public DispatchingLogger(Logger originalLogger, MuleLoggerFactory factory)
26      {
27          final ClassLoader ccl = Thread.currentThread().getContextClassLoader();
28          this.originalClassLoaderHash = ccl == null ? NO_CCL_CLASSLOADER : ccl.hashCode();
29          this.originalLogger = originalLogger;
30          this.name = originalLogger.getName();
31          this.factory = factory;
32      }
33  
34      public String getName()
35      {
36          return name;
37      }
38  
39      public boolean isTraceEnabled()
40      {
41          return getLogger().isTraceEnabled();
42      }
43  
44      public void trace(String msg)
45      {
46          getLogger().trace(msg);
47      }
48  
49      public void trace(String format, Object arg)
50      {
51          getLogger().trace(format, arg);
52      }
53  
54      public void trace(String format, Object arg1, Object arg2)
55      {
56          getLogger().trace(format, arg1, arg2);
57      }
58  
59      public void trace(String format, Object[] argArray)
60      {
61          getLogger().trace(format, argArray);
62      }
63  
64      public void trace(String msg, Throwable t)
65      {
66          getLogger().trace(msg, t);
67      }
68  
69      public boolean isTraceEnabled(Marker marker)
70      {
71          return getLogger().isTraceEnabled(marker);
72      }
73  
74      public void trace(Marker marker, String msg)
75      {
76          getLogger().trace(marker, msg);
77      }
78  
79      public void trace(Marker marker, String format, Object arg)
80      {
81          getLogger().trace(marker, format, arg);
82      }
83  
84      public void trace(Marker marker, String format, Object arg1, Object arg2)
85      {
86          getLogger().trace(marker, format, arg1, arg2);
87      }
88  
89      public void trace(Marker marker, String format, Object[] argArray)
90      {
91          getLogger().trace(marker, format, argArray);
92      }
93  
94      public void trace(Marker marker, String msg, Throwable t)
95      {
96          getLogger().trace(marker, msg, t);
97      }
98  
99      public boolean isDebugEnabled()
100     {
101         return getLogger().isDebugEnabled();
102     }
103 
104     public void debug(String msg)
105     {
106         getLogger().debug(msg);
107     }
108 
109     public void debug(String format, Object arg)
110     {
111         getLogger().debug(format, arg);
112     }
113 
114     public void debug(String format, Object arg1, Object arg2)
115     {
116         getLogger().debug(format, arg1, arg2);
117     }
118 
119     public void debug(String format, Object[] argArray)
120     {
121         getLogger().debug(format, argArray);
122     }
123 
124     public void debug(String msg, Throwable t)
125     {
126         getLogger().debug(msg, t);
127     }
128 
129     public boolean isDebugEnabled(Marker marker)
130     {
131         return getLogger().isDebugEnabled(marker);
132     }
133 
134     public void debug(Marker marker, String msg)
135     {
136         getLogger().debug(marker, msg);
137     }
138 
139     public void debug(Marker marker, String format, Object arg)
140     {
141         getLogger().debug(marker, format, arg);
142     }
143 
144     public void debug(Marker marker, String format, Object arg1, Object arg2)
145     {
146         getLogger().debug(marker, format, arg1, arg2);
147     }
148 
149     public void debug(Marker marker, String format, Object[] argArray)
150     {
151         getLogger().debug(marker, format, argArray);
152     }
153 
154     public void debug(Marker marker, String msg, Throwable t)
155     {
156         getLogger().debug(marker, msg, t);
157     }
158 
159     public boolean isInfoEnabled()
160     {
161         return getLogger().isInfoEnabled();
162     }
163 
164     public void info(String msg)
165     {
166         getLogger().info(msg);
167     }
168 
169     public void info(String format, Object arg)
170     {
171         getLogger().info(format, arg);
172     }
173 
174     public void info(String format, Object arg1, Object arg2)
175     {
176         getLogger().info(format, arg1, arg2);
177     }
178 
179     public void info(String format, Object[] argArray)
180     {
181         getLogger().info(format, argArray);
182     }
183 
184     public void info(String msg, Throwable t)
185     {
186         getLogger().info(msg, t);
187     }
188 
189     public boolean isInfoEnabled(Marker marker)
190     {
191         return getLogger().isInfoEnabled(marker);
192     }
193 
194     public void info(Marker marker, String msg)
195     {
196         getLogger().info(marker, msg);
197     }
198 
199     public void info(Marker marker, String format, Object arg)
200     {
201         getLogger().info(marker, format, arg);
202     }
203 
204     public void info(Marker marker, String format, Object arg1, Object arg2)
205     {
206         getLogger().info(marker, format, arg1, arg2);
207     }
208 
209     public void info(Marker marker, String format, Object[] argArray)
210     {
211         getLogger().info(marker, format, argArray);
212     }
213 
214     public void info(Marker marker, String msg, Throwable t)
215     {
216         getLogger().info(marker, msg, t);
217     }
218 
219     public boolean isWarnEnabled()
220     {
221         return getLogger().isWarnEnabled();
222     }
223 
224     public void warn(String msg)
225     {
226         getLogger().warn(msg);
227     }
228 
229     public void warn(String format, Object arg)
230     {
231         getLogger().warn(format, arg);
232     }
233 
234     public void warn(String format, Object[] argArray)
235     {
236         getLogger().warn(format, argArray);
237     }
238 
239     public void warn(String format, Object arg1, Object arg2)
240     {
241         getLogger().warn(format, arg1, arg2);
242     }
243 
244     public void warn(String msg, Throwable t)
245     {
246         getLogger().warn(msg, t);
247     }
248 
249     public boolean isWarnEnabled(Marker marker)
250     {
251         return getLogger().isWarnEnabled(marker);
252     }
253 
254     public void warn(Marker marker, String msg)
255     {
256         getLogger().warn(marker, msg);
257     }
258 
259     public void warn(Marker marker, String format, Object arg)
260     {
261         getLogger().warn(marker, format, arg);
262     }
263 
264     public void warn(Marker marker, String format, Object arg1, Object arg2)
265     {
266         getLogger().warn(marker, format, arg1, arg2);
267     }
268 
269     public void warn(Marker marker, String format, Object[] argArray)
270     {
271         getLogger().warn(marker, format, argArray);
272     }
273 
274     public void warn(Marker marker, String msg, Throwable t)
275     {
276         getLogger().warn(marker, msg, t);
277     }
278 
279     public boolean isErrorEnabled()
280     {
281         return getLogger().isErrorEnabled();
282     }
283 
284     public void error(String msg)
285     {
286         getLogger().error(msg);
287     }
288 
289     public void error(String format, Object arg)
290     {
291         getLogger().error(format, arg);
292     }
293 
294     public void error(String format, Object arg1, Object arg2)
295     {
296         getLogger().error(format, arg1, arg2);
297     }
298 
299     public void error(String format, Object[] argArray)
300     {
301         getLogger().error(format, argArray);
302     }
303 
304     public void error(String msg, Throwable t)
305     {
306         getLogger().error(msg, t);
307     }
308 
309     public boolean isErrorEnabled(Marker marker)
310     {
311         return getLogger().isErrorEnabled(marker);
312     }
313 
314     public void error(Marker marker, String msg)
315     {
316         getLogger().error(marker, msg);
317     }
318 
319     public void error(Marker marker, String format, Object arg)
320     {
321         getLogger().error(marker, format, arg);
322     }
323 
324     public void error(Marker marker, String format, Object arg1, Object arg2)
325     {
326         getLogger().error(marker, format, arg1, arg2);
327     }
328 
329     public void error(Marker marker, String format, Object[] argArray)
330     {
331         getLogger().error(marker, format, argArray);
332     }
333 
334     public void error(Marker marker, String msg, Throwable t)
335     {
336         getLogger().error(marker, msg, t);
337     }
338 
339     /**
340      * Dispatches lookup to the factory to pick up the right logger based on the context classloader,
341      * even if originally the logger was created with another classloader (which is the case with static
342      * log refs).
343      */
344     protected Logger getLogger()
345     {
346         final ClassLoader currentCl = Thread.currentThread().getContextClassLoader();
347         if (currentCl == null || currentCl.hashCode() == originalClassLoaderHash)
348         {
349             return originalLogger;
350         }
351         // trick - this is probably a logger declared in a static field
352         // the classloader used to create it and the TCCL can be different
353         // ask factory for the correct instance
354         return factory.getLogger(getName(), currentCl);
355     }
356 
357     public MuleLoggerFactory getFactory()
358     {
359         return factory;
360     }
361 }