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 MINA protocol events.  Each event can be tuned to use a different level based on 
33   * the user's specific requirements.  Methods are in place that allow the user to use 
34   * either the get or set method for each event and pass in the {@link IoEventType} and 
35   * 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 <a href="http://mina.apache.org">Apache MINA Project</a>
42   * @org.apache.xbean.XBean
43   */
44  public class LoggingFilter extends IoFilterAdapter {
45      /** The logger name */
46      private final String name;
47  
48      /** The logger */
49      private final Logger logger;
50  
51      /** The log level for the exceptionCaught event. Default to WARN. */
52      private LogLevel exceptionCaughtLevel = LogLevel.WARN;
53  
54      /** The log level for the messageSent event. Default to INFO. */
55      private LogLevel messageSentLevel = LogLevel.INFO;
56  
57      /** The log level for the messageReceived event. Default to INFO. */
58      private LogLevel messageReceivedLevel = LogLevel.INFO;
59  
60      /** The log level for the sessionCreated event. Default to INFO. */
61      private LogLevel sessionCreatedLevel = LogLevel.INFO;
62  
63      /** The log level for the sessionOpened event. Default to INFO. */
64      private LogLevel sessionOpenedLevel = LogLevel.INFO;
65  
66      /** The log level for the sessionIdle event. Default to INFO. */
67      private LogLevel sessionIdleLevel = LogLevel.INFO;
68  
69      /** The log level for the sessionClosed event. Default to INFO. */
70      private LogLevel sessionClosedLevel = LogLevel.INFO;
71  
72      /**
73       * Default Constructor.
74       */
75      public LoggingFilter() {
76          this(LoggingFilter.class.getName());
77      }
78  
79      /**
80       * Create a new NoopFilter using a class name
81       * 
82       * @param clazz the cass which name will be used to create the logger
83       */
84      public LoggingFilter(Class<?> clazz) {
85          this(clazz.getName());
86      }
87  
88      /**
89       * Create a new NoopFilter using a name
90       * 
91       * @param name the name used to create the logger. If null, will default to "NoopFilter"
92       */
93      public LoggingFilter(String name) {
94          if (name == null) {
95              this.name = LoggingFilter.class.getName();
96          } else {
97              this.name = name;
98          }
99  
100         logger = LoggerFactory.getLogger(this.name);
101     }
102 
103     /**
104      * @return The logger's name
105      */
106     public String getName() {
107         return name;
108     }
109 
110     /**
111      * Log if the logger and the current event log level are compatible. We log
112      * a message and an exception.
113      * 
114      * @param eventLevel the event log level as requested by the user
115      * @param message the message to log
116      * @param cause the exception cause to log
117      */
118     private void log(LogLevel eventLevel, String message, Throwable cause) {
119         switch (eventLevel) {
120         case TRACE:
121             logger.trace(message, cause);
122             return;
123         case DEBUG:
124             logger.debug(message, cause);
125             return;
126         case INFO:
127             logger.info(message, cause);
128             return;
129         case WARN:
130             logger.warn(message, cause);
131             return;
132         case ERROR:
133             logger.error(message, cause);
134             return;
135         default:
136             return;
137         }
138     }
139 
140     /**
141      * Log if the logger and the current event log level are compatible. We log
142      * a formated message and its parameters.
143      * 
144      * @param eventLevel the event log level as requested by the user
145      * @param message the formated message to log
146      * @param param the parameter injected into the message
147      */
148     private void log(LogLevel eventLevel, String message, Object param) {
149         switch (eventLevel) {
150         case TRACE:
151             logger.trace(message, param);
152             return;
153         case DEBUG:
154             logger.debug(message, param);
155             return;
156         case INFO:
157             logger.info(message, param);
158             return;
159         case WARN:
160             logger.warn(message, param);
161             return;
162         case ERROR:
163             logger.error(message, param);
164             return;
165         default:
166             return;
167         }
168     }
169 
170     /**
171      * Log if the logger and the current event log level are compatible. We log
172      * a simple message.
173      * 
174      * @param eventLevel the event log level as requested by the user
175      * @param message the message to log
176      */
177     private void log(LogLevel eventLevel, String message) {
178         switch (eventLevel) {
179         case TRACE:
180             logger.trace(message);
181             return;
182         case DEBUG:
183             logger.debug(message);
184             return;
185         case INFO:
186             logger.info(message);
187             return;
188         case WARN:
189             logger.warn(message);
190             return;
191         case ERROR:
192             logger.error(message);
193             return;
194         default:
195             return;
196         }
197     }
198 
199     /**
200      * {@inheritDoc}
201      */
202     @Override
203     public void exceptionCaught(NextFilter nextFilter, IoSession session, Throwable cause) throws Exception {
204         log(exceptionCaughtLevel, "EXCEPTION :", cause);
205         nextFilter.exceptionCaught(session, cause);
206     }
207 
208     /**
209      * {@inheritDoc}
210      */
211     @Override
212     public void messageReceived(NextFilter nextFilter, IoSession session, Object message) throws Exception {
213         // Note: the way the IoBuffer method is implemented, logging an instance of
214         // an instance will not change its position. It's safe.
215         log(messageReceivedLevel, "RECEIVED: {}", message);
216         nextFilter.messageReceived(session, message);
217     }
218 
219     /**
220      * {@inheritDoc}
221      */
222     @Override
223     public void messageSent(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception {
224         // Note: the way the IoBuffer method is implemented, logging an instance of
225         // an instance will not change its position. It's safe.
226         log(messageSentLevel, "SENT: {}", writeRequest.getOriginalRequest().getMessage());
227         nextFilter.messageSent(session, writeRequest);
228     }
229 
230     /**
231      * {@inheritDoc}
232      */
233     @Override
234     public void sessionCreated(NextFilter nextFilter, IoSession session) throws Exception {
235         log(sessionCreatedLevel, "CREATED");
236         nextFilter.sessionCreated(session);
237     }
238 
239     /**
240      * {@inheritDoc}
241      */
242     @Override
243     public void sessionOpened(NextFilter nextFilter, IoSession session) throws Exception {
244         log(sessionOpenedLevel, "OPENED");
245         nextFilter.sessionOpened(session);
246     }
247 
248     /**
249      * {@inheritDoc}
250      */
251     @Override
252     public void sessionIdle(NextFilter nextFilter, IoSession session, IdleStatus status) throws Exception {
253         log(sessionIdleLevel, "IDLE");
254         nextFilter.sessionIdle(session, status);
255     }
256 
257     /**
258      * {@inheritDoc}
259      */
260     @Override
261     public void sessionClosed(NextFilter nextFilter, IoSession session) throws Exception {
262         log(sessionClosedLevel, "CLOSED");
263         nextFilter.sessionClosed(session);
264     }
265 
266     /**
267      * Set the LogLevel for the ExceptionCaught event.
268      * 
269      * @param level The LogLevel to set
270      */
271     public void setExceptionCaughtLogLevel(LogLevel level) {
272         exceptionCaughtLevel = level;
273     }
274 
275     /**
276      * Get the LogLevel for the ExceptionCaught event.
277      * 
278      * @return The LogLevel for the ExceptionCaught eventType
279      */
280     public LogLevel getExceptionCaughtLogLevel() {
281         return exceptionCaughtLevel;
282     }
283 
284     /**
285      * Set the LogLevel for the MessageReceived event.
286      * 
287      * @param level The LogLevel to set
288      */
289     public void setMessageReceivedLogLevel(LogLevel level) {
290         messageReceivedLevel = level;
291     }
292 
293     /**
294      * Get the LogLevel for the MessageReceived event.
295      * 
296      * @return The LogLevel for the MessageReceived eventType
297      */
298     public LogLevel getMessageReceivedLogLevel() {
299         return messageReceivedLevel;
300     }
301 
302     /**
303      * Set the LogLevel for the MessageSent event.
304      * 
305      * @param level The LogLevel to set
306      */
307     public void setMessageSentLogLevel(LogLevel level) {
308         messageSentLevel = level;
309     }
310 
311     /**
312      * Get the LogLevel for the MessageSent event.
313      * 
314      * @return The LogLevel for the MessageSent eventType
315      */
316     public LogLevel getMessageSentLogLevel() {
317         return messageSentLevel;
318     }
319 
320     /**
321      * Set the LogLevel for the SessionCreated event.
322      * 
323      * @param level The LogLevel to set
324      */
325     public void setSessionCreatedLogLevel(LogLevel level) {
326         sessionCreatedLevel = level;
327     }
328 
329     /**
330      * Get the LogLevel for the SessionCreated event.
331      * 
332      * @return The LogLevel for the SessionCreated eventType
333      */
334     public LogLevel getSessionCreatedLogLevel() {
335         return sessionCreatedLevel;
336     }
337 
338     /**
339      * Set the LogLevel for the SessionOpened event.
340      * 
341      * @param level The LogLevel to set
342      */
343     public void setSessionOpenedLogLevel(LogLevel level) {
344         sessionOpenedLevel = level;
345     }
346 
347     /**
348      * Get the LogLevel for the SessionOpened event.
349      * 
350      * @return The LogLevel for the SessionOpened eventType
351      */
352     public LogLevel getSessionOpenedLogLevel() {
353         return sessionOpenedLevel;
354     }
355 
356     /**
357      * Set the LogLevel for the SessionIdle event.
358      * 
359      * @param level The LogLevel to set
360      */
361     public void setSessionIdleLogLevel(LogLevel level) {
362         sessionIdleLevel = level;
363     }
364 
365     /**
366      * Get the LogLevel for the SessionIdle event.
367      * 
368      * @return The LogLevel for the SessionIdle eventType
369      */
370     public LogLevel getSessionIdleLogLevel() {
371         return sessionIdleLevel;
372     }
373 
374     /**
375      * Set the LogLevel for the SessionClosed event.
376      * 
377      * @param level The LogLevel to set
378      */
379     public void setSessionClosedLogLevel(LogLevel level) {
380         sessionClosedLevel = level;
381     }
382 
383     /**
384      * Get the LogLevel for the SessionClosed event.
385      * 
386      * @return The LogLevel for the SessionClosed eventType
387      */
388     public LogLevel getSessionClosedLogLevel() {
389         return sessionClosedLevel;
390     }
391 }