log4j.properties配置:
log4j.rootLogger=INFO, ROOT, file, JDBC
log4j.appender.ROOT=org.apache.log4j.ConsoleAppender
log4j.appender.ROOT.layout=org.apache.log4j.PatternLayout
log4j.appender.ROOT.layout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ss,SSS} %C{1}:%M - %m%n %c%n
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=5MB
log4j.appender.file.MaxBackupIndex=500000
log4j.appender.file.File=${catalina.home}/webapps/gae/logs/web_app.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%d] %-5p (%13F:%L) %3x - %m%n
log4j.appender.JDBC=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.JDBC.Threshold=INFO
log4j.appender.JDBC.driver=com.mysql.jdbc.Driver
log4j.appender.JDBC.sql=insert into sys_userlog(user_id,sys_resource_id,recordName,operateIp,operateTime,createBy,createAddr) values('%X{user_id}','%X{res_id}','%X{log_name}','%X{ip}','%X{log_time}','%X{create_by}','%X{log_addr}')
######log4j.appender.JDBC.sql=insert into sys_userlog(user_id) values('1')
log4j.appender.JDBC.URL=jdbc\:mysql\://localhost\:3306/test1?useUnicode\=true&characterEncoding\=utf8
log4j.appender.JDBC.user=root
log4j.appender.JDBC.password=123456
log4j.appender.JDBC.layout=org.apache.log4j.PatternLayout
將要存到數據庫的數據放到log4j中,此時需要用到struts2的攔截器,它的原理是:當需要記錄用戶的行爲過程時(瞭解他做了哪些操作,用了哪些action),當執行某個action時,首先會執行我們自己設置的攔截器userLogIntercepter,然後將數據放到log4j中,然後存到數據庫。
userLogIntercepter.class代碼:
package edu.gae.util;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.apache.log4j.MDC;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import edu.gae.model.User;
public class UserLogIntercepter extends AbstractInterceptor {
private static final long serialVersionUID = 8237067791003371738L;
private Logger logger = Logger.getLogger(UserLogIntercepter.class);
@Override
public String intercept(ActionInvocation invoke) throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
User user = (User) ActionContext.getContext().getSession().get("user");
if(user != null){
String ip = request.getRemoteAddr();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date now = new Date(System.currentTimeMillis());
MDC.put("user_id", user.getId());
MDC.put("res_id", "1");
MDC.put("log_name", "recordName");
MDC.put("ip", ip);
MDC.put("log_time", format.format(now));
MDC.put("create_by",user.getUserName());
MDC.put("log_addr", "湖北武漢");
logger.info(MDC.getContext());
}else{
MDC.put("user_id", "1");
MDC.put("res_id", "1");
}
return invoke.invoke();
}
public Logger getLogger() {
return logger;
}
public void setLogger(Logger logger) {
this.logger = logger;
}
}
struts2配置文件:
<interceptor name="userLogIntercepter" class="edu.gae.util.UserLogIntercepter"></interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="userLogIntercepter"/>
<!-- 必須引用默認棧,否則默認的攔截器無效 -->
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<!-- 設置默認攔截器棧 這樣每個action都會默認執行userLogIntercepter -->
<default-interceptor-ref name="myStack"></default-interceptor-ref>
然後再用刀攔截器的action中加上上面的攔截器 eg:
<action name="queryAll_userlog_action" class="userLogAction" method="queryAll" >
<interceptor-ref name="myStack" />
<result name="success">/admin/userlog/userlog_list.jsp</result>
<result name="error">/faied.jsp</result>
</action>
對於log4j存儲數據庫出現亂碼,可能的原因是1、數據庫和項目的編碼不相同,2、如果還是出現亂碼,則在log4j.properties文件數據庫url那欄後面加上?useUnicode\=true&characterEncoding\=utf8