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 java.nio.ByteBuffer;
23  
24  import org.apache.mina.api.IdleStatus;
25  import org.apache.mina.api.IoFilter;
26  import org.apache.mina.api.IoSession;
27  import org.apache.mina.filterchain.ReadFilterChainController;
28  import org.apache.mina.filterchain.WriteFilterChainController;
29  import org.apache.mina.session.WriteRequest;
30  import org.apache.mina.util.ByteBufferDumper;
31  import org.slf4j.Logger;
32  import org.slf4j.LoggerFactory;
33  
34  /**
35   * A simple filter logging incoming events.
36   * 
37   * @author jvermillar
38   * 
39   */
40  public class LoggingFilter implements IoFilter {
41  
42      /** The logger */
43      private final Logger logger;
44  
45      /** The log level for the messageWritting event. Default to INFO. */
46      private LogLevel messageWritingLevel = LogLevel.INFO;
47  
48      /** The log level for the messageSent event. Default to INFO. */
49      private LogLevel messageSentLevel = LogLevel.INFO;
50  
51      /** The log level for the messageReceived event. Default to INFO. */
52      private LogLevel messageReceivedLevel = LogLevel.INFO;
53  
54      /** The log level for the sessionOpened event. Default to INFO. */
55      private LogLevel sessionOpenedLevel = LogLevel.INFO;
56  
57      /** The log level for the sessionClosed event. Default to INFO. */
58      private LogLevel sessionClosedLevel = LogLevel.INFO;
59  
60      /** The log level for the sessionIdle event. Default to INFO. */
61      private LogLevel sessionIdleLevel = LogLevel.INFO;
62  
63      /**
64       * Default Constructor.
65       */
66      public LoggingFilter() {
67          this(LoggingFilter.class.getName());
68      }
69  
70      /**
71       * Create a new LoggingFilter using a class name
72       * 
73       * @param clazz the class which name will be used to create the logger
74       */
75      public LoggingFilter(final Class<?> clazz) {
76          this(clazz.getName());
77      }
78  
79      /**
80       * Create a new LoggingFilter using a name
81       * 
82       * @param name the name used to create the logger. If null, will default to "LoggingFilter"
83       */
84      public LoggingFilter(final String name) {
85          if (name == null) {
86              logger = LoggerFactory.getLogger(LoggingFilter.class.getName());
87          } else {
88              logger = LoggerFactory.getLogger(name);
89          }
90      }
91  
92      /**
93       * Log if the logger and the current event log level are compatible. We log a formated message and its parameters.
94       * 
95       * @param eventLevel the event log level as requested by the user
96       * @param message the formated message to log
97       * @param param the parameter injected into the message
98       */
99      private void log(final LogLevel eventLevel, final String message, final Object param) {
100         switch (eventLevel) {
101         case TRACE:
102             logger.trace(message, param);
103             return;
104         case DEBUG:
105             logger.debug(message, param);
106             return;
107         case INFO:
108             logger.info(message, param);
109             return;
110         case WARN:
111             logger.warn(message, param);
112             return;
113         case ERROR:
114             logger.error(message, param);
115             return;
116         default:
117             return;
118         }
119     }
120 
121     /**
122      * Log if the logger and the current event log level are compatible. We log a simple message.
123      * 
124      * @param eventLevel the event log level as requested by the user
125      * @param message the message to log
126      */
127     private void log(final LogLevel eventLevel, final String message) {
128         switch (eventLevel) {
129         case TRACE:
130             logger.trace(message);
131             return;
132         case DEBUG:
133             logger.debug(message);
134             return;
135         case INFO:
136             logger.info(message);
137             return;
138         case WARN:
139             logger.warn(message);
140             return;
141         case ERROR:
142             logger.error(message);
143             return;
144         default:
145             return;
146         }
147     }
148 
149     /**
150      * {@inheritDoc}
151      */
152     @Override
153     public void sessionOpened(final IoSession session) {
154         log(sessionOpenedLevel, "OPENED");
155 
156     }
157 
158     /**
159      * {@inheritDoc}
160      */
161     @Override
162     public void sessionClosed(final IoSession session) {
163         log(sessionClosedLevel, "CLOSED");
164     }
165 
166     /**
167      * {@inheritDoc}
168      */
169     @Override
170     public void sessionIdle(final IoSession session, final IdleStatus status) {
171         log(sessionIdleLevel, "IDLE");
172     }
173 
174     /**
175      * {@inheritDoc}
176      */
177     @Override
178     public void messageSent(final IoSession session, final Object message) {
179         log(messageSentLevel, "IDLE");
180     }
181 
182     /**
183      * {@inheritDoc}
184      */
185     @Override
186     public void messageReceived(final IoSession session, final Object message,
187             final ReadFilterChainController controller) {
188         if (message instanceof ByteBuffer) {
189             log(messageReceivedLevel, "RECEIVED: {}", ByteBufferDumper.dump((ByteBuffer) message));
190         } else {
191             log(messageReceivedLevel, "RECEIVED: {}", message);
192         }
193 
194         controller.callReadNextFilter(message);
195     }
196 
197     /**
198      * {@inheritDoc}
199      */
200     @Override
201     public void messageWriting(final IoSession session, final WriteRequest message,
202             final WriteFilterChainController controller) {
203         log(messageReceivedLevel, "WRITTING: {}", message);
204         controller.callWriteNextFilter(message);
205     }
206 
207     // =========================
208     // SETTERS & GETTERS
209     // =========================
210 
211     /**
212      * Set the LogLevel for the MessageReceived event.
213      * 
214      * @param level The LogLevel to set
215      */
216     public void setMessageReceivedLogLevel(final LogLevel level) {
217         messageReceivedLevel = level;
218     }
219 
220     /**
221      * Get the LogLevel for the MessageReceived event.
222      * 
223      * @return The LogLevel for the MessageReceived eventType
224      */
225     public LogLevel getMessageReceivedLogLevel() {
226         return messageReceivedLevel;
227     }
228 
229     /**
230      * Set the LogLevel for the MessageWriting event.
231      * 
232      * @param level The LogLevel to set
233      */
234     public void setMessageWritingLogLevel(final LogLevel level) {
235         messageWritingLevel = level;
236     }
237 
238     /**
239      * Get the LogLevel for the MessageWriting event.
240      * 
241      * @return The LogLevel for the MessageWriting eventType
242      */
243     public LogLevel getMessageWritingLogLevel() {
244         return messageWritingLevel;
245     }
246 
247     /**
248      * Set the LogLevel for the SessionOpened event.
249      * 
250      * @param level The LogLevel to set
251      */
252     public void setSessionOpenedLogLevel(final LogLevel level) {
253         sessionOpenedLevel = level;
254     }
255 
256     /**
257      * Get the LogLevel for the SessionOpened event.
258      * 
259      * @return The LogLevel for the SessionOpened eventType
260      */
261     public LogLevel getSessionOpenedLogLevel() {
262         return sessionOpenedLevel;
263     }
264 
265     /**
266      * Set the LogLevel for the SessionIdle event.
267      * 
268      * @param level The LogLevel to set
269      */
270     public void setSessionIdleLogLevel(final LogLevel level) {
271         sessionIdleLevel = level;
272     }
273 
274     /**
275      * Get the LogLevel for the SessionIdle event.
276      * 
277      * @return The LogLevel for the SessionIdle eventType
278      */
279     public LogLevel getSessionIdleLogLevel() {
280         return sessionIdleLevel;
281     }
282 
283     /**
284      * Set the LogLevel for the SessionClosed event.
285      * 
286      * @param level The LogLevel to set
287      */
288     public void setSessionClosedLogLevel(final LogLevel level) {
289         sessionClosedLevel = level;
290     }
291 
292     /**
293      * Get the LogLevel for the SessionClosed event.
294      * 
295      * @return The LogLevel for the SessionClosed eventType
296      */
297     public LogLevel getSessionClosedLogLevel() {
298         return sessionClosedLevel;
299     }
300 
301     /**
302      * Get the LogLevel for the messageSent event.
303      * 
304      * @return The LogLevel for the messageSent eventType
305      */
306     public LogLevel getMessageSentLevel() {
307         return messageSentLevel;
308     }
309 
310     /**
311      * Set the LogLevel for the messageSent event.
312      * 
313      * @param level The LogLevel to set
314      */
315     public void setMessageSentLevel(final LogLevel messageSentLevel) {
316         this.messageSentLevel = messageSentLevel;
317     }
318 
319 }