log4j + 數據庫 +SpringMVC

記錄下最近因爲項目需要記錄操作日誌而遇到一些問題。
由於項目是使用SpringMVC模式來開發的,需要操作日誌,並且將日誌消息存入數據庫中。

  1. 使用log4j來記錄日誌消息的。還需要另外一個jar包一起使用–commons-logging jar包.
  2. 關於如何使用log4j進行相對應的配置,在這裏就不多說了。轉載一篇文章:http://blog.csdn.net/ziruobing/article/details/3919501 裏面有詳細的說明。
  3. 接來下主要是對log4j中關於寫入數據庫配置的一些說明
#rootLogger = [level], appenderName1, ....
#level OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL. if u define INFO, DEBUG will not outprint
#appenderName outprint where
#log4j.rootLogger=INFO,stdout

#outprint in console and set layout
#log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p [%c] - - <%m>%n

#DailyRollingFileAppender: write into file
#DatePattern = .yyyy-MM-dd: write into file everyday 
#log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.logfile.File=${webapp.root}/WEB-INF/logs/exppower.log
#log4j.appender.logfile.DatePattern=.yyyy-MM-dd
#log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
#log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] wang- <%m>%n

########################

# JDBC Appender

#######################

#You should define your project firstly and set your package secondly
**#對於轉載的那篇文章中,需要進行修改的就是下面這句話,如果不配置你項目
名字,log4j就無法訪問到你項目下的具體的類包。雖然不知道是不是這個原因,
但是我後面試着加上去,就可以訪問項目下的類包了。**
log4j.logger.LogisticsSystem=INFO,db
#指定到某些類包
log4j.logger.com.rola.controller.UserController=INFO,db
log4j.logger.com.rola.controller.DevicesController=INFO,db
log4j.logger.com.rola.controller.GoodsController=INFO,db
log4j.logger.com.rola.controller.EnvironmentController=INFO,db
log4j.logger.com.rola.controller.GuardController=INFO,db
log4j.logger.com.rola.controller.OrderController=INFO,db
log4j.logger.com.rola.controller.OutController=INFO,db
log4j.logger.com.rola.controller.PutInController=INFO,db
log4j.logger.com.rola.controller.SQLManageController=INFO,db
log4j.logger.com.rola.controller.SuppliersController=INFO,db

#重新配置自己寫的JDBCAppender
log4j.appender.db=com.rola.util.MyJDBCAppenderUtil

log4j.appender.db.BufferSize=50

log4j.appender.db.driver=com.mysql.jdbc.Driver

log4j.appender.db.URL=jdbc:mysql://localhost:3306/db_logistics

log4j.appender.db.user=root

log4j.appender.db.password=123456

log4j.appender.db.sql=insert into tb_logs(user_id, user_name, class_name, class_mothod, log_time, log_level, log_msg) values('%X{user_id}','%X{user_name}','%C','%M','%d{yyyy-MM-dd HH:mm:ss}','%p','%m')

log4j.appender.db.layout=org.apache.log4j.PatternLayout
  1. 關於log4j的其他配置,例如輸出到控制檯,文件等,就不在這裏多說了。在我的配置上,需要對數據庫進行插入user_id, user_name。也就是要插入當前操作的用戶編號和密碼。先貼上表的結構
CREATE TABLE tb_logs(
    id BIGINT(20) AUTO_INCREMENT NOT NULL,
    user_id VARCHAR(255) NOT NULL,
    user_name VARCHAR(255) NOT NULL,
    class_name VARCHAR(255) NOT NULL,
    class_mothod VARCHAR(255) NOT NULL,
    log_time DATETIME NOT NULL,
    log_level VARCHAR(255) NOT NULL,
    log_msg VARCHAR(255) NOT NULL,
    PRIMARY KEY(id)
    CONSTRAINT FK_LOG_USER_ID FOREIGN 
    KEY(user_id)REFERENCES tb_user(user_id)ON DELETE CASCADE 
    ON UPDATE RESTRICT
);

由於我的表對user_id建立了外鍵,所以數據插入,user_id是必須存在的。所以需要一個過濾器對登錄進行過濾。
5. 貼上過濾器代碼

public class LoginFilter implements HandlerInterceptor{

    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse respone, Object object, Exception ex)
            throws Exception {
        // TODO Auto-generated method stub
        //System.out.println("afterCompletion");
    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response,
            Object object, ModelAndView mav) throws Exception {
        // TODO Auto-generated method stub
        //System.out.println("postHandle");
    }

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
            Object object) throws Exception {
        // TODO Auto-generated method stub
        boolean isFilter = true;
         String requestUri = request.getRequestURI();
         System.out.println("Uri = " + requestUri);
         if( requestUri.indexOf("login.do") != -1 ){  //過濾專
         門的logi.do方法
             return true;
         }
             /*對於用戶登錄*/
             HttpSession session = request.getSession();
             User user= (User 
             )session.getAttribute("currentUser");
             if( session == null || user == null ){
                 /*先判斷session是否爲空,如果是就不再執行後續的攔截方法*/
                request.getContextPath());

            response.sendRedirect(request.getContextPath() + "/login.jsp");
                 return false;
             } else{
                    System.out.println("user_id = " + user.getUserId());
                    MDC.put("user_id", user.getUserId());
                    MDC.put("user_name", user.getUserName());
             }

        //在具體方法中就可以寫入日誌
        return true;
    }

}

使用的是SpringMVC的過濾器,這份代碼當然自己也不知道是否正確。存在的問題就是,在tomcat重新啓動的時候,去登錄界面進行登錄的時候,log4j就會自動去插入,由於當前沒有得到user_id的值所以會拋出異常。–有點問題
6. 關於插入日誌消息裏面存在單引號的問題,詳解請看http://www.haodaima.net/art/2769115

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