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.util.Map;
23  
24  import org.apache.mina.core.filterchain.IoFilter;
25  import org.apache.mina.core.filterchain.IoFilterAdapter;
26  import org.apache.mina.core.session.IdleStatus;
27  import org.apache.mina.core.session.IoEventType;
28  import org.apache.mina.core.session.IoSession;
29  import org.apache.mina.core.write.WriteRequest;
30  import org.apache.mina.util.CopyOnWriteMap;
31  import org.slf4j.Logger;
32  import org.slf4j.LoggerFactory;
33  
34  /**
35   * Logs all MINA protocol events.  Each event can be
36   * tuned to use a different level based on the user's specific requirements.  Methods
37   * are in place that allow the user to use either the get or set method for each event
38   * and pass in the {@link IoEventType} and the {@link LogLevel}.
39   *
40   * By default, all events are logged to the {@link LogLevel#INFO} level except
41   * {@link IoFilterAdapter#exceptionCaught(IoFilter.NextFilter, IoSession, Throwable)},
42   * which is logged to {@link LogLevel#WARN}.
43   *
44   * @author The Apache MINA Project (dev@mina.apache.org)
45   * @version $Rev: 671827 $, $Date: 2008-06-26 10:49:48 +0200 (jeu, 26 jun 2008) $
46   */
47  public class LoggingFilter extends IoFilterAdapter {
48  
49      private final Map<IoEventType, LogLevel> logSettings = new CopyOnWriteMap<IoEventType, LogLevel>();
50      private final String name;
51      private final Logger logger;
52      /**
53       * Default Constructor.
54       */
55      public LoggingFilter() {
56          this(LoggingFilter.class.getName());
57      }
58  
59      public LoggingFilter(Class<?> clazz) {
60          this(clazz.getName());
61      }
62  
63      public LoggingFilter(String name) {
64          if (name == null) {
65              throw new NullPointerException("name should not be null");
66          }
67          this.name = name;
68          logger = LoggerFactory.getLogger(name);
69  
70          // Exceptions will be logged to WARN as default.
71          setLogLevel(IoEventType.EXCEPTION_CAUGHT, LogLevel.WARN);
72          setLogLevel(IoEventType.MESSAGE_RECEIVED, LogLevel.INFO);
73          setLogLevel(IoEventType.MESSAGE_SENT, LogLevel.INFO);
74          setLogLevel(IoEventType.SESSION_CLOSED, LogLevel.INFO);
75          setLogLevel(IoEventType.SESSION_CREATED, LogLevel.INFO);
76          setLogLevel(IoEventType.SESSION_IDLE, LogLevel.INFO);
77          setLogLevel(IoEventType.SESSION_OPENED, LogLevel.INFO);
78      }
79  
80      public String getName() {
81          return name;
82      }
83  
84      @Override
85      public void exceptionCaught(NextFilter nextFilter, IoSession session,
86              Throwable cause) throws Exception {
87          getLogLevel(IoEventType.EXCEPTION_CAUGHT).log(logger, "EXCEPTION: ", cause);
88          nextFilter.exceptionCaught(session, cause);
89      }
90  
91      @Override
92      public void messageReceived(NextFilter nextFilter, IoSession session,
93              Object message) throws Exception {
94          log(IoEventType.MESSAGE_RECEIVED, "RECEIVED: {}", message);
95          nextFilter.messageReceived(session, message);
96      }
97  
98      @Override
99      public void messageSent(NextFilter nextFilter, IoSession session,
100             WriteRequest writeRequest) throws Exception {
101         log(IoEventType.MESSAGE_SENT, "SENT: {}", writeRequest.getMessage());
102         nextFilter.messageSent(session, writeRequest);
103     }
104 
105     @Override
106     public void sessionClosed(NextFilter nextFilter, IoSession session) throws Exception {
107         log(IoEventType.SESSION_CLOSED, "CLOSED", null);
108         nextFilter.sessionClosed(session);
109     }
110 
111     @Override
112     public void sessionCreated(NextFilter nextFilter, IoSession session)
113     throws Exception {
114         log(IoEventType.SESSION_CREATED, "CREATED", null);
115         nextFilter.sessionCreated(session);
116     }
117 
118     @Override
119     public void sessionIdle(NextFilter nextFilter, IoSession session,
120             IdleStatus status) throws Exception {
121         log(IoEventType.SESSION_IDLE, "IDLE: {}", status);
122         nextFilter.sessionIdle(session, status);
123     }
124 
125     @Override
126     public void sessionOpened(NextFilter nextFilter, IoSession session)
127     throws Exception {
128         log(IoEventType.SESSION_OPENED, "OPENED", null);
129         nextFilter.sessionOpened(session);
130     }
131 
132     /**
133      * Logs the specified event.
134      * 
135      * @param eventType the type of the event
136      * @param format    the message (or SLF4J format string)
137      * @param arg       the argument of the SLF4J format string
138      */
139     protected void log(IoEventType eventType, String format, Object arg) {
140         getLogLevel(eventType).log(logger, format, arg);
141     }
142 
143     /**
144      * Sets the {@link LogLevel} to be used when exceptions are logged.
145      *
146      * @param logLevel
147      * 	The {@link LogLevel} to be used when exceptions are logged.
148      */
149     public void setExceptionCaughtLogLevel(LogLevel logLevel) {
150         setLogLevel(IoEventType.EXCEPTION_CAUGHT, logLevel);
151     }
152 
153     /**
154      * Sets the {@link LogLevel} to be used when message received events are logged.
155      *
156      * @param logLevel
157      * 	The {@link LogLevel} to be used when message received events are logged.
158      */
159     public void setMessageReceivedLogLevel(LogLevel logLevel) {
160         setLogLevel(IoEventType.MESSAGE_RECEIVED, logLevel);
161     }
162 
163     /**
164      * Sets the {@link LogLevel} to be used when message sent events are logged.
165      *
166      * @param logLevel
167      * 	The {@link LogLevel} to be used when message sent events are logged.
168      */
169     public void setMessageSentLogLevel(LogLevel logLevel) {
170         setLogLevel(IoEventType.MESSAGE_SENT, logLevel);
171     }
172 
173     /**
174      * Sets the {@link LogLevel} to be used when session closed events are logged.
175      *
176      * @param logLevel
177      * 	The {@link LogLevel} to be used when session closed events are logged.
178      */
179     public void setSessionClosedLogLevel(LogLevel logLevel) {
180         setLogLevel(IoEventType.SESSION_CLOSED, logLevel);
181     }
182 
183     /**
184      * Sets the {@link LogLevel} to be used when session created events are logged.
185      *
186      * @param logLevel
187      * 	The {@link LogLevel} to be used when session created events are logged.
188      */
189     public void setSessionCreatedLogLevel(LogLevel logLevel) {
190         setLogLevel(IoEventType.SESSION_CREATED, logLevel);
191     }
192 
193     /**
194      * Sets the {@link LogLevel} to be used when session idle events are logged.
195      *
196      * @param logLevel
197      * 	The {@link LogLevel} to be used when session idle events are logged.
198      */
199     public void setSessionIdleLogLevel(LogLevel logLevel) {
200         setLogLevel(IoEventType.SESSION_IDLE, logLevel);
201     }
202 
203     /**
204      * Sets the {@link LogLevel} to be used when session opened events are logged.
205      *
206      * @param logLevel
207      * 	The {@link LogLevel} to be used when session opened events are logged.
208      */
209     public void setSessionOpenedLogLevel(LogLevel logLevel) {
210         setLogLevel(IoEventType.SESSION_OPENED, logLevel);
211     }
212 
213     /**
214      * This method sets the log level for the supplied {@link LogLevel}
215      * event.
216      *
217      * @param eventType the type of the event that is to be updated with
218      *                  the new {@link LogLevel}
219      * @param logLevel  the new {@link LogLevel} to be used to log the
220      *                  specified event
221      */
222     public void setLogLevel(IoEventType eventType, LogLevel logLevel) {
223         if (eventType == null) {
224             throw new NullPointerException("eventType");
225         }
226         if (logLevel == null) {
227             throw new NullPointerException("logLevel");
228         }
229 
230         logSettings.put(eventType, logLevel);
231     }
232 
233     /**
234      * Returns the log level for the supplied event type.
235      *
236      * @param eventType the type of the event
237      */
238     public LogLevel getLogLevel(IoEventType eventType) {
239         if (eventType == null) {
240             throw new NullPointerException("eventType");
241         }
242 
243         return logSettings.get(eventType);
244     }
245 
246     /**
247      * This method returns the {@link LogLevel} that is used to log
248      * exception caught events.
249      *
250      * @return
251      * 	The {@link LogLevel} used when logging exception caught events
252      */
253     public LogLevel getExceptionCaughtLogLevel() {
254         return getLogLevel(IoEventType.EXCEPTION_CAUGHT);
255     }
256 
257     /**
258      * This method returns the {@link LogLevel} that is used to log
259      * message received events.
260      *
261      * @return
262      * 	The {@link LogLevel} used when logging message received events
263      */
264     public LogLevel getMessageReceivedLogLevel() {
265         return getLogLevel(IoEventType.MESSAGE_RECEIVED);
266     }
267 
268     /**
269      * This method returns the {@link LogLevel} that is used to log
270      * message sent events.
271      *
272      * @return
273      * 	The {@link LogLevel} used when logging message sent events
274      */
275     public LogLevel getMessageSentLogLevel() {
276         return getLogLevel(IoEventType.MESSAGE_SENT);
277     }
278 
279     /**
280      * This method returns the {@link LogLevel} that is used to log
281      * session closed events.
282      *
283      * @return
284      * 	The {@link LogLevel} used when logging session closed events
285      */
286     public LogLevel getSessionClosedLogLevel() {
287         return getLogLevel(IoEventType.SESSION_CLOSED);
288     }
289 
290     /**
291      * This method returns the {@link LogLevel} that is used to log
292      * session created events.
293      *
294      * @return
295      * 	The {@link LogLevel} used when logging session created events
296      */
297     public LogLevel getSessionCreatedLogLevel() {
298         return getLogLevel(IoEventType.SESSION_CREATED);
299     }
300 
301     /**
302      * This method returns the {@link LogLevel} that is used to log
303      * session idle events.
304      *
305      * @return
306      * 	The {@link LogLevel} used when logging session idle events
307      */
308     public LogLevel getSessionIdleLogLevel() {
309         return getLogLevel(IoEventType.SESSION_IDLE);
310     }
311 
312     /**
313      * This method returns the {@link LogLevel} that is used to log
314      * session opened events.
315      *
316      * @return
317      * 	The {@link LogLevel} used when logging session opened events
318      */
319     public LogLevel getSessionOpenedLogLevel() {
320         return getLogLevel(IoEventType.SESSION_OPENED);
321     }
322 }