这里有点难题。
我在WAR中有一个应用程序。那里有web.xml和application context.xml,还有log4j.properties。这个WAR在tomcat中运行。
有可能在log4j.properties中使用一些变量,例如: log4j.appender.file.File=${catalina.base}/logs/app.log
我想在web.xml或context.xml中定义一个变量,并在log4j.properties中使用它。例如,以某种方式设置version=1.1
并使用log4j.appender.file.File=${catalina.base}/logs/app-${version}.log
。它不应该是环境变量。
我可以不重新编译应用程序吗?
添加 不应该影响任何事情,但以防万一...
它的web.xml如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee">
<!-- Spring -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:context.xml</param-value>
</context-param>
<!-- log4j -->
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4j.properties</param-value>
</context-param>
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>10000</param-value>
</context-param>
<context-param>
<param-name>log4jExposeWebAppRoot</param-name>
<param-value>false</param-value>
</context-param>
...
</web-app>
答案 0 :(得分:9)
创建org.springframework.web.util.Log4jConfigListener
的子类,将version
值公开为System变量(当然,您可以通过标准的System / Java环境变量传递值)。
public class TestListener extends Log4jConfigListener{
@Override
public void contextInitialized(ServletContextEvent pEvent) {
String value = pEvent.getServletContext().getInitParameter("version");
String version = System.getProperty("version");
if (version == null || version.trim().length()==0) System.setProperty("version", value);
super.contextInitialized(pEvent);
}
}
并修复您的web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee">
<!-- Spring -->
...
<!-- log4j -->
<listener>
<listener-class>com.TestListener</listener-class>
</listener>
<context-param>
<param-name>version</param-name>
<param-value>1.1</param-value>
</context-param>
...
答案 1 :(得分:0)
我认为你可以通过在web.xml中声明一个context-param并在你想要放置版本的属性文件中使用该param名称来做到这一点。
web.xml中的
<context-param>
<param-name>version</param-name>
<param-value>1.1</param-value>
</context-param>
在属性文件
中log4j.appender.file.File=${version}/logs/app.log
这应该可以在服务器重启时使用,无需编译。
您还可以尝试从xml设置属性并从属性文件中访问ti。
web.xml中的
<Properties>
<Property name="version">1.1</Property>
</properties>
在属性文件
中log4j.appender.file.File=${version}/logs/app.log
答案 2 :(得分:0)
javabot关于声明上下文参数来设置变量的答案是正确的,但是为了在属性文件中检索它,你需要像https://code.google.com/p/eproperties/这样的东西(“EProperties扩展了标准的java.util.Properties对象和语法包括:变量替换,嵌套,包含和列表。“)。
您可能需要查看上一个问题:Reference other variables in Java properties file
祝您找到解决方案!