`
anyeeye
  • 浏览: 145504 次
  • 来自: ...
社区版块
存档分类
最新评论

根据petclinic项目手把手教你剖析SpringFramework源代码---日志篇

阅读更多
关键词:Spring,log4j

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


1.
<context-param>
        <param-name>webAppRootKey</param-name>
        <param-value>petclinic.root</param-value>
</context-param>

2.
<context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INFclasseslog4j.properties</param-value>
</context-param>


3.(该条目在petclinic中被注释掉了)
<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);再定位到该方法,方法很短:



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变量或者干脆换成别的绝对路径了。
分享到:
评论

相关推荐

    Spring框架的示例项目源码 Spring Petclinic

    **Spring框架的示例项目源码 - Spring Petclinic** Spring Petclinic是Spring官方提供的一款开源示例应用,它用于展示Spring框架的各种特性及其在实际开发中的应用。该项目可以帮助开发者理解和学习Spring框架的...

    spring-petclinic-rest-resolved

    REST版本的Spring PetClinic示例应用程序(spring-framework-petclinic扩展) Spring Petclinic应用程序的此后端版本仅提供REST API。 没有UI 。 是Angular前端应用程序,它使用了REST API。 通过一些图表了解...

    springframework-petclinic:Spring框架宠物诊所

    Spring Framework宠物诊所项目是一个经典的示例应用,它以一个模拟的宠物诊所管理软件为背景,全面展示了Spring Framework的核心特性与使用方法。这个项目不仅对于初学者理解Spring框架有极大的帮助,也是经验丰富的...

    spring-framework-reference-4.1.2

    3. New Features and Enhancements in Spring Framework 4.0 ............................................ 17 3.1. Improved Getting Started Experience .........................................................

    spring-petclinic-angular:Spring Petclinic示例应用程序的Angular 8版本(前端)

    Spring Petclinic的角形前端 警告:仅客户端。 从后端使用REST API在启动前端应用程序之前,您需要启动后端服务器。 屏幕截图 安装 按照描述将更新到最新版本(当前为8.0.3)。 npm uninstall -g angular-cli @...

    spring petclinic

    Spring PetClinic是Spring官方提供的一款开源示例应用,它主要用于展示Spring框架的核心特性及其在实际项目中的应用。这个项目不仅适用于初学者理解Spring的工作原理,也为有经验的开发者提供了一个实战的参考模板。...

    spring-petclinic-rest:Spring Petclinic示例应用程序的REST版本

    REST版本的Spring PetClinic示例应用程序(spring-framework-petclinic扩展) Spring Petclinic应用程序的此后端版本仅提供REST API。 没有UI 。 是使用REST API的Angular前端应用程序。 通过一些图表了解Spring ...

    Spring + Hibernate 例子(使用petclinic, 利用ant)

    总结来说,这个压缩包提供了一个集成Spring和Hibernate的实践项目——PetClinic,通过查看和运行源代码,学习者可以深入了解这两个框架的整合方式,包括Spring如何管理依赖,Hibernate如何映射和操作数据库,以及...

    spring-petclinic-angularjs:Spring Petclinic示例应用程序的AngularJS 1和Spring Boot 2版本

    Spring PetClinic示例应用程序的AngularJS和Spring Boot版本 通过一些图表了解Spring Petclinic应用程序 在本地运行诊所 git clone https://github.com/spring-petclinic/spring-petclinic-angularjs.git cd spring-...

    spring-petclinic:示例 Spring Petclinic 项目

    然后您可以在此处访问 petclinic: 如果您发现 Spring Petclinic 的错误/建议改进我们的问题跟踪器可以在这里找到: : 在 Eclipse/STS 中使用 Petclinic先决条件您的系统中应安装以下项目: Maven 3 ( ) git 命令行...

    spring-petclinic-master

    SpringPetClinic样品申请通过一些图表了解Spring Petclinic应用程序在本地运行诊所git clone https://github.com/spring-projects/spring-petclinic.gitcd spring-petclinic./mvnw spring-boot:run 然后,您可以在...

    compass PetClinic 项目源码及工程

    综上所述,compass PetClinic项目是一个全面展示Spring生态的优秀示例,通过对源码的分析和实践,开发者不仅可以掌握Java Web开发的基本技能,还能进一步提升在微服务架构、数据库设计和持续集成等方面的素养。

    spring-framework-petclinic:一个基于JSP,Spring MVC,Spring Data JPA,Hibernate和JDBC的Spring框架应用程序

    SpringPetClinic样品申请 该由Spring团队批准,是。 它允许Spring社区使用简单的旧Spring Framework配置和3层...git clone https://github.com/spring-petclinic/spring-framework-petclinic.git cd spring-framewor

    spring-petclinic-data-jdbc:Spring Boot Petclinic的Spring Data JDBC版本

    使用Spring Data JDBC构建的Spring PetClinic示例应用程序 这是官方应用程序的一个分支,该应用程序具有使用而非构建的域和持久层。 另外: 使用在集成测试期间启动MySQL 使用进行监视检查原始项目以了解项目简介,...

    spring-petclinic:一个基于Spring的示例应用程序

    通过一些图表了解Spring Petclinic应用程序 在本地运行诊所 Petclinic是使用构建的应用程序。 您可以构建一个jar文件并从命令行运行它: git clone https://github.com/spring-projects/spring-petclinic.git cd ...

    Angular-spring-petclinic-angular.zip

    Angular-spring-petclinic-angular.zip,Angular 8版Spring Petclinic示例应用程序(前端)Spring Petclinic Angular,Angularjs于2016年发布,是Angularjs的重写版。它专注于良好的移动开发、模块化和改进的依赖注入...

    spring-pet-clinic:SpringFramework宠物诊所

    《Spring Framework宠物诊所项目详解》 Spring Framework是Java开发领域中的一个重量级框架,它以其强大的功能和灵活性深受开发者喜爱。在"Spring Pet Clinic"项目中,我们可以深入学习和理解Spring Framework的...

    spring petclinic project

    《Spring PetClinic项目详解:领略Spring框架与Java后端开发的魅力》 Spring PetClinic项目是Spring官方推出的一个小型示例应用,旨在帮助开发者更好地理解和掌握Spring框架的核心功能和特性。这个项目不仅是一个...

    spring-petclinic-microservices:使用Spring Cloud构建的Spring Petclinic的分布式版本

    使用Spring Cloud构建的Spring PetClinic示例应用程序的分布式版本 该微服务分支最初源自以演示如何将示例Spring应用程序拆分为。 为了实现该目标,我们使用了技术堆栈中的Spring Cloud Gateway,Spring Cloud ...

    spring-petclinic-rest-vet

    本项目"spring-petclinic-rest-vet"是Spring PetClinic的一个扩展,它展示了如何利用Spring Boot和RESTful API技术构建一个关于兽医服务的应用。这篇文章将深入探讨这个项目的实现细节和技术要点。 首先,Spring ...

Global site tag (gtag.js) - Google Analytics