以下步骤实现在springMVC,Mybatis框架下,使用log4j将日志写入Oracle数据库,并能够在控制台打印Mybatis执行的sql语句。
需要准备一张带有以下字段(ID,LOGINID,Class,Mothod,createTime,LogLevel,MSG)的数据库表。可根据自己需要进行更改。
1. 编写过滤器
package util;
import java.io.IOException;
import java.util.UUID;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.MDC;
public class LogFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// 此处编写自己的业务
util.MyCookie cookie = new util.MyCookie();
String LoginID = cookie.Get_LoginID((HttpServletRequest) request);
if(LoginID == null || "".equals(LoginID)){
MDC.put("LOGINID","LOGINID未取到");
MDC.put("ID", UUID.randomUUID().toString());
}else{
MDC.put("LOGINID",LoginID);
MDC.put("ID", UUID.randomUUID().toString());
}
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
2. 编写log4j.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%5p [%t] - %m%n" />
</layout>
<!-- 限制输出级别 -->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMax" value="ERROR" />
<param name="LevelMin" value="DEBUG" />
</filter>
</appender>
<!-- 屏蔽框架信息 -->
<logger name="org.springframework">
<level value="WARN" />
</logger>
<appender name="DATABASE" class="org.apache.log4j.jdbc.JDBCAppender">
<param name="URL" value="jdbc:oracle:thin:@ip:port:orcl" />
<param name="driver" value="oracle.jdbc.driver.OracleDriver" />
<param name="user" value="username" />
<param name="password" value="pwd" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="INSERT INTO log_4j (ID,LOGINID,Class,Mothod,createTime,LogLevel,MSG) values ('%X{ID}','%X{LOGINID}','%C','%M','%d{yyyy-MM-dd HH:mm:ss}','%p','%m')" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMax" value="ERROR" />
<param name="LevelMin" value="WARN" />
</filter>
</appender>
<root>
<priority value="debug" />
<appender-ref ref="CONSOLE" />
<appender-ref ref="DATABASE" />
</root>
</log4j:configuration>
3. 在web.xml文件中添加过滤器及log4j.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"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>MHHT</display-name>
<welcome-file-list>
<welcome-file></welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>MHHT</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MHHT</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>logFilter</filter-name>
<filter-class>util.LogFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>logFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/MHHT-servlet.xml,
/WEB-INF/MHHT-controller.xml,
/WEB-INF/MHHT-data.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.xml</param-value>
</context-param>
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>60000</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
</web-app>
4. 使用
package controller.admin;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class TestLog4jController {
@RequestMapping(value = "/test", produces = "text/plain;charset=UTF-8")
@ResponseBody
public void test() {
System.out.println("in test()...");
Log logger = LogFactory.getLog(this.getClass());
logger.debug("debug!!!");
logger.info("info!!!");
logger.warn("warn!!!");
logger.error("error!!!");
logger.fatal("fatal!!!");
}
}