У меня есть веб-приложение, которое развертывается локально на сервере профиля Liberty и уже работает с log4j2. Моя конечная цель - зарегистрировать все PreparedStatements со значениями параметров, включенными в строку запроса, непосредственно перед их запуском с базой данных DB2.Конфигурирование log4jdbc-log4j2 с профилем Liberty
Я выполнил инструкции на 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 на некоторое время, и до сих пор ничего на StackOverflow или инструктивных блоги не помог мне двигаться вперед, поэтому я подумал, что пришло время задать свой вопрос.
Может кто-нибудь, пожалуйста, сообщите мне, в каких файлах и как, я должен внести изменения, упомянутые в шагах 3.1 («Изменить URL-адрес JDBC») и 3.2 («Изменить используемый драйвер»)? Пожалуйста, дайте мне знать, если есть что-то, что я могу уточнить, чтобы помочь ответить на мой вопрос, и заранее заблаговременно за любую помощь или руководство, которое вы можете предоставить.
Update
После внесения изменений в Server.xml предложенной aguibert и включая все log4j * .jar файлы от зависимости в каталоге драйверов db2, моя запись 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>
Теперь, когда первый запрос сделан, я получаю InstantiationException на net.sf.log4jdbc.sql.jdbcapi.DataSourceSpy:
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]]
Если это похоже на то, что я пропустил, сообщите мне. Поиск ошибок в трассировке стека не привел к каким-либо решениям.
Final Статус
Как aguibert отметил, что похоже на другую сторону будет лучше здесь. Основываясь на комментарии в Logging PreparedStatements in Java, я решил реализовать оболочку LoggableStatement, как описано здесь: ibm.com/developerworks/java/library/j-loggable
Благодарим за отзыв. Я включил все файлы log4j * .jar из зависимости в каталоге драйверов db2 и обновил свой файл server.xml, чтобы он содержал именно то, что вы предложили (конечно, с именами/путями моего приложения). Я также пытался использовать вместо . В любом случае, когда выполняется первый запрос, я получаю событие InstantiationException в файле net.sf.log4jdbc.sql.jdbcapi.DataSourceSpy. Любое понимание будет очень оценено. Еще раз спасибо. Я буду продолжать вносить изменения в server.xml и видеть, получаю ли я желаемые результаты. –
Tyndareus
@Tyndareus Если вам нужна дополнительная помощь, я бы предложил обновить вопрос с помощью вашей новой ошибки. В качестве альтернативы, если этот ответ помог вам добиться прогресса, вы должны его принять. –
@Tyndareus без стека Я не могу помочь вам вообще в ExceptionException, но это звучит как совершенно отдельная проблема. Установив javax.sql.DataSource = "net.blah.DataSourceSpy", вы сообщаете Liberty, что такое класс datasource impl. Если это порождает исключение, то проблема с драйвером теперь позволяет Liberty создать его экземпляр. –