我有两个共享commons.jar库的Spring MVC应用程序。该库包括logback日志库(logback 1.2.3和slf4j 1.7.25)和logback.xml文件。
这两场战争都在他们的web.xml文件中包含这一行:
shinyApp(
ui = fluidPage(
fluidRow(
column(12,
dataTableOutput('table')
)
)
),
server = function(input, output) {
output$table <- renderDataTable(iris,
rownames=FALSE,
extensions = c("FixedColumns", "FixedHeader", "Scroller"),
options = list(searching=TRUE,
# autoWidth=TRUE,
scroller=TRUE,
scrollX=TRUE,
scrollY=paste0(4*nrow(iris),"px"),
fixedHeader=TRUE,
class='cell-border stripe',
fixedColumns=list(leftColumns=2,heightMatch='none')
)
)
}
)
每个应用程序都会生成自己的日志文件,包括主机名,例如: HOST1-nameOfApplicationA.log 。 Logback配置如下:
<env-entry>
<env-entry-name>applicationName</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>nameOfApplicationA|nameOfApplicationB</env-entry-value>
</env-entry>
一切正常(Spring MVC 4.3.7.RELEASE,Hibernate 4,C3P0最新),但我们决定升级到Hibernate 5.2.10并更改为HikariCP 2.6.1。之后,logback不再能够解析 java:comp / env / applicationName :
<insertFromJNDI env-entry-name="java:comp/env/applicationName" as="APP_NAME" />
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${HOSTNAME}-${APP_NAME}.log</file>
...
</appender>
导致两个应用程序使用相同的文件名 HOST1-APP_NAME_IS_UNDEFINED.log 。
当我们同时改变Hibernate和HikariCP时,我们回到C3P0来检查根本原因,并且可以确认新版本的Hibernate无关。这个变化是在它自己的分支中发展的,所以没有其他变化似乎会影响(无论如何,当它返回到C3P0时它起作用)。
我一直在Hikari和Logback的代码中进行一些跟踪,但我无法看到任何内容。我被困住了,不知道该看什么。
计划B在每个战争中插入自己的 logback.xml ,但我想避免它并理解问题,因为它可能会影响应用程序的其他部分。
两个战争都在Apache Tomcat / 8.0.38服务器中一起部署。也试过8.5.12。如果只有一次战争单独部署,也会发生这种情况。
答案 0 :(得分:0)
虽然我没有找到解决方案,但@ brettw发现了问题(请参阅https://github.com/brettwooldridge/HikariCP/issues/873),并得到了解决方法。
似乎因为HikariCP
依赖于slf4j
,并且HikariCP
也被初始化并注册到JNDI中,导致Logback
在{{1}之前初始化条目已注册。
所做的测试是使用<env-entry>
工厂而不是"org.apache.naming.factory.BeanFactory"
将Hikari数据源初始化。这样它就可以正常工作。