log4j寫資料庫,通常只能寫入log4j提供的資訊,如果用來記錄使用者id號,操作等的記錄,則無法實現.
這裡,我在log4j裡加了乙個欄位userid (當然你可以再加幾個)用來記錄使用者id,操作
1.log4j配置檔案
#向控制台和資料庫輸出
log4j.rootlogger=debug,stdout,jdbc
log4j.addivity.org.apache=true
大家注意最後一句
2.資料庫表結構
我是在oracle下測試的,表結構如下
create table sys_log
(logtime varchar2(32),
userid varchar2(20),
loglevel varchar2(10),
location varchar2(80),
message varchar2(100)
)3.資料庫連線池和自定義資訊
如果你的伺服器上配置了資料庫連線池,而且想插入自定義資訊,比如使用者id,必須過載此類。
**見附錄1
說明:(1)網上大量的人說至少過載三個方法getconnect,closeconnection,excute,我看了一下源**,悲從心生。最早應該有乙個程式設計師,對物件導向技術是懂非懂,看了一些資料就草率的下了這個結論,而且還想當然的結出了例子**。
比如:如何給 log4j 配上資料庫連線池
從物件導向技術上看,過載意味著先當例項化出乙個子類物件時,如果子類過載了父類的方法,則執行子類的方法,如果沒有過載,則執行父類的方法。
(2)由於我們使用了資料庫連線池,所以必須過載getconnection和closeconnection
(3)由於我們要加入自定義資訊,必須過載getlogstatement
(4)databaseconfigure類請在部落格內找,這裡就不提供超連結了
4.新增自定義資訊
(1)先新增乙個parameterizedmessage介面,見附錄2
(2)再用jdbclogmessage類實現
parameterizedmessage介面,見附錄3
(4)有的人很巧妙,通過preparedstatement完成了sql資料的插入,但是徹底影響了log4j的整體結構,這裡不推薦大家使用。參見《
log4j記錄日誌到資料庫》
這個過載的最根本問題,是重新定義了getlogstatement方法的功能(從提供合法的sql語句變成了直接進行sql操作),由於log4j是通常的類庫,又不是你自己寫的,會引起致命的錯誤的。
5.測試**
public class logtest
}說明:
1001是指使用者id
惟一美中不足是message欄位裡會顯示
[question error, 1001]
多乙個中括號和1001資訊,呵呵
附錄1:
super();
}/**
*/protected connection getconnection() throws sqlexception catch(namingexception namingex)
} else catch (classnotfoundexception e)
try catch (sqlexception sqlex)
}return this.connection;
} /**
* 過載getlogstatement()方法,
* 在sql字串最後新增使用者id等資訊
*/protected string getlogstatement(loggingevent event)
stringbuffer.deletecharat(stringbuffer.length()-1);
}
return stringbuffer.tostring();
}/**
*/protected void closeconnection(connection con) catch (sqlexception e) }}
附錄2public inte***ce parameterizedmessage extends serializable
附錄3public class jdbclogmessage implements parameterizedmessage
public object getparameters()
public object getparameter(int index) throws indexoutofbound***ception
public int getparametercount()
@override
public string tostring()
}參考文獻
1.log4j記錄日誌到資料庫.
2.如何給 log4j 配上資料庫連線池.
來自:
資料庫連線池配置
連線池的必要性 資料庫連線池是負責分配 管理和釋放資料庫連線,它允許應用程式重複使用乙個現有的資料庫連線,可以視作乙個存放資料庫連線的容器。資料庫連線池採用了資源池設計模式,用於資源共享,避免資源的頻繁分配與釋放問題。同時便於統一管理,可以通過對連線池的控制,限制系統與資料庫的連線,監視資料庫的連線...
資料庫連線池技術 DBCP連線池 配置
最近遇到資料庫連線池配置問題,搜了很多資料對照著進行全域性配置都沒有解決。報的錯誤是 org.apache.tomcat.dbcp.dbcp.sqlnestedexception cannot create jdbc driver of class for connect url jdbc mysq...
資料庫連線池 Redis連線池
基本原理 在內部物件池中,維護一定數量的資料庫連線,並對外暴露資料庫連線的獲取和返回方法。如外部使用者可通過getconnection方法獲取資料庫連線,使用完畢後再通過releaseconnection方法將連線返回,注意此時的連線並沒有關閉,而是由連線池管理器 並為下一次使用做好準備。2.作用 ...