我有一個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
感謝您的回覆。我已經在db2 drivers目錄中包含了依賴關係中的所有log4j * .jar文件,並且更新了我的server.xml以包含您建議的內容(當然,我的應用程序的名稱/路徑已填充)。我也嘗試使用而不是。 無論哪種方式,當第一次查詢時,我得到net.sf.log4jdbc.sql.jdbcapi.DataSourceSpy上的InstantiationException。 任何有識之士將非常感激。再次感謝你。我將繼續對server.xml進行修改,並查看是否獲得了期望的結果。 –
Tyndareus
@Tyndareus如果您需要更多幫助,那麼我會建議您更新與新錯誤的問題。或者,如果這個答案幫助你取得進展,那麼你應該接受它。 –
@Tyndareus沒有堆棧我根本無法幫助你解決InstantiationException,但這聽起來像是一個完全獨立的問題。通過設置javax.sql.DataSource =「net.blah.DataSourceSpy」,您告訴Liberty什麼是數據源impl類。如果拋出異常,那麼驅動程序現在允許Liberty將其實例化是一個問題。 –