View Javadoc

1   /*
2    *  Licensed to the Apache Software Foundation (ASF) under one
3    *  or more contributor license agreements.  See the NOTICE file
4    *  distributed with this work for additional information
5    *  regarding copyright ownership.  The ASF licenses this file
6    *  to you under the Apache License, Version 2.0 (the
7    *  "License"); you may not use this file except in compliance
8    *  with the License.  You may obtain a copy of the License at
9    *
10   *    http://www.apache.org/licenses/LICENSE-2.0
11   *
12   *  Unless required by applicable law or agreed to in writing,
13   *  software distributed under the License is distributed on an
14   *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   *  KIND, either express or implied.  See the License for the
16   *  specific language governing permissions and limitations
17   *  under the License.
18   *
19   */
20  package org.apache.mina.filter.logging;
21  
22  import org.apache.mina.core.filterchain.IoFilter;
23  import org.apache.mina.core.filterchain.IoFilterAdapter;
24  import org.apache.mina.core.session.IdleStatus;
25  import org.apache.mina.core.session.IoEventType;
26  import org.apache.mina.core.session.IoSession;
27  import org.apache.mina.core.write.WriteRequest;
28  import org.slf4j.Logger;
29  import org.slf4j.LoggerFactory;
30  
31  /**
32   * Logs all MINA protocol events.  Each event can be
33   * tuned to use a different level based on the user's specific requirements.  Methods
34   * are in place that allow the user to use either the get or set method for each event
35   * and pass in the {@link IoEventType} and the {@link LogLevel}.
36   *
37   * By default, all events are logged to the {@link LogLevel#INFO} level except
38   * {@link IoFilterAdapter#exceptionCaught(IoFilter.NextFilter, IoSession, Throwable)},
39   * which is logged to {@link LogLevel#WARN}.
40   *
41   * @author The Apache MINA Project (dev@mina.apache.org)
42   * @version $Rev: 733952 $, $Date: 2009-01-12 23:51:07 +0100 (Mon, 12 Jan 2009) $
43   * @org.apache.xbean.XBean
44   */
45  public class LoggingFilter extends IoFilterAdapter {
46      /** The logger name */
47      private final String name;
48      
49      /** The logger */
50      private final Logger logger;
51      
52      /** The log level for the exceptionCaught event. Default to WARN. */
53      private LogLevel exceptionCaughtLevel = LogLevel.WARN;
54      
55      /** The log level for the messageSent event. Default to INFO. */
56      private LogLevel messageSentLevel = LogLevel.INFO;
57      
58      /** The log level for the messageReceived event. Default to INFO. */
59      private LogLevel messageReceivedLevel = LogLevel.INFO;
60      
61      /** The log level for the sessionCreated event. Default to INFO. */
62      private LogLevel sessionCreatedLevel = LogLevel.INFO;
63      
64      /** The log level for the sessionOpened event. Default to INFO. */
65      private LogLevel sessionOpenedLevel = LogLevel.INFO;
66      
67      /** The log level for the sessionIdle event. Default to INFO. */
68      private LogLevel sessionIdleLevel = LogLevel.INFO;
69      
70      /** The log level for the sessionClosed event. Default to INFO. */
71      private LogLevel sessionClosedLevel = LogLevel.INFO;
72      
73      /**
74       * Default Constructor.
75       */
76      public LoggingFilter() {
77          this(LoggingFilter.class.getName());
78      }
79      
80      /**
81       * Create a new NoopFilter using a class name
82       * 
83       * @param clazz the cass which name will be used to create the logger
84       */
85      public LoggingFilter(Class<?> clazz) {
86          this(clazz.getName());
87      }
88  
89      /**
90       * Create a new NoopFilter using a name
91       * 
92       * @param name the name used to create the logger. If null, will default to "NoopFilter"
93       */
94      public LoggingFilter(String name) {
95          if (name == null) {
96              this.name = LoggingFilter.class.getName();
97          } else {
98              this.name = name;
99          }
100         
101         logger = LoggerFactory.getLogger(name);
102     }
103 
104     /**
105      * @return The logger's name
106      */
107     public String getName() {
108         return name;
109     }
110     
111     /**
112      * Log if the logger and the current event log level are compatible. We log
113      * a message and an exception.
114      * 
115      * @param eventLevel the event log level as requested by the user
116      * @param message the message to log
117      * @param cause the exception cause to log
118      */
119     private void log(LogLevel eventLevel, String message, Throwable cause) {
120         switch (eventLevel) {
121             case TRACE : logger.trace(message, cause); return;
122             case DEBUG : logger.debug(message, cause); return;
123             case INFO  : logger.info(message, cause); return;
124             case WARN  : logger.warn(message, cause); return;
125             case ERROR : logger.error(message, cause); return;
126             default    : return;
127         }
128     }
129 
130     /**
131      * Log if the logger and the current event log level are compatible. We log
132      * a formated message and its parameters. 
133      * 
134      * @param eventLevel the event log level as requested by the user
135      * @param message the formated message to log
136      * @param param the parameter injected into the message
137      */
138     private void log(LogLevel eventLevel, String message, Object param) {
139         switch (eventLevel) {
140             case TRACE : logger.trace(message, param); return;
141             case DEBUG : logger.debug(message, param); return;
142             case INFO  : logger.info(message, param); return;
143             case WARN  : logger.warn(message, param); return;
144             case ERROR : logger.error(message, param); return;
145             default    : return;
146         }
147     }
148 
149     /**
150      * Log if the logger and the current event log level are compatible. We log
151      * a simple message. 
152      * 
153      * @param eventLevel the event log level as requested by the user
154      * @param message the message to log
155      */
156     private void log(LogLevel eventLevel, String message) {
157         switch (eventLevel) {
158             case TRACE : logger.trace(message); return;
159             case DEBUG : logger.debug(message); return;
160             case INFO  : logger.info(message); return;
161             case WARN  : logger.warn(message); return;
162             case ERROR : logger.error(message); return;
163             default    : return;
164         }
165     }
166 
167     @Override
168     public void exceptionCaught(NextFilter nextFilter, IoSession session,
169             Throwable cause) throws Exception {
170         log(exceptionCaughtLevel, "EXCEPTION :", cause);
171         nextFilter.exceptionCaught(session, cause);
172     }
173 
174     @Override
175     public void messageReceived(NextFilter nextFilter, IoSession session,
176             Object message) throws Exception {
177         log(messageReceivedLevel, "RECEIVED: {}", message );
178         nextFilter.messageReceived(session, message);
179     }
180 
181     @Override
182     public void messageSent(NextFilter nextFilter, IoSession session,
183             WriteRequest writeRequest) throws Exception {
184         log(messageSentLevel, "SENT: {}", writeRequest.getMessage() );
185         nextFilter.messageSent(session, writeRequest);
186     }
187 
188     @Override
189     public void sessionCreated(NextFilter nextFilter, IoSession session)
190             throws Exception {
191         log(sessionCreatedLevel, "CREATED");
192         nextFilter.sessionCreated(session);
193     }
194 
195     @Override
196     public void sessionOpened(NextFilter nextFilter, IoSession session)
197     throws Exception {
198         log(sessionOpenedLevel, "OPENED");
199         nextFilter.sessionOpened(session);
200     }
201 
202     @Override
203     public void sessionIdle(NextFilter nextFilter, IoSession session,
204             IdleStatus status) throws Exception {
205         log(sessionIdleLevel, "IDLE");
206         nextFilter.sessionIdle(session, status);
207     }
208 
209     @Override
210     public void sessionClosed(NextFilter nextFilter, IoSession session) throws Exception {
211         log(sessionClosedLevel, "CLOSED");
212         nextFilter.sessionClosed(session);
213     }
214     
215     /**
216      * Set the LogLevel for the ExceptionCaught event.
217      * 
218      * @param level The LogLevel to set
219      */
220     public void setExceptionCaughtLogLevel(LogLevel level) {
221         exceptionCaughtLevel = level;
222     }
223     
224     /**
225      * Get the LogLevel for the ExceptionCaught event.
226      * 
227      * @return The LogLevel for the ExceptionCaught eventType
228      */
229     public LogLevel getExceptionCaughtLoglevel() {
230         return exceptionCaughtLevel;
231     }
232     
233     /**
234      * Set the LogLevel for the MessageReceived event.
235      * 
236      * @param level The LogLevel to set
237      */
238     public void setMessageReceivedLogLevel(LogLevel level) {
239         messageReceivedLevel = level;
240     }
241     
242     /**
243      * Get the LogLevel for the MessageReceived event.
244      * 
245      * @return The LogLevel for the MessageReceived eventType
246      */
247     public LogLevel getMessageReceivedLoglevel() {
248         return messageReceivedLevel;
249     }
250     
251     /**
252      * Set the LogLevel for the MessageSent event.
253      * 
254      * @param level The LogLevel to set
255      */
256     public void setMessageSentLoglevel(LogLevel level) {
257         messageSentLevel = level;
258     }
259     
260     /**
261      * Get the LogLevel for the MessageSent event.
262      * 
263      * @return The LogLevel for the MessageSent eventType
264      */
265     public LogLevel getMessageSentLoglevel() {
266         return messageSentLevel;
267     }
268     
269     /**
270      * Set the LogLevel for the SessionCreated event.
271      * 
272      * @param level The LogLevel to set
273      */
274     public void setSessionCreatedLoglevel(LogLevel level) {
275         sessionCreatedLevel = level;
276     }
277     
278     /**
279      * Get the LogLevel for the SessionCreated event.
280      * 
281      * @return The LogLevel for the SessionCreated eventType
282      */
283     public LogLevel getSessionCreatedLoglevel() {
284         return sessionCreatedLevel;
285     }
286     
287     /**
288      * Set the LogLevel for the SessionOpened event.
289      * 
290      * @param level The LogLevel to set
291      */
292     public void setSessionOpenedLoglevel(LogLevel level) {
293         sessionOpenedLevel = level;
294     }
295     
296     /**
297      * Get the LogLevel for the SessionOpened event.
298      * 
299      * @return The LogLevel for the SessionOpened eventType
300      */
301     public LogLevel getSessionOpenedLoglevel() {
302         return sessionOpenedLevel;
303     }
304     
305     /**
306      * Set the LogLevel for the SessionIdle event.
307      * 
308      * @param level The LogLevel to set
309      */
310     public void setSessionIdleLoglevel(LogLevel level) {
311         sessionIdleLevel = level;
312     }
313     
314     /**
315      * Get the LogLevel for the SessionIdle event.
316      * 
317      * @return The LogLevel for the SessionIdle eventType
318      */
319     public LogLevel getSessionIdleLoglevel() {
320         return sessionIdleLevel;
321     }
322     
323     /**
324      * Set the LogLevel for the SessionClosed event.
325      * 
326      * @param level The LogLevel to set
327      */
328     public void setSessionClosedLoglevel(LogLevel level) {
329         sessionClosedLevel = level;
330     }
331 
332     /**
333      * Get the LogLevel for the SessionClosed event.
334      * 
335      * @return The LogLevel for the SessionClosed eventType
336      */
337     public LogLevel getSessionClosedLoglevel() {
338         return sessionClosedLevel;
339     }
340 }