記錄下最近因爲項目需要記錄操作日誌而遇到一些問題。
由於項目是使用SpringMVC模式來開發的,需要操作日誌,並且將日誌消息存入數據庫中。
- 使用log4j來記錄日誌消息的。還需要另外一個jar包一起使用–commons-logging jar包.
- 關於如何使用log4j進行相對應的配置,在這裏就不多說了。轉載一篇文章:http://blog.csdn.net/ziruobing/article/details/3919501 裏面有詳細的說明。
- 接來下主要是對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
- 關於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