`
Notebookdong
  • 浏览: 122332 次
社区版块
存档分类
最新评论

springMVC+log4j源码简单分析

 
阅读更多

之前说过使用Spring做web项目时,及时不在web.xml中定义log4j.xml的路径,在实际仍可以正确运行,下面将根据源码来简单分析一下:

1.web.xml配置如下:

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<servlet>
		<servlet-name>maven</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	</servlet>

	<servlet-mapping>
		<servlet-name>maven</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
</web-app>

 2.将log4j.xml文件放在web-inf/classes下:

 

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

	<!-- Appenders -->
	
	<appender name="files" class="org.apache.log4j.DailyRollingFileAppender">
		<param name="File" value="${catalina.base}/logs/mytest.log"/>
		<param name="DatePattern" value="'.'yyyy-MM-dd'.log'"/>
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss SSS\} %-5p] [%t] %c{3\} - %m%n"/>
		</layout>
	</appender>
	
	<appender name="console" class="org.apache.log4j.ConsoleAppender">
		<param name="Target" value="System.out" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss SSSS\} %-5p] [%t] %c{3\} - %m%n" />
		</layout>
	</appender>
	
	<!-- Application Loggers -->
	<logger name="org.springframework.samples.mvc">
		<level value="info" />
		<appender-ref ref="files"/>
	</logger>
	
	<logger name="com.zxhz.maventest">
		<level value="info" />
		<appender-ref ref="files"/>
	</logger>
	
	<!-- 3rdparty Loggers -->
	<logger name="org.springframework.core">
		<level value="info" />
		<appender-ref ref="files"/>
	</logger>
	
	<logger name="org.springframework.beans">
		<level value="info" />
		<appender-ref ref="files"/>
	</logger>
	
	<logger name="org.springframework.context">
		<level value="info" />
		<appender-ref ref="files"/>
	</logger>

	<logger name="org.springframework.http">
		<level value="debug" />
		<appender-ref ref="files"/>
	</logger>

	<logger name="org.springframework.web">
		<level value="debug" />
		<appender-ref ref="files"/>
	</logger>

	<!-- Root Logger -->
	<root>
		<priority value="warn" />
		<appender-ref ref="console" />
	</root>
	
</log4j:configuration>

 3.开始分析过程:

 

  当启动Tomcat的时候,Tomcat会读取web.xml配置文件,根据配置文件加载数据从web.xml文件中我们可以看到Tomcat会先加载

 

<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

 这个<listener>将会被先运行。再ContextLoaderListener.java这个类里我们可以看到:

package org.springframework.web.context;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ContextLoaderListener extends ContextLoader implements ServletContextListener {

	private ContextLoader contextLoader;


	/**
	 * Initialize the root web application context.
	 */
	public void contextInitialized(ServletContextEvent event) {
		this.contextLoader = createContextLoader();
		if (this.contextLoader == null) {
			this.contextLoader = this;
		}
		this.contextLoader.initWebApplicationContext(event.getServletContext());
	}

	//......

}

 首先这里会先运行contextInitialized()对其进行初始化操作并且会调用contextLoader的initWebApplicationContext方法并且在initWebApplicationContext方法中会创建一个logger

public WebApplicationContext initWebApplicationContext(ServletContext servletContext) {
		if (servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null) {
			throw new IllegalStateException(
					"Cannot initialize context because there is already a root application context present - " +
					"check whether you have multiple ContextLoader* definitions in your web.xml!");
		}

		Log logger = LogFactory.getLog(ContextLoader.class);//初始化log
		servletContext.log("Initializing Spring root WebApplicationContext");
		if (logger.isInfoEnabled()) {
			logger.info("Root WebApplicationContext: initialization started");
		}
		long startTime = System.currentTimeMillis();

		try {
//........略1000字。。。。

 当执行

Log logger = LogFactory.getLog(ContextLoader.class);

 的时候会去调用会去找到LogFactory.getLog方法最终这个方法会通过LogManager类中的静态代码块去调用到Log4j中的Loader.class中的方法完成Log4j的初始化:

static {
      /***
       *  ..........
       */
      // if the user has not specified the log4j.configuration
      // property, we search first for the file "log4j.xml" and then
      // "log4j.properties"
      if(configurationOptionStr == null) {	
	url = Loader.getResource(DEFAULT_XML_CONFIGURATION_FILE);
	if(url == null) {
	  url = Loader.getResource(DEFAULT_CONFIGURATION_FILE);
	}
      } else {
	try {
	  url = new URL(configurationOptionStr);
	} catch (MalformedURLException ex) {
	  // so, resource is not a URL:
	  // attempt to get the resource from the class path
	  url = Loader.getResource(configurationOptionStr); 
	}	
      }
      
      // If we have a non-null url, then delegate the rest of the
      // configuration to the OptionConverter.selectAndConfigure
      // method.
      if(url != null) {
	    LogLog.debug("Using URL ["+url+"] for automatic log4j configuration.");
        try {
            OptionConverter.selectAndConfigure(url, configuratorClassName,
					   LogManager.getLoggerRepository());
        } catch (NoClassDefFoundError e) {
            LogLog.warn("Error during default initialization", e);
        }
      } else {
	    LogLog.debug("Could not find resource: ["+configurationOptionStr+"].");
      }
    } else {
        LogLog.debug("Default initialization of overridden by " + 
            DEFAULT_INIT_OVERRIDE_KEY + "property."); 
    }  
  } 

 Loader.getResource

static public URL getResource(String resource) {
    ClassLoader classLoader = null;
    URL url = null;
    
    try {
  	if(!java1 && !ignoreTCL) {
  	  classLoader = getTCL();
  	  if(classLoader != null) {
  	    LogLog.debug("Trying to find ["+resource+"] using context classloader "
  			 +classLoader+".");
  	    url = classLoader.getResource(resource);      
  	    if(url != null) {
  	      return url;
  	    }
  	  }
  	}

 这就是为什么我们不在web.xml中定义log4j.xml的配置文件同样也可以正常的使用的原因了

 

分享到:
评论

相关推荐

    java源码 maven+springmvc+mybatis+log4j 入门级示例 2018127

    这是一个基于Java技术栈的入门级项目,主要涵盖了Maven、SpringMVC、MyBatis和Log4j四个关键组件。让我们逐一深入理解这些技术及其在项目中的应用。 1. Maven: Maven是Java项目管理工具,它负责构建、依赖管理和...

    MAVEN整合Spring+SpringMVC+Mybatis源码

    本文主要介绍的技术:(大神绕过) MAVEN搭建JAVA-WEB项目 Spring的配置文件 ...Log4j控制输出,主要介绍扩展方式写日志进数据库的方式 代码注释的规范,和一些MyEclipse的规范操作(个人觉得规范的)

    Spring + SpringMVC + Myibatis + Druid 整合源码

    Spring + SpringMVC + Myibatis + Druid 整合源码,修改log4j.properties中log4j.appender.A1.File=YOUR-LOG-PATH,log4j.appender.FILE.File=YOUR-LOG-FILE

    springMVC+mybatis+mysql项目源码

    此外,项目可能还包括其他组件和配置,例如日志记录(如Log4j或Logback)、单元测试(JUnit和Mockito)、异常处理(Spring的`@ExceptionHandler`)、国际化支持(`ResourceBundle`和`MessageSource`),以及Spring的...

    springmvc+mybatis+oracle

    - 其他可能用到的jar包:如`log4j`, `slf4j`, `c3p0`(连接池), `druid`(连接池)等。 #### 二、配置文件详解 **2.1 web.xml** `web.xml`文件位于`WEB-INF`目录下,它是Web应用的部署描述符。该文件用于配置过滤器、...

    SSM框架-详细整合教程(Spring+SpringMVC+MyBatis).pdf

    - 更新pom.xml文件,添加Spring、SpringMVC、MyBatis以及相关依赖库,例如:MySQL驱动、SLF4J、Log4j等。 8. **MyBatis配置** - 编写MyBatis的Mapper接口和XML配置文件,定义SQL语句。 9. **业务逻辑层** - ...

    SpringMVC+Maven实现Restful源码

    本文将深入探讨如何使用SpringMVC和Maven来实现一个Restful服务的源码,以及这两个工具各自的功能和优势。 首先,让我们了解一下SpringMVC。SpringMVC是Spring框架的一部分,专门用于构建Web应用程序。它采用模型-...

    SpringMVC+Mybatis+SqlServer 增删改查上传下载示例

    7. **错误处理与日志记录**:为了保证系统的稳定性和可维护性,示例项目可能会包含错误处理机制(如异常捕获和自定义错误页面)和日志记录(如使用Log4j或SLF4J)。这些功能可以帮助开发者追踪和调试问题,同时提供...

    springmvc+权限管理系统Java源码

    6. 日志管理:系统操作的日志记录,便于问题追踪和审计,通常会使用如Log4j或SLF4J等日志框架。 要深入理解和利用这个源码,开发者需要具备扎实的Java基础,熟悉SpringMVC框架,了解数据库设计和操作,以及基本的...

    Spring+SpringMVC+Ehcache+Shiro+BootStrap企业级开发平台

    日志管理:SLF4J、LOGBACKUP 工具类:Apache Commons、FastJson、EASYPOI、BladeToolBox 2、前端 JS框架:jQuery CSS框架:Twitter Bootstrap 客户端验证:JQuery-html5Validate 富文本:KindEcitor 数据...

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

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

    SpringMvc+Spring+Mybatis+Maven整合 源码

    花了我一天半学着写着 ....4. log4j log4j的格式都是一样的 写好一个 以后都通用了 5.spring_mybatis.xml里配置问题 有的时候它明明没有错 但是 就是说错了 你就clear一下项目 或者关闭再打开项目 就好了 .

    ssm+log4j+JUnit+ajax

    SpringMvc+Spring+Mybatis+Log4j+JUnit单元测试+ajax前后端分离。eclipse项目源码。传统web项目。多层架构(每层都使用包扫描或者通配的形式以简化开发时的配置量)。自配数据库地址,并修改查询语句即可用(spring....

    ssm五层架构+log4j+JUnit+通配

    SpringMvc+Spring+Mybatis+Log4j+JUnit单元测试。eclipse项目源码。传统web项目。五层架构(每层都使用包扫描或者通配的形式以简化开发时的配置量)。自配数据库地址,并修改查询语句即可用(spring.xml中的数据源)...

    基于SpringBoot+Spring+SpringMvc+Mybatis开发分布式REST服务源码+数据库+项目说明.zip

    | Log4J | 日志组件 | | Fastjson |JSON处理器| | Maven | 项目构建管理 | | dubbo|分布式服务框架| 系统功能 | **序号** | **功能** | **是否完成**| | ------------- |:-------------:| -------------:| |0.|...

    springmvc+spring+mybatis+Maven+mysql环境搭建,附源码

    &lt;log4j.version&gt;1.2.17&lt;/log4j.version&gt; &lt;!-- Spring 相关依赖 --&gt; &lt;groupId&gt;org.springframework &lt;artifactId&gt;spring-context ${spring.version} &lt;groupId&gt;org.springframework &lt;artifactId&gt;...

    log4j2在SpringMVC工程中的运用

    《log4j2在SpringMVC工程中的应用详解》 在现代Java开发中,日志系统扮演着至关重要的角色,它能帮助开发者追踪程序运行状态,定位错误,优化性能。Log4j2作为Apache的一个开源项目,是Log4j的升级版本,提供了更...

    Spring+SpringMVC+Mybatis整合

    4. **日志配置**:引入log4j和SLF4J的依赖,配置log4j.properties或log4j.xml,定义日志级别、输出格式和目的地。 5. **数据库准备**:如`lhb_test.sql`,导入数据库脚本,建立所需的表结构和初始数据。 6. **业务...

    log4j.properties

    IDEA版整合ssm(Spring+SpringMVC+Mybatis)框架,学生增删改查基础项目。附带源码的log4j

    基于Java使用Spring+SpringMVC+Mybatis框架的供应链客户关系管理系统

    基于Java使用Spring+SpringMVC+Mybatis框架的供应链客户关系管理系统,包含log4j,JUINT等等框架集合,系统配置表,城市表,包含四千多个城市,县区信息,功能全面丰富,实现数据庞大。包含系统说明文档,用户使用...

Global site tag (gtag.js) - Google Analytics