• Log4J从基础到应用


    1.API中核心的三个接口(org.apache.log4j)

    This is the central class in the log4j package. Most logging operations, except configuration, are done through this class.

    翻译: 这是log4j包中的中心类。除了配置之外,大多数日志记录操作都是通过这个类完成的。

    Implement this interface for your own strategies for outputting log statements.

    翻译:为输出日志语句的策略实现此接口。(指定日志信息应该被输出到什么地方,可以是控制台、文件)

    Extend this abstract class to create your own log layout format. 

    翻译:扩展这个抽象类来创建自己的日志布局格式。(指定日志信息的输出格式)

    这三个接口之间的关系是: 一个Logger可以有多个Appender,这意味着日志信息可以同时输出到多个设备上,

    并且每个Appender都需要对应一种Layout,Layout决定输出日志信息的格式。

     Logger组件的继承性

      Log4提供了一个 root Logger,他是所有Logger组件的“祖先”。以下是配置root Logger的代码

      log4j.rootLogger=INFO,console

      用户可以方便的配置存在继承关系的Logger组件。凡是在符号 . 后面的Logger组件都会成为在.前面的Logger组件的子类。列如

      log4j.apache.helloLogger

      log4j.apache.helloLogger.childrenLogger

      对于以上代码childrenLogger就是helloLogger 的子类Logger组件(和java的继承一样 子类可拥有父类的全部属性)

    Log4j的基本使用方法

    • 配置Logger组件 语法

        log4j.rootLogger=[priority],appenderName,appenderName,......

        priority是日志基本 级别的顺序 DEBUG INFO  WARN ERROR .如果定义INFO级别 程序中所有DEBUG的信息都不会打印出来。 appendName 可以指定多个用逗号隔开 console,file

    • 配置appender组件 语法

        log4j.appender.apendName=value1

        log4j.appender.apendName=value1

        这里的appendName就是Logger组件所配置的appendName(console,file)  value是指appender接口的实现类org.apache.log4j.ConsoleAppender   org.apache.log4j.RollingFileAppender 等

    • 配置Layout 语法

        log4j.appender.apendName.layout=org.apache.log4j.PatternLayout (可选择Layout组件的子类)
        log4j.appender.apendName.layout.ConversionPattern=%d %t %c %p - %m%n

        其中PatternLayout 可以让开发者依照ConversionPattern去定义输出格式

          %r 自程序开始到输出当前日志所消耗的毫秒数

          %t 表示输出当前线程的名字

          %p 表示日志的级别

          %d 表示输出当前日志的日期

          %c 表示输出当前日志的Logger名字

          %m%n 当前日志的内容

    在程序中使用Log4J(结合JDBC一起使用 可以在Log中打印出SQL)

    1 引入相关的jar包

    log4j-1.2.17.jar、slf4j-api-1.6.0.jar、slf4j-log4j12-1.7.7.jar

    2.修改JDBC的Driver

    Class.forName("net.sf.log4jdbc.DriverSpy")

     DriverManager.getConnection("jdbc:log4jdbc:mysql://ip:3306/db1?user=root&password=******")

    3.配置Log4j.properties

    #####define RootLogger#####
    log4j.rootLogger=INFO,console ####define a logger named helloLog#### log4j.logger.helloLog=WARN,console,file ####Appenders##### log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.File=D:/log.txt #######LAYOUTS########## log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d %t %c %p - %m%n log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d %t %c %p - %m%n ########JDBC########### log4j.logger.jdbc.sqltiming=INFO log4j.logger.jdbc.sqlonly=WARN log4j.logger.jdbc.audit=WARN log4j.logger.jdbc.connection=WARN

    4. 写一个Servlet 并在web.xml中配置此Servlet

      在init方法中(tomact启动时会运行init方法)加载Log4j的环境

    package javaee.net.cn.websocket;
    
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.log4j.Logger;
    import org.apache.log4j.PropertyConfigurator;
    public class MyServlet  extends HttpServlet {
    
        private static final long serialVersionUID = 1L;
    
        private static final Logger logger = Logger.getLogger(this.getClass());
        
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {;
            Connection conn = null;
            PreparedStatement stmt = null;
            String content = "hello";
            try {
                Class.forName("net.sf.log4jdbc.DriverSpy");
                conn = DriverManager.getConnection("jdbc:log4jdbc:mysql://ip:3306/db1?user=root&password=*****");
                conn.setAutoCommit(false);
                String sql = "insert into db1_table1 (content) values (?)";
                stmt = conn.prepareStatement(sql);
                stmt.setString(1,content);
                stmt.execute();
                conn.commit();
                conn.setAutoCommit(true);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch(SQLException e) {
                e.printStackTrace();
                try {
                    if(conn != null)
                    {
                        conn.rollback();
                        conn.setAutoCommit(true);
                    }
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
            }finally {
                try {
                    if(stmt != null)
                        stmt.close();
                    if(conn != null)
                        conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        
        @Override
        public void init() throws ServletException {
            //获取配置文件的完整路径
            String path = this.getServletContext().getRealPath("/");
            String profile = path+this.getInitParameter("profile");
            //配置Log4j环境
            PropertyConfigurator.configure(profile);
        }
        
    }

    注意,logger被定义为static变量,是因为这个logger与当前类绑定,为了避免每次都new一个新对象,造成资源浪费。

    web.xml的配置

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
      <display-name>Tab3</display-name>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
      </welcome-file-list>
      <filter>
          <filter-name>NoteFilter</filter-name>
          <filter-class>javaee.net.cn.websocket.NoteFilter</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>NoteFilter</filter-name>
          <url-pattern>/myServlet</url-pattern>
      </filter-mapping>
      
       <filter>
          <filter-name>HtmlFilter</filter-name>
          <filter-class>javaee.net.cn.websocket.HtmlFilter</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>HtmlFilter</filter-name>
          <url-pattern>/myServlet</url-pattern>
      </filter-mapping>
      <servlet>
          <servlet-name>MyServlet</servlet-name>
          <servlet-class>javaee.net.cn.websocket.MyServlet</servlet-class>
          <init-param>
              <param-name>profile</param-name>
              <param-value>/WEB-INF/log4j.properties</param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
          <servlet-name>MyServlet</servlet-name>
          <url-pattern>/myServlet</url-pattern>
      </servlet-mapping>
    </web-app>

    web.xml中里面有两个Filter可以参考责任链的设计模式

    https://www.cnblogs.com/ssskkk/p/9226882.html

    根据配置的Servlet-mapping 在浏览器输入对应的url即可看到打印效果

      控制台输出日志:2018-06-28 22:31:44,372  http-bio-8080-exec-2 jdbc.sqltiming  INFO - insert into db1_table1 (content) values ('hello') 

      D:/log.txt文件中也会记录(Log4j.properties有配置文件路径)

  • 相关阅读:
    Oracle OCP 11G 053(601-712)答案解析目录_20140304
    Oracle OCP 11G 053(201-400)答案解析目录_20140304
    Oracle OCP 11G 053(1-200)答案解析目录_20140304
    dojo实现表格数据无法展示
    dojo实现表格
    Matlab基本函数-menu函数
    Matlab基本函数-log10函数
    Matlab基本函数-log函数
    Matlab基本函数-length函数
    Matlab基本函数-imag函数
  • 原文地址:https://www.cnblogs.com/ssskkk/p/9196013.html
Copyright © 2020-2023  润新知