log4j 文件輸出 和 數據庫存儲 以及數據庫存儲亂碼問題

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章