log4j 配置資料庫連線池新增自定義資訊

2021-07-24 07:18:01 字數 2462 閱讀 4123

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.作用 ...