簡體   English   中英

在web.xml中使用表達式語言(EL)訪問JVM變量

[英]Using Expression Language (EL) in web.xml to access JVM variables

我有兩個在同一WebSphere 8.5.5服務器上運行的Web應用程序。 第一個應用程序能夠使用web.xml中的表達式語言(EL)來訪問JVM變量,如下所示:

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/config/log4j-${app.env}.xml</param-value>
</context-param>

這使我可以在服務器上設置一個名為app.env的JVM變量,該變量確定使用哪個log4j配置文件。 此變量根據環境設置為rad,test或production。

此外,由於這些應用程序將在群集環境中運行,但登錄到相同的網絡共享,因此我需要在log4j配置文件中使用EL來區分日志文件。 這是通過在log4j配置文件中使用EL來實現的,如下所示:

<appender name="file" class="com.example.util.CustodianDailyRollingFileAppender">
    <param name="maxNumberOfDays" value="10" />
    <param name="compressBackups" value="yes" />
    <param name="File" value="/netshare/logs/${app.serv}_app.log" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="[%d] %-5p %c - %m%n" />
    </layout>
</appender>

在集群中的第一台服務器上,app.serv JVM變量設置為“ 1”,在第二台服務器上將其設置為“ 2”,這將為每個服務器創建一個分別名為1_app.log和2_app.log的日志文件。

第一個應用程序使用Servlets 2.4和Spring Framework 3.0.4。

在第二個應用程序中,我嘗試對日志文件使用相同的方案,但是,我使用的是Servlets 3.0,而不是使用Spring Framework,而是嘗試堅持使用JEE6。 但是,不會在web.xml或log4j配置文件中評估EL。

如果我將EL放在第二個應用程序的web.xml中,則log4j會引發異常,因為它由於未評估EL而無法在定義的位置找到配置文件:

<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>/WEB-INF/log4j2-${app.env}.xml</param-value>
</context-param>

這會導致異常,因為log4j正在尋找log4j2-$ {app.env} .xml而不是log4j2-rad.xml。

同樣,如果我硬編碼配置位置並嘗試在log4j2配置中使用EL,則不會評估EL,並且在評估EL和命名時會得到名為$ {app.serv} _app.log的日志文件文件1_app.log。

這提出了我的問題:

1)Application 1和Application 2之間的區別是什么,導致我的web.xml和log4j配置中的EL無法評估?

2)如何在應用程序2的web.xml和log4j配置文件中使EL工作?

我想我已經回答了自己的問題:

1)什么是應用1和應用2之差,是造成EL在我的web.xml和log4j的配置不進行評估?

區別是雙重的:

首先,Applicaton A是一個Spring應用程序,它利用了Spring附帶的Log4JConfigListener類。 Log4JConfigListener是AA的ServletContextListener,基本上只是幫助Log4j的配置類查找配置文件。 此外,它在此之前,它解決了在web.xml Log4J的配置位置情境的參數中使用的任何占位符。 我能夠通過實現自己的ServletContextListener來重現此行為,該行為基本上與Spring相同。

其次,應用程序A使用Log4j 1.2.x,而應用程序B嘗試使用Log4j2.x。 最初,我認為Log4j 2.x在OptionConverter類中根本沒有執行與Log4j 1.2.x相同的占位符解析。 所以,我通過恢復到Log4j的1.2.x.解決了這個問題 自從我將更改返回到Log4j 1.2.x之后,我注意到log4j-1.2-api-2.x.jar中似乎有適配器類。 這個jar在我的應用程序B的類路徑中不存在,如果在那里,它們可能會有所作為。 我可能會在以后進行調查,但是到目前為止,我很高興能夠使用Log4j 1.2.x使其工作。

2)如何在應用程序2的web.xml和log4j配置文件中使EL工作?

上面回答了問題2,使用ServletContextListener在將文件位置傳遞到Log4j配置程序之前解析表達式,並使用Log4j 1.2.x而不是Log4j2.x。 再次強調,如果log4j-1.2-api-2.x.jar位於類路徑中,則Log4j 2.x可能具有相同的行為,但是我目前無法親自驗證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM