Mina Core 12-日志过滤器
背景
Apache MINA使用一个系统,允许基于MINA的应用程序的开发人员使用他们自己的日志记录系统。
SLF4J
MINA采用Simple Logging Facade for Java(SLF4J)。您可以在此处找到有关SLF4J的信息。此日志记录实用程序允许实现任意数量的日志记录系统。您可以使用log4j,java.util.logging或其他日志记录系统。关于这一点的好处是,如果您想在开发过程中稍后从java.util.logging更改为log4j,则根本不需要更改源代码。
选择正确的JAR包
SLF4J使用静态绑定。这意味着每个支持的日志记录框架都有一个JAR文件。您可以通过选择调用您静态选择的日志记录框架的JAR文件来使用您喜欢的日志记录框架。以下是使用特定日志记录框架所需的JAR文件表。
日志框架 |
需要的Jar包 |
Log4J 1.2.x |
slf4j-api.jar, slf4j-log4j12.jar** |
Log4J 1.3.x |
slf4j-api.jar, slf4j-log4j13.jar |
java.util.logging |
slf4j-api.jar, slf4j-jdk14.jar** |
Commons Logging |
slf4j-api.jar, slf4j-jcl.jar |
有几点需要注意:
1.slf4j-api.jar通常用于任何实现JAR。
2.重要事项您不应在类路径中放置多个实现JAR文件(例如slf4j-log4j12.jar和slf4j-jdk14.jar);它可能会导致您的应用程序出现意外行为。
3.slf4j-api.jar和slf4j-.jar的版本应该相同。
正确配置后,您可以继续配置您选择的实际日志记录框架(例如,修改log4j.properties)。
覆盖Jakarta CommonsLogging
SLF4J还提供了一种方法,可以将使用Jakarta Commons Logging的现有应用程序转换为使用SLF4J,而无需更改应用程序代码。只需从类路径中删除commons-loggong JAR文件,然后将jcl104-over-slf4j.jar添加到类路径中。
log4j例子
对于此示例,我们将使用log4j日志记录系统。我们设置了一个项目,并将以下代码段放入名为log4j.properties的文件中:
# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c{1} %x - %m%n
该文件将放在我们项目的src目录中。如果您使用的是IDE,那么在测试代码时,您基本上希望配置文件位于JVM的类路径中。
虽然这向您展示了如何设置IoAcceptor以使用日志记录,但要了解SLF4J API可以在程序中的任何位置使用,以便生成适合您需要的正确日志记录信息。
接下来,我们将设置一个简单的示例服务器,以生成一些日志。在这里,我们采用了EchoServer示例项目,并在类中添加了日志记录:
public static void main(String[] args) throws Exception {
IoAcceptor acceptor = new SocketAcceptor();
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
LoggingFilter loggingFilter = new LoggingFilter();
chain.addLast("logging", loggingFilter);
acceptor.setLocalAddress(new InetSocketAddress(PORT));
acceptor.setHandler(new EchoProtocolHandler());
acceptor.bind();
System.out.println("Listening on port " + PORT);
}
如您所见,我们删除了addLogger方法,并在添加到示例EchoServer的2行中添加了。通过引用LoggingFilter,您可以在此处为与IoAcceptor关联的处理程序中的每个事件类型设置日志记录级别。为了指定触发日志记录的IoHandler事件以及执行日志记录的级别,LoggingFilter中有一个名为setLogLevel(IoEventType,LogLevel)的方法。以下是此方法的选项:
Io事件类型 |
描述 |
SESSION_CREATED |
在创建新会话时调用 |
SESSION_OPENED |
打开新会话时调用 |
SESSION_CLOSED |
在会话关闭时调用 |
MESSAGE_RECEIVED |
收到数据时调用 |
MESSAGE_SENT |
在发送消息时调用 |
SESSION_IDLE |
在达到会话空闲时间时调用 |
EXCEPTION_CAUGHT |
抛出异常时调用 |
以下是LogLevels的描述:
日志级别 |
描述 |
NONE |
这将导致无论配置如何都不会创建任何日志事件 |
TRACE |
在日志记录系统中创建TRACE事件 |
DEBUG |
在日志记录系统中生成调试消息 |
INFO |
在日志记录系统中生成Info消息 |
WARN |
在日志记录系统中生成警告消息 |
ERROR |
在日志记录系统中生成错误消息 |
有了这些信息,您应该能够启动并运行基本系统,并能够扩展这个简单的示例,以便为您的系统生成日志信息。