• MINA2 之日志配置


    一、背景

    MINA框架允许开发人员在编写基于MINA的应用程序时使用自己熟悉的日志系统。

    二、SLF4J

    MINA框架使用Simple Logging Facade for Java (SLF4J)。你可以在这里 获取到更多关于SLF4J的信息,这种日志系统兼容各种日志系统的实现。你可能会使用log4j、java.util.logging或其他的日志系统,使用这种日志框架的好处在于如果你在开发过程中,将日志系统从java.util.logging改为log4j,你根本不需要修改你的代码。

    选择正确的jar包

    Logging framework

    Required JARs

    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

    下面几点还需要注意:

    • 对于任意一种日志系统,slf4j-api.jar是必须的;
    • 重要:在classpath上不能放置多于一个日志系统实现jar包(例如slf4j-log4j12.jar and slf4j-jdk14.jar),这将导致日志出席不可预知的行为; 
    • slf4j-api.jar 和 slf4j-<impl>.jar的版本应该是一致的。

    如果SLF4J配置正确,你可以继续配置你真正使用的日志系统(例如修改log4j.properties )。

    重载Jakarta Commons Logging

    SLF4J提供了一种机制可以使现有的应用程序从使用Jakarta Commons Logging变更为SLF4J而不需要修改代码,只需要将commons-loggong JAR文件充classpath中除去,并将jcl104-over-slf4j.jar 加入到classpath中。

    三、log4j范例

    我们以log4j为例,然后将下面的代码片段加入到log4j.properties中:

    Properties代码  收藏代码
    1. # Set root logger level to DEBUG and its only appender to A1.   
    2. log4j.rootLogger=DEBUG, A1   
    3.     
    4. # A1 is set to be a ConsoleAppender.   
    5. log4j.appender.A1=org.apache.log4j.ConsoleAppender   
    6.     
    7. # A1 uses PatternLayout.   
    8. log4j.appender.A1.layout=org.apache.log4j.PatternLayout   
    9. log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c{1} %x - %m%n   

    我们将这个文件放置在工程的src目录中,如果你使用IDE,当你测试代码是,你实际上是想把这个文件放置在classpath上。

    注意 :这里只是在IoAcceptor 上设置了日志,但slf4j 可以在程序中广泛使用,有了它的帮助,你可以根据需要获取到有用的信息。

    下面我们编写一个简单的server从而生成一些日志信息,这里我们使用EchoServer 的范例工程来增加日志:

    Java代码  收藏代码
    1. public static void main(String[] args) throws Exception {   
    2.         IoAcceptor acceptor = new SocketAcceptor();   
    3.         DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();   
    4.     
    5.         LoggingFilter loggingFilter = new LoggingFilter();   
    6.         chain.addLast("logging", loggingFilter);                     
    7.     
    8.         acceptor.setLocalAddress(new InetSocketAddress(PORT));   
    9.         acceptor.setHandler(new EchoProtocolHandler());   
    10.         acceptor.bind();   
    11.     
    12.         System.out.println("Listening on port " + PORT);   
    13. }  

    正如你所见,在EchoServer 范例中,我们删除了addLogger方法并新增加了两行代码。通过LoggingFilter 的引用,你可以在这里设置与IoAcceptor 相关的所有事件的日志级别。在这里,可以使用LoggingFilter 中的setLogLevel(IoEventType, LogLevel)方法来区分触发IoHandler日志的时间以及对应的日志级别,下面是这个方法选项:

    IoEventType

    Description

    SESSION_CREATED 一个新的session被创建时触发
    SESSION_OPENED 一个新的session打开时触发
    SESSION_CLOSED 一个session被关闭时触发
    MESSAGE_RECEIVED 接收到数据时触发
    MESSAGE_SENT 数据被发送后触发
    SESSION_IDLE 一个session空闲了一定时间后触发
    EXCEPTION_CAUGHT 当有异常抛出时触发

    下面是日志级别的描述:

    LogLevel

    Description

    NONE 无论如何配置,日志都不会产生
    TRACE 在日志系统中创建一个TRACE事件
    DEBUG 在日志系统中生成debug信息
    INFO 在日志系统中生成提示信息
    WARN 在日志系统中生成警告信息
    ERROR 在日志系统中生成错误信息

    根据这些信息,你应该可以扩展这些范例来构建一个使用日志的简单系统,这些日志将为你提供有用的信息。

  • 相关阅读:
    DBA操作规范
    MySQL高可用之MHA
    Get MySQL这5个优化技巧,你将如虎添翼
    数据库的那些事
    Kubernetes
    nginx错误分析 `104: Connection reset by peer`
    kubernets资源预留
    kubernetes Pod亲和性
    kubernetes cpu限制参数说明
    zabbix 面板graph图上没有数据显示
  • 原文地址:https://www.cnblogs.com/balaamwe/p/2319179.html
Copyright © 2020-2023  润新知