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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值