2015-06-29 174 views
1

我有一個Web應用程序,本地部署到Liberty Profile服務器,並且已經與log4j2一起工作。我的最終目標是在針對DB2數據庫運行之前,將所有PreparedStatements與其查詢字符串中包含的參數值一起記錄。使用Liberty Profile配置log4jdbc-log4j2

我一直在按照https://code.google.com/p/log4jdbc-log4j2上的說明設置log4jdbc-log4j2。我能拉下相關文件與Maven:

<dependency> 
    <groupId>org.bgee.log4jdbc-log4j2</groupId> 
    <artifactId>log4jdbc-log4j2-jdbc4</artifactId> 
    <version>1.16</version> 
</dependency> 

不過,我一直停留在步驟3.1和3.2一段時間,到目前爲止,沒有在計算器或教學博客幫助我前進,所以我認爲是時候問自己的問題了。

有人能讓我知道在哪些文件中,以及如何進行步驟3.1(「更改您的JDBC URL」)和3.2(「更改所用驅動程序」)中提到的更改?請讓我知道是否有什麼我可以進一步澄清,以幫助解答我的問題,並且事先感謝您提供任何幫助或指導。

更新

從DB2驅動程序目錄的依賴性使得修改server.xml中建議aguibert幷包括所有的log4j * .jar文件後,我的server.xml中的條目是這樣的:

<dataSource id="myDataSource" jndiName="jdbc/myDataSource" type="javax.sql.DataSource"> 
    <jdbcDriver javax.sql.DataSource="net.sf.log4jdbc.sql.jdbcapi.DataSourceSpy"> 
     <library> 
      <fileset dir="<path to dir>/db2" includes="db2jcc_license_cisuz.jar db2jcc4.jar log4j-api-2.3.jar log4j-core-2.3.jar log4jdbc-log4j2-jdbc4-1.16-sources.jar log4jdbc-log4j2-jdbc4-1.16.jar"/> 
     </library> 
    </jdbcDriver> 
    <properties 
     password="password" 
     user="user" 
     URL="jdbc:log4jdbc:db2://<normal jdbc url>" /> 
</dataSource> 

現在,第一查詢時的時候,我得到一個net.sf.log4jdbc.sql.jdbcapi.DataSourceSpy InstantiationException:

java.lang.Exception: 
    at <my files> 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:595) [com.ibm.ws.javaee.servlet.3.0_1.0.8.jar:?] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:668) [com.ibm.ws.javaee.servlet.3.0_1.0.8.jar:?] 
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1285) [com.ibm.ws.webcontainer_1.0.8.jar:?] 
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:776) [com.ibm.ws.webcontainer_1.0.8.jar:?] 
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:473) [com.ibm.ws.webcontainer_1.0.8.jar:?] 
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1104) [com.ibm.ws.webcontainer_1.0.8.jar:?] 
    at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:4845) [com.ibm.ws.webcontainer_1.0.8.jar:?] 
    at com.ibm.ws.webcontainer.osgi.DynamicVirtualHost$2.handleRequest(DynamicVirtualHost.java:297) [com.ibm.ws.webcontainer_1.0.8.jar:?] 
    at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:981) [com.ibm.ws.webcontainer_1.0.8.jar:?] 
    at com.ibm.ws.webcontainer.osgi.DynamicVirtualHost$2.run(DynamicVirtualHost.java:262) [com.ibm.ws.webcontainer_1.0.8.jar:?] 
    at com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink$TaskWrapper.run(HttpDispatcherLink.java:955) [com.ibm.ws.transport.http_1.0.8.jar:?] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [?:1.7.0_60] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [?:1.7.0_60] 
    at java.lang.Thread.run(Thread.java:745) [?:1.7.0_60] 
Caused by: javax.naming.NamingException: CWWKN0008E: An object could not be obtained for name jdbc/myDataSource. 
    at com.ibm.ws.jndi.internal.WSContext.resolveObject(WSContext.java:128) ~[?:?] 
    at com.ibm.ws.jndi.internal.WSContext.lookup(WSContext.java:364) ~[?:?] 
    at com.ibm.ws.jndi.internal.WSContext.lookup(WSContext.java:359) ~[?:?] 
    at org.apache.aries.jndi.DelegateContext.lookup(DelegateContext.java:161) ~[?:?] 
    at javax.naming.InitialContext.lookup(InitialContext.java:411) ~[?:1.7.0_60] 
    at <my files> 
    ... 16 more 
[ERROR ] CWWKE0701E: FrameworkEvent ERROR Bundle:com.ibm.ws.jdbc(id=69) org.osgi.framework.ServiceException: Exception in com.ibm.ws.resource.internal.ResourceFactoryTrackerData$1.getService() 
    at org.eclipse.osgi.internal.serviceregistry.ServiceFactoryUse.factoryGetService(ServiceFactoryUse.java:222) 
    at [internal classes] 
    at javax.naming.InitialContext.lookup(InitialContext.java:411) 
    at <my files> 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:595) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:668) 
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1285) 
    at [internal classes] 
Caused by: java.lang.RuntimeException: java.sql.SQLNonTransientException: java.lang.InstantiationException: net.sf.log4jdbc.sql.jdbcapi.DataSourceSpy 
    at com.ibm.ws.resource.internal.ResourceFactoryTrackerData$1.getService(ResourceFactoryTrackerData.java:109) 
    ... 10 more 
Caused by: java.sql.SQLNonTransientException: java.lang.InstantiationException: net.sf.log4jdbc.sql.jdbcapi.DataSourceSpy 
    at com.ibm.ws.jdbc.internal.JDBCDriverService.create(JDBCDriverService.java:287) 
    ... 10 more 
Caused by: java.lang.InstantiationException: net.sf.log4jdbc.sql.jdbcapi.DataSourceSpy 
    at java.lang.Class.newInstance(Class.java:359) 
    at com.ibm.ws.jdbc.internal.JDBCDriverService$1.run(JDBCDriverService.java:228) 
    ... 10 more 
Event:org.osgi.framework.FrameworkEvent[source=com.ibm.ws.jdbc_1.0.8.cl50520150305-2202 [69]] 

如果看起來有什麼我錯過了,請讓我知道。在堆棧跟蹤中搜索錯誤並未產生任何解決方案。

最終狀態

由於aguibert指出,這似乎是一個不同的方向將是最好的在這裏。根據Logging PreparedStatements in Java中的評論,我決定實現如下所述的LoggableStatement包裝器:ibm.com/developerworks/java/library/j-loggable

回答

1

對於WebSphere Liberty服務器,所有全局服務器配置均爲在server.xml文件中完成(位於WLP_INSTALL/usr/servers/server.xml中)。

你可能會想沿着你的server.xml幾行內容:

<dataSource id="myDataSource" jndiname="jdbc/myDataSource" type="javax.sql.DataSource"> 
    <jdbcDriver javax.sql.DataSource="net.sf.log4jdbc.sql.jdbcapi.DataSourceSpy"> 
     <library> 
     <fileset dir="C:/path/to/libs" includes="thedb2jar.jar log4j.jar" /> 
     </library> 
    </jdbcDriver> 
    <properties user="user" password="password" 
       url="jdbc:log4jdbc:<the normal jdbc url>"/> 
</dataSource> 

這裏的關鍵部位是該元素具有「javax.sql.DataSource中的」屬性集和值是名稱用於log4j jar的DataSource類。此外,在元素中,您將看到該URL是使用「jdbc:log4jdbc」前綴指定的,如3.1節所述。

這是未經測試的建議,但您可能需要在同一個文件夾中同時包含jar(db2 jar和log4j jar),以便它們在同一個元素中拾取。

+0

感謝您的回覆。我已經在db2 drivers目錄中包含了依賴關係中的所有log4j * .jar文件,並且更新了我的server.xml以包含您建議的內容(當然,我的應用程序的名稱/路徑已填充)。我也嘗試使用而不是。 無論哪種方式,當第一次查詢時,我得到net.sf.log4jdbc.sql.jdbcapi.DataSourceSpy上的InstantiationException。 任何有識之士將非常感激。再次感謝你。我將繼續對server.xml進行修改,並查看是否獲得了期望的結果。 – Tyndareus

+0

@Tyndareus如果您需要更多幫助,那麼我會建議您更新與新錯誤的問題。或者,如果這個答案幫助你取得進展,那麼你應該接受它。 –

+0

@Tyndareus沒有堆棧我根本無法幫助你解決InstantiationException,但這聽起來像是一個完全獨立的問題。通過設置javax.sql.DataSource =「net.blah.DataSourceSpy」,您告訴Liberty什麼是數據源impl類。如果拋出異常,那麼驅動程序現在允許Liberty將其實例化是一個問題。 –

相關問題