Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
spring配置中log4j.properties的回退_Spring_Spring Mvc_Log4j_Web.xml - Fatal编程技术网

spring配置中log4j.properties的回退

spring配置中log4j.properties的回退,spring,spring-mvc,log4j,web.xml,Spring,Spring Mvc,Log4j,Web.xml,我的配置如下: <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:META-INF/spring/environments/${env}/log4j.properties</param-value> </context-param> log4jConfigLocation 类路径:MET

我的配置如下:

 <context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:META-INF/spring/environments/${env}/log4j.properties</param-value>
</context-param>

log4jConfigLocation
类路径:META-INF/spring/environments/${env}/log4j.properties
我想要的是,如果

META-INF/spring/environments/${env}/log4j.properties

找不到,我希望加载web.xml

META-INF/spring/environments/dev/log4j.properties


有可能吗?

我不知道如何设置它以使用条件
IF
语句,但我认为您可以使用通配符。本手册解释了如何使用,但是由于格式问题,在中更容易阅读。但我会在这里为你总结

您可以同时使用特殊的
类路径*:
前缀和/或内部Ant样式的正则表达式

  • 使用Ant样式模式:
    • classpath:META-INF/spring/environments/**/log4j.properties
    • 此搜索将找到
      META-INF/spring/environments/
      的第一个实例,并以通配符形式提供下一个目录。此搜索将只返回找到的第一个内容
  • 使用
    classpath*:
    前缀:
    • classpath*:META-INF/spring/environments/**/log4j.properties
    • 此搜索将返回并合并与此模式匹配的所有文件的结果

如果
${env}
无法解析,并且出现异常,如
无法解析字符串值“classpath:META-INF/spring/environments/${env}/log4j.properties”中的占位符“env”
则使用以下格式很容易:

<param-value>classpath:META-INF/spring/environments/${env:dev}/log4j.properties</param-value>
话虽如此,这是我尝试的一个可能的解决方案:

  • 定义自己的
    Log4jConfigListener
package com.foo.bar;
导入java.io.FileNotFoundException;
导入javax.servlet.ServletContext;
导入javax.servlet.ServletContextEvent;
导入org.springframework.util.log4jconfig;
导入org.springframework.util.ResourceUtils;
导入org.springframework.util.StringUtils;
导入org.springframework.web.util.Log4jConfigListener;
导入org.springframework.web.util.log4jwebconfig;
导入org.springframework.web.util.ServletContextPropertyUtils;
导入org.springframework.web.util.WebUtils;
公共类MyLog4jConfigListener扩展了Log4jConfigListener{
公共静态最终字符串DEFAULT\u CONFIG\u LOCATION\u PARAM=“defaultLog4jConfigLocation”;
@凌驾
公共void contextInitialized(ServletContextEvent事件){
试一试{
super.contextInitialized(事件);
}捕获(IllegalArgumentException e){
//未找到log4jConfigLocation文件,请尝试默认设置
如果(!successfulDefaultLocationLookup(事件)){
//如果未设置默认参数或存在问题,请返回初始行为(引发IllegalArgumentException)
投掷e;
}
}
}
私有布尔值successfulDefaultLocationLookup(ServletContextEvent事件){
ServletContext=event.getServletContext();
String location=servletContext.getInitParameter(默认配置位置参数);
如果(位置!=null){
试一试{
//在可能解析实际路径之前解析属性占位符。
location=ServletContextPropertyUtils.resolvePlaceholders(位置,servletContext);
//保留URL(如“classpath:”或“file:”)不变。
如果(!ResourceUtils.isUrl(位置)){
/考虑与Web相关的普通文件路径
//应用程序根目录。
location=WebUtils.getRealPath(servletContext,location);
}
//将日志消息写入服务器日志。
servletContext.log(“从默认位置[“+location+”]”初始化log4j);
//检查是否指定了刷新间隔。
String intervalString=servletContext.getInitParameter(log4jwebconfig.REFRESH\u INTERVAL\u PARAM);
if(StringUtils.hasText(intervalString)){
//使用刷新间隔初始化,即使用log4j的看门狗线程,
//在后台检查文件。
试一试{
长刷新间隔=long.parseLong(intervalString);
log4jconfig.initLogging(位置、刷新间隔);
}
捕获(NumberFormatException ex){
servletContext.log(“默认log4j配置文件查找的'log4jRefreshInterval'参数无效:“+ex.getMessage()”);
返回false;
}
}
否则{
//在没有刷新检查的情况下初始化,即没有log4j的看门狗线程。
log4jconfig.initLogging(位置);
}
返回true;
}
捕获(FileNotFoundException ex){
servletContext.log(“默认log4j配置文件查找的'log4jConfigLocation'参数无效:”+ex.getMessage());
返回false;
}
}
返回false;
}
}
  • web.xml

com.foo.bar.MyLog4jConfigListener
  • 除了正常的log4j
    上下文参数
    配置外,还要为默认位置定义自定义参数

log4jConfigLocation
类路径:META-INF/spring/environments/${env}/log4j.properties
defaultLog4jConfigLocation
类路径:META-INF/spring/environments/dev/log4j.properties

我相信您正在为每个环境设置log4j.properties。所以,如果在其他环境中找不到这个文件,那么您基本上是在从dev中查找它-我说的对吗?每个环境都是d吗
catch (FileNotFoundException ex) {
            throw new IllegalArgumentException("Invalid 'log4jConfigLocation' parameter: " + ex.getMessage());
        }