使用 Liberty Profile 配置 log4jdbc-log4j2
Posted
技术标签:
【中文标题】使用 Liberty Profile 配置 log4jdbc-log4j2【英文标题】:Configuring log4jdbc-log4j2 with Liberty Profile 【发布时间】:2015-06-29 19:15:20 【问题描述】:我有一个本地部署到 Liberty Profile 服务器的 Web 应用程序,它已经在使用 log4j2。我的最终目标是在针对 DB2 数据库运行之前记录所有 PreparedStatement 及其参数值包含在查询字符串中。
我一直按照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(“更改使用的驱动程序”)中提到的更改?如果有什么我可以进一步澄清以帮助回答我的问题,请告诉我,并提前感谢您提供的任何帮助或指导。
更新
在更改 server.xml 建议 aguibert 并在 db2 驱动程序目录中包含依赖项中的所有 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)包含在同一个文件夹中,以便将它们放在同一个元素中。
【讨论】:
感谢您的回复。我已将依赖项中的所有 log4j*.jar 文件包含在 db2 驱动程序目录中,并更新了我的 server.xml 以包含您建议的内容(当然,填充了我的应用程序的名称/路径)。我也尝试过使用以上是关于使用 Liberty Profile 配置 log4jdbc-log4j2的主要内容,如果未能解决你的问题,请参考以下文章
使用 mp.config.profile 设置 Microprofile 活动配置文件在 Liberty 中不起作用
将修订包应用到 WebSphere Liberty Profile
Liberty Profile Jython automation – TypeError – javax.management.remote.JMXServiceURL() – 3rd arg ca