View Javadoc

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