标签:pen 开发 context 父类 string apach 一个 完整 schema
1.API中最核心的三个接口都在org.apache.log4j 包下
Class Logger
This is the central class in the log4j package. Most logging operations, except configuration, are done through this class.
翻译: 这是log4j包中的中心类。除了配置之外,大多数日志记录操作都是通过这个类完成的。
Interface Appender
Implement this interface for your own strategies for outputting log statements.
翻译:为输出日志语句的策略实现此接口。(指定日志信息应该被输出到什么地方,可以是控制台、文件)
Class Layout
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的继承一样 子类可拥有父类的全部属性)
2.Log4j的基本使用方法
log4j.rootLogger=[priority],appenderName,appenderName,......
priority是日志基本 级别的顺序 DEBUG INFO WARN ERROR .如果定义INFO级别 程序中所有DEBUG的信息都不会打印出来。 appendName 可以指定多个用逗号隔开 console,file
log4j.appender.apendName=value1
log4j.appender.apendName=value1
这里的appendName就是Logger组件所配置的appendName(console,file) value是指appender接口的实现类org.apache.log4j.ConsoleAppender org.apache.log4j.RollingFileAppender 等
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 当前日志的内容
3.在程序中使用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; 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); } }
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可以参考责任链的设计模式
根据配置的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有配置文件路径)
标签:pen 开发 context 父类 string apach 一个 完整 schema
原文地址:https://www.cnblogs.com/ssskkk/p/9196013.html