`
恋上你的味道
  • 浏览: 101120 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

log4j/logback + spring的webRootKey 冲突问题

阅读更多
一次部署项目后出现下面的异常:
java.lang.IllegalStateException: Web app root system property already set to different value: 'webapp.root' = [/usr/local/webserver/tomcat/webapps/naruto-manager/] instead of [/usr/local/webserver/tomcat/webapps/ysxj-manager/] - Choose unique values for the 'webAppRootKey' context-param in your web.xml files!

网上很多都说是跟日志有关
打开logback/log4j相关的spring监听类,比如LogbackConfigListener,初始化调用WebLogbackConfigurer的initLogging方法:
 public static void initLogging(ServletContext servletContext) {
        // Expose the web app root system property.
        if (exposeWebAppRoot(servletContext)) {
            WebUtils.setWebAppRootSystemProperty(servletContext);
        }
...
}


追踪到WebUtils这个类中,打开这个类140行查看setWebAppRootSystemProperty方法,如下
public static void setWebAppRootSystemProperty(ServletContext servletContext) throws IllegalStateException {
        Assert.notNull(servletContext, "ServletContext must not be null");
        String root = servletContext.getRealPath("/");
        if (root == null) {
            throw new IllegalStateException(
                "Cannot set web app root system property when WAR file is not expanded");
        }
        String param = servletContext.getInitParameter(WEB_APP_ROOT_KEY_PARAM);
        String key = (param != null ? param : DEFAULT_WEB_APP_ROOT_KEY);
        String oldValue = System.getProperty(key);
        if (oldValue != null && !StringUtils.pathEquals(oldValue, root)) {
            throw new IllegalStateException(
                "Web app root system property already set to different value: '" +
                key + "' = [" + oldValue + "] instead of [" + root + "] - " +
                "Choose unique values for the 'webAppRootKey' context-param in your web.xml files!");
        }
        System.setProperty(key, root);
        servletContext.log("Set web app root system property: '" + key + "' = [" + root + "]");
    }

原因很明显了:
Web 容器启动的时候会获取webAppRootKey参数的值,然后以此值为可以key 把ROOT的绝对路径写到系统变量里,
如果不定义webAppRootKey参数,那么webAppRootKey就是缺省的"webapp.root",但如果多个项目都使用默认或相同的参数这里就会报错了
解决方法:
在web.xml中添加如下配置
<context-param>  
    <param-name>webAppRootKey</param-name>  <!--如果放两个项目实例此属性要设置,而且两个项目param-value值的不能相同,log4j和logback都要设置,这点很容易忽略 -->
    <param-value>ysxj.root</param-value>  
</context-param>

这样在logback/log4j的配置文件中使用${ysxj.root }会用来表示Web目录的绝对路径
1
0
分享到:
评论
5 楼 恋上你的味道 2014-03-26  
Herbaceous 写道
恋上你的味道 写道
Herbaceous 写道
spring有logback的实现?

不是spring实现logback,是spring对logback的支持,就像spring整合log4j一样有对应的监听器,spring整合logback的监听器是LogbackConfigListener,与log4整合监听器的是Log4jConfigListener

用过Logback和spring整合吗?除非那个类是你自己写的,spring压根没有

详情请搜索:ch.qos.logback.ext.spring.web.LogbackConfigListener

或者参考:https://github.com/qos-ch/logback-extensions/wiki/Spring
4 楼 Herbaceous 2014-03-19  
恋上你的味道 写道
Herbaceous 写道
spring有logback的实现?

不是spring实现logback,是spring对logback的支持,就像spring整合log4j一样有对应的监听器,spring整合logback的监听器是LogbackConfigListener,与log4整合监听器的是Log4jConfigListener

用过Logback和spring整合吗?除非那个类是你自己写的,spring压根没有
3 楼 webeasymail 2014-03-17  
标题能把这个BUG去掉嘛,太雷人了~~
2 楼 恋上你的味道 2014-03-17  
Herbaceous 写道
spring有logback的实现?

不是spring实现logback,是spring对logback的支持,就像spring整合log4j一样有对应的监听器,spring整合logback的监听器是LogbackConfigListener,与log4整合监听器的是Log4jConfigListener
1 楼 Herbaceous 2014-03-17  
spring有logback的实现?

相关推荐

    日志 log4j-slf4j+logback1.3.0

    本文将深入探讨“日志4j(Log4j)、SLF4J(Simple Logging Facade for Java)和logback 1.3.0”这三者之间的关系以及它们在Java应用中的作用。 首先,Log4j是Apache软件基金会开发的一个流行的日志记录框架,它允许...

    slf4j+logback+springmvc+maven小例子

    在这个“slf4j+logback+springmvc+maven小例子”中,我们看到的是一个结合了这些技术的简单应用。Spring MVC是一个基于Spring框架的轻量级Web MVC框架,它简化了构建交互式、RESTful的Web应用的流程。Maven则是一个...

    logback-ext-spring-0.1.1

    logback与spring集成的文件,从官网上找的。上传的文件包括源文件和jar包,以下是连接: https://github.com/qos-ch/logback-extensions/wiki/Spring ...

    logback+self4j 进行日志记录

    **SLF4J 是一个日志门面,它为各种日志框架提供了统一的接口,如Log4j、Logback等。这样做的好处是,开发者可以在不修改代码的情况下更换底层的日志实现,只需改变依赖即可。** **Logback 是 SLF4J 的默认实现,由 ...

    Spring Boot SLF4J日志实例 / Logback

    **Spring Boot SLF4J与Logback日志实践** 在Java开发中,日志系统扮演着至关重要的角色,它能够帮助我们追踪程序运行时的问题、分析性能瓶颈以及调试代码。Spring Boot作为现代化的Java开发框架,已经为我们预设了...

    springmvc log4j2 logback 注解 jackson 日志脱敏实现源码

    本资源包含的是关于`SpringMVC`、`Log4j2`、`Logback`以及`Jackson`的日志脱敏实现源码,提供了多种实现方式,旨在帮助开发者在保障信息安全的同时,充分利用日志进行系统分析。 1. **基于正则表达式的日志脱敏实现...

    log4j+slf4j实现 log4j测试代码,log4j+slf4j实现 log4j测试代码

    SLF4J是一个抽象层,为各种日志框架提供了统一的API,如Logback、Log4j等。它的主要优点在于可以让你在不修改代码的情况下更换底层的日志框架,只需改变类路径上的绑定即可。SLF4J提供了丰富的日志级别,如DEBUG、...

    slf4j+logback 于log4j+commons-logging大PK

    然而,随着时间的推移,Log4j的某些设计决策和性能问题使得开发者转向了更新的解决方案,比如Logback。Log4j的配置相对复杂,但其灵活性使其在许多项目中仍然占有一席之地。 Commons-Logging是Apache基金会的一个...

    struts+spring+mybatis+logback+easyui

    标题 "struts+spring+mybatis+logback+easyui" 暗示了这是一个基于Java的Web开发框架集成方案,常用于构建企业级应用。这个组合包括了四个主要组件和一个前端UI库: 1. **Struts**:Struts是Apache软件基金会的一个...

    log4j 和 logback配置资源

    在Java开发领域,日志记录是一项至关重要的任务,它帮助开发者追踪程序运行状态,...总的来说,Log4j和Logback是Java开发中不可或缺的工具,它们提供的日志解决方案对于优化代码质量和提高问题排查效率具有重大意义。

    浅谈spring boot 集成 log4j 解决与logback冲突的问题

    现在很流行springboot的开发,小编闲来无事也学了学,开发过程中遇见了log4j日志的一个小小问题,特此记载。 首先在pox.xml中引入对应的maven依赖: &lt;!-- 引入log4j--&gt; &lt;groupId&gt;org.springframework....

    log4j logback slf4j

    本文将深入探讨三个重要的Java日志框架——Log4j、Logback和SLF4J,并分析它们之间的关系和使用场景。 **Log4j** Log4j是Apache组织的一个开源项目,是Java世界中最先广泛使用的日志记录框架之一。它的核心功能...

    十个 log4j 转移到LogBack的理由

    LogBack 是一个日志框架,它是 Log4j 的后继者,由 Log4j 的创始人 Ceki Gülcü 与 Sébastien Pennec 共同创建。本文将探讨十个理由,解释为什么你应该从 log4j 迁移到 LogBack。 1. **性能提升**:LogBack 在...

    logback+slf4j打印工具类

    总结来说,"logback+slf4j打印工具类"是一种在Java项目中实现日志记录的有效方式,通过SLF4J的简洁API和Logback的强大功能,可以轻松地定制日志记录策略,例如每天生成一个日志文件。这种工具类的使用,不仅提高了...

    logback+slf4j使用

    以下是使用logback+slf4j自定义Appender的详细步骤: 1. **创建Appender类**:首先,你需要创建一个继承自`ch.qos.logback.core.AppenderBase&lt;ILoggingEvent&gt;`的类。在这个类中,你需要覆盖`append()`方法,该方法...

    SSM+Lucene+logback+Druid开发的开源博客系统

    SSM+Lucene+logback+Druid开发的Java开源博客系统源码 项目描述 网站面向有撰写博客习惯的用户,个人可注册成为网站用户(博主),在系统中创建自己的博文类别、标签,使用Markdown语法创作博文,创作好后将博文...

    logback+slf4j的JAR包和源码

    只要里面的logback-classic-1.1.7,logback-core-1.1.7,slf4j-api-1.7.21的JAR就可以打印出日志信息,而带有source表示对应的JAR包的源代码。可以要也可以不要

    Mybatis日志Log4j与Logback.pdf

    - Logback由Log4j的创始人创建,旨在解决Log4j的性能和并发问题,提供更好的性能和稳定性,因此Logback可以视为Log4j的升级版本。 **Slf4j的依赖**: - `logback-core`:这是Logback的核心组件,提供日志记录的基础...

    Logback+Slf4j,基于SpringBoot实现日志脱敏.zip

    《基于SpringBoot的日志脱敏:Logback与Slf4j的实战应用》 在现代的软件开发中,日志系统是不可或缺的一部分,它为开发者提供了系统运行时的详细信息,帮助排查问题,优化性能。SpringBoot框架以其简洁的配置和强大...

    linux平台centos7系统 - ELK+logback+kafka+nginx 搭建分布式日志分析平台.doc

    【Linux平台CentOS7系统 - ELK+logback+kafka+nginx搭建分布式日志分析平台】 在复杂的IT环境中,日志管理和分析对于诊断问题、优化性能以及确保系统稳定性至关重要。ELK栈(Elasticsearch、Logstash、Kibana)正是...

Global site tag (gtag.js) - Google Analytics