2015-06-29 2 views
1

У меня есть веб-приложение, которое развертывается локально на сервере профиля 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

ответ

1

Для сервера WebSphere Liberty вся глобальная конфигурация сервера сделанный в файле server.xml (расположенный по defualt на 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» набор свойств и значение имени класса DataSource для банка log4j. Кроме того, в элементе вы увидите, что URL-адрес указан с префиксом «jdbc: log4jdbc», как описано в разделе 3.1.

Это непроверенный совет, но вам может понадобиться включить обе банки (банку db2 и банку log4j) в одну папку, чтобы они были подняты в одном элементе.

+0

Благодарим за отзыв. Я включил все файлы log4j * .jar из зависимости в каталоге драйверов db2 и обновил свой файл server.xml, чтобы он содержал именно то, что вы предложили (конечно, с именами/путями моего приложения). Я также пытался использовать вместо . В любом случае, когда выполняется первый запрос, я получаю событие InstantiationException в файле net.sf.log4jdbc.sql.jdbcapi.DataSourceSpy. Любое понимание будет очень оценено. Еще раз спасибо. Я буду продолжать вносить изменения в server.xml и видеть, получаю ли я желаемые результаты. – Tyndareus

+0

@Tyndareus Если вам нужна дополнительная помощь, я бы предложил обновить вопрос с помощью вашей новой ошибки. В качестве альтернативы, если этот ответ помог вам добиться прогресса, вы должны его принять. –

+0

@Tyndareus без стека Я не могу помочь вам вообще в ExceptionException, но это звучит как совершенно отдельная проблема. Установив javax.sql.DataSource = "net.blah.DataSourceSpy", вы сообщаете Liberty, что такое класс datasource impl. Если это порождает исключение, то проблема с драйвером теперь позволяет Liberty создать его экземпляр. –

Смежные вопросы