`

Apache Log4J

阅读更多

转自:http://eoasis.iteye.com/blog/644290

 

webroot

 

 

Web app root system property already set to different value: 'webapp.root'

文章分类:Java编程

在web.xml有几个条目和log4j有关,它们是:

1.

Xml代码 复制代码
  1. <context-param>    
  2.   
  3.         <param-name>webAppRootKey</param-name>    
  4.   
  5.         <param-value>petclinic.root</param-value>    
  6.   
  7. </context-param>   
<context-param> 

        <param-name>webAppRootKey</param-name> 

        <param-value>petclinic.root</param-value> 

</context-param> 

 
2.

Xml代码 复制代码
  1. <context-param>    
  2.   
  3.         <param-name>log4jConfigLocation</param-name>    
  4.   
  5.         <param-value>/WEB-INFclasseslog4j.properties</param-value>    
  6.   
  7. </context-param>   
<context-param> 

        <param-name>log4jConfigLocation</param-name> 

        <param-value>/WEB-INFclasseslog4j.properties</param-value> 

</context-param> 

 

3.(该条目在petclinic中被注释掉了)

Xml代码 复制代码
  1. <listener>    
  2.   
  3.    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>    
  4.   
  5. </listener>  
<listener> 

   <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 

</listener>

 

我们知道,在web-application中使用log4j,有很多配置方式:
a.
用servlet或者ServletContextListener对log4j做配置。通常,你不需要亲自编写servlet或者 listener,比如直接利用log4j的com.apache.jakarta.log4j.Log4jInit类,Spring的 org.springframework.web.util.Log4jConfigServlet和 org.springframework.web.util.Se
rvletContextListener,这种方式配置灵活,可以通过参数条目自行指定log4j.properties的位置。

b.
把log4j 的默认配置文件(log4j.properties)放在classpath中,通常是/web-inf/classes目录下.这种方式是log4j的 默认配置方式,无须其他配置。缺点就是无法灵活的通过配置文件来指定log4j.properties的文件位置。在我们的petclinic项目中,因 为listener条目被注释,所以采用的也是这种缺省方式。


现在我们考虑listener条目没有被注释的情况,这种情况和注册Log4jConfigServlet的目的是一样的,只是必须在支持listener的servlet container中使用。

 

  找到.Log4jConfigServlet和ServletContextListener的源码,他们都在适当的地方 (callback method)调用了Log4jWebConfigurer.initLogging(getServletContext()); 定位到这个方法,第一句就是:WebUtils.setWebAppRootSystemProperty(servletContext);再定位到该方法,方法很短:

 

Java代码 复制代码
  1. public static void setWebAppRootSystemProperty(ServletContext servletContext) throws IllegalStateException {    
  2.   
  3.         String param = servletContext.getInitParameter(WEB_APP_ROOT_KEY_PARAM);    
  4.   
  5.         String key = (param != null ? param : DEFAULT_WEB_APP_ROOT_KEY);    
  6.   
  7.         String oldValue = System.getProperty(key);    
  8.   
  9.         if (oldValue != null) {    
  10.   
  11.             throw new IllegalStateException("WARNING: Web app root system property already set: " + key + " = " +    
  12.   
  13.             oldValue + " - Choose unique webAppRootKey values in your web.xml files!");    
  14.   
  15.         }    
  16.   
  17.         String root = servletContext.getRealPath("/");    
  18.   
  19.         if (root == null) {    
  20.   
  21.             throw new IllegalStateException("Cannot set web app root system property when WAR file is not     
  22.   
  23. expanded");    
  24.   
  25.         }    
  26.   
  27.         System.setProperty(key, root);    
  28.   
  29.         servletContext.log("Set web app root system property: " + key + " = " + root);    
  30.   
  31.     }   
public static void setWebAppRootSystemProperty(ServletContext servletContext) throws IllegalStateException { 

        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) { 

            throw new IllegalStateException("WARNING: Web app root system property already set: " + key + " = " + 

            oldValue + " - Choose unique webAppRootKey values in your web.xml files!"); 

        } 

        String root = servletContext.getRealPath("/"); 

        if (root == null) { 

            throw new IllegalStateException("Cannot set web app root system property when WAR file is not  

expanded"); 

        } 

        System.setProperty(key, root); 

        servletContext.log("Set web app root system property: " + key + " = " + root); 

    } 

 
      从代码看出,该方法其实就是把该web application的根目录的绝对文件路径作为属性保存在 System的属性列表中。该属性的名字,由web.xml文件中的名为"webAppRootKey"的参数值指出。如果不在web.xml中定义 webAppRootKey参数,那么属性名就是缺省的"webapp.root".在我们的petclinic项目中已经定义了 webAppRootKey参数,其值为"petclinic.root",因此,属性的名字就是"petclinic.root".

 

      再回到Log4jWebConfigurer.initLogging(getServletContext()),接下来的行为是从web.xml中获取 log4jConfigLocation和log4jRefreshInterval.前者指出log4j配置文件(有可能是xml格式)的位置和名字, 后者则指出重新都取配置文件的时间间隔.然后调用Log4jConfigurer.initLogging()方法对log4j做配置。

      从Log4jConfigurer.initLogging()方法我们可以看到,针对不同格式的配置文件(properties或者xml), Log4jConfigurer采用不同的lo4j configurator类做配置,例如DOMConfigurator或者 PropertyConfigurator。

至此,关于petclinic中关于log4j的配置,我们已经基本上弄清楚了。

      可是System对象中的petclinic.root属性在什么时候使用呢?在web-inf/classes下面的log4j.properties文件中,有这么一句:log4j.appender.logfile.File=${petclinic.root}/WEB-INF/petclinic.log
      这样,我们就用上了petclinic.root属性了。从上面的分析可知,如果你不在web.xml中定义webAppRootKey参数,那么你就得把 log4j.appender.logfile.File=${petclinic.root}/WEB-INF/petclinic.log中的petclinic.root变量改为webapp.root变量或者干脆换成别的绝对路径了。

分享到:
评论

相关推荐

    Apache Log4j 2 (apache-log4j-2.17.1-bin.zip)

    Apache Log4j 2 (apache-log4j-2.17.1-bin.zip)是对 Log4j 的升级,它比其前身 Log4j 1.x 提供了重大改进,并提供了 Logback 中可用的许多改进,同时修复了 Logback 架构中的一些固有问题。修复了安全漏洞 CVE-...

    Apache Log4j2紧急缓解措施.docx

    Apache Log4j2 紧急缓解措施 Apache Log4j2 是一个流行的 Java 日志记录工具,但最近出现了严重的安全漏洞, Apache Log4j2 紧急缓解措施旨在帮助开发者尽快修复该漏洞,避免攻击者的攻击。 一、修改启动脚本 在...

    Apache Log4j2 远程代码执行漏洞检测工具

    Apache Log4j2 是一个广泛使用的Java日志框架,它为开发者提供了强大的日志记录功能。然而,在2021年12月初,一个严重的安全漏洞(CVE-2021-44228)被公开,这个漏洞被称为"Log4Shell",允许攻击者通过注入恶意的...

    Apache Log4j 2 (apache-log4j-2.17.1-bin.tar.gz)

    Apache Log4j 2 (apache-log4j-2.17.1-bin.tar.gz)是对 Log4j 的升级,它比其前身 Log4j 1.x 提供了重大改进,并提供了 Logback 中可用的许多改进,同时修复了 Logback 架构中的一些固有问题。修复了安全漏洞 CVE-...

    Pro Apache Log4j Second Edition .pdf

    总的来说,《Pro Apache Log4j 第二版》是一本全面介绍Apache Log4j的强大工具书,不仅包含了Log4j的基本操作,还深入探讨了高级用法和技术细节,对于希望充分利用Log4j的开发者来说是一本不可或缺的参考书。

    Apache Log4j 远程代码执行漏洞(CVE-2021-44832)

    Apache Log4j 是一个广泛使用的 Java 日志框架,它允许应用程序记录各种运行时信息,包括错误、警告和其他诊断数据。然而,2021 年底,Log4j 发现了一个严重的安全漏洞,被称为 CVE-2021-44228(也称为 Log4Shell)...

    Pro Apache Log4j second edition

    根据提供的信息,我们可以深入探讨《Pro Apache Log4j 第二版》这本书的相关知识点。此书由Samudra Gupta编写,并于2005年出版,是关于Apache Log4j的一个专业指南。 ### 一、Apache Log4j简介 Apache Log4j是一个...

    ApacheLog4j_Win.zip

    标题中的"ApacheLog4j_Win.zip"暗示这是一个针对Windows操作系统的Apache Log4j漏洞验证工具。这意味着该压缩包可能包含一系列用于检测和测试Log4j 2安全漏洞的工具和脚本,特别是针对JNDI(Java Naming and ...

    Apache Log4j_1.2.17 完整依赖包

    Apache Log4j_1.2.17 完整依赖包,在jdk1.8.201中测试通过。使用教程https://www.tutorialspoint.com/springmvc/springmvc_log4j.htm

    apache-log4j-1.2.16.rar_apache log4j 1.2.16_log4j source code_lo

    Apache Log4j是Java平台上的一个著名日志记录框架,广泛应用于各种Java应用程序中,包括服务器、Web应用、企业级软件等。Log4j 1.2.16是该框架的一个版本,提供了丰富的日志功能,允许开发者灵活地控制日志信息的...

    apache log4j使用大全

    Apache Log4j 是一个广泛使用的开源日志框架,它为Java应用程序提供了强大的日志记录功能。Log4j 的主要优点在于它的灵活性和可配置性,允许开发者根据需要调整日志的输出目的地、格式以及级别。 **配置Log4j** ...

    Apache Log4j 2代码漏洞处置指南及检测工具.zip

    Apache Log4j 2存在远程代码执行漏洞处置指南 及期检测工具

    apache log4j 日志系统实现原理.doc

    Apache Log4j 是一个广泛使用的Java日志框架,它的核心功能是记录应用程序中的事件和错误信息,便于跟踪问题、分析性能以及调试。Log4j 提供了一种灵活、高效的日志记录机制,允许开发者定制日志输出的方式、位置和...

    解决Apache Log4j 远程代码执行漏洞log4j2部分jar

    解决Apache Log4j 远程代码执行漏洞log4j2部分jar,包含log4j-1.2-api-2.15.0.jar,log4j-api-2.15.0.jar,log4j-core-2.15.0.jar,log4j-to-slf4j-2.15.0.jar

    Apache Log4j 2 源代码( apache-log4j-2.17.1-src.tar.gz)

    Apache Log4j 2 源代码( apache-log4j-2.17.1-src.tar.gz) 是对 Log4j 的升级,它比其前身 Log4j 1.x 提供了重大改进,并提供了 Logback 中可用的许多改进,同时修复了 Logback 架构中的一些固有问题。修复了安全...

    apache-log4j-2.0

    Apache Log4j 2.0 发布第 4 个 Beta 版本,包括的新特性有: o Added Log4j 2 to SLF4J adapter. o LOG4J2-131: Add SMTPAppender. Thanks to Scott Severtson. o Added hostName and contextName to property ...

    Apache Log4j 2 源代码( apache-log4j-2.17.1-src.zip)

    Apache Log4j 2 源代码( apache-log4j-2.17.1-src.zip) 是对 Log4j 的升级,它比其前身 Log4j 1.x 提供了重大改进,并提供了 Logback 中可用的许多改进,同时修复了 Logback 架构中的一些固有问题。修复了安全漏洞...

    apache-log4j-2.17.0-bin.tar.gz

    Apache Log4j是Java平台上的一个著名日志记录框架,广泛应用于各种企业级软件系统中。这个"apache-log4j-2.17.0-bin.tar.gz"文件是一个压缩包,其中包含了Log4j 2.17.0版本的二进制文件,通常包括可执行的JAR文件和...

    apache-log4j-2.17.2-bin.tar

    Apache Log4j 2.17.2 是一个重要的安全更新版本,主要针对先前发现的严重漏洞进行修复。Log4j 是 Apache 组织开发的一个广泛使用的Java日志框架,它允许开发者在应用程序中实现灵活的日志记录。此次发布的binaries...

    apache-log4j-2.8.2-bin.tar

    Apache Log4j 是一个广泛使用的Java日志框架,它的版本2.8.2是一个重要的更新,提供了许多功能改进和安全修复。这个压缩包文件“apache-log4j-2.8.2-bin.tar”包含了Log4j 2.8.2的二进制发行版,适用于那些希望快速...

Global site tag (gtag.js) - Google Analytics