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