之前说过使用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四个关键组件。让我们逐一深入理解这些技术及其在项目中的应用。 1. Maven: Maven是Java项目管理工具,它负责构建、依赖管理和...
本文主要介绍的技术:(大神绕过) MAVEN搭建JAVA-WEB项目 Spring的配置文件 ...Log4j控制输出,主要介绍扩展方式写日志进数据库的方式 代码注释的规范,和一些MyEclipse的规范操作(个人觉得规范的)
Spring + SpringMVC + Myibatis + Druid 整合源码,修改log4j.properties中log4j.appender.A1.File=YOUR-LOG-PATH,log4j.appender.FILE.File=YOUR-LOG-FILE
此外,项目可能还包括其他组件和配置,例如日志记录(如Log4j或Logback)、单元测试(JUnit和Mockito)、异常处理(Spring的`@ExceptionHandler`)、国际化支持(`ResourceBundle`和`MessageSource`),以及Spring的...
- 其他可能用到的jar包:如`log4j`, `slf4j`, `c3p0`(连接池), `druid`(连接池)等。 #### 二、配置文件详解 **2.1 web.xml** `web.xml`文件位于`WEB-INF`目录下,它是Web应用的部署描述符。该文件用于配置过滤器、...
- 更新pom.xml文件,添加Spring、SpringMVC、MyBatis以及相关依赖库,例如:MySQL驱动、SLF4J、Log4j等。 8. **MyBatis配置** - 编写MyBatis的Mapper接口和XML配置文件,定义SQL语句。 9. **业务逻辑层** - ...
本文将深入探讨如何使用SpringMVC和Maven来实现一个Restful服务的源码,以及这两个工具各自的功能和优势。 首先,让我们了解一下SpringMVC。SpringMVC是Spring框架的一部分,专门用于构建Web应用程序。它采用模型-...
7. **错误处理与日志记录**:为了保证系统的稳定性和可维护性,示例项目可能会包含错误处理机制(如异常捕获和自定义错误页面)和日志记录(如使用Log4j或SLF4J)。这些功能可以帮助开发者追踪和调试问题,同时提供...
6. 日志管理:系统操作的日志记录,便于问题追踪和审计,通常会使用如Log4j或SLF4J等日志框架。 要深入理解和利用这个源码,开发者需要具备扎实的Java基础,熟悉SpringMVC框架,了解数据库设计和操作,以及基本的...
日志管理:SLF4J、LOGBACKUP 工具类:Apache Commons、FastJson、EASYPOI、BladeToolBox 2、前端 JS框架:jQuery CSS框架:Twitter Bootstrap 客户端验证:JQuery-html5Validate 富文本:KindEcitor 数据...
本资源包含的是关于`SpringMVC`、`Log4j2`、`Logback`以及`Jackson`的日志脱敏实现源码,提供了多种实现方式,旨在帮助开发者在保障信息安全的同时,充分利用日志进行系统分析。 1. **基于正则表达式的日志脱敏实现...
花了我一天半学着写着 ....4. log4j log4j的格式都是一样的 写好一个 以后都通用了 5.spring_mybatis.xml里配置问题 有的时候它明明没有错 但是 就是说错了 你就clear一下项目 或者关闭再打开项目 就好了 .
SpringMvc+Spring+Mybatis+Log4j+JUnit单元测试+ajax前后端分离。eclipse项目源码。传统web项目。多层架构(每层都使用包扫描或者通配的形式以简化开发时的配置量)。自配数据库地址,并修改查询语句即可用(spring....
SpringMvc+Spring+Mybatis+Log4j+JUnit单元测试。eclipse项目源码。传统web项目。五层架构(每层都使用包扫描或者通配的形式以简化开发时的配置量)。自配数据库地址,并修改查询语句即可用(spring.xml中的数据源)...
| Log4J | 日志组件 | | Fastjson |JSON处理器| | Maven | 项目构建管理 | | dubbo|分布式服务框架| 系统功能 | **序号** | **功能** | **是否完成**| | ------------- |:-------------:| -------------:| |0.|...
<log4j.version>1.2.17</log4j.version> <!-- Spring 相关依赖 --> <groupId>org.springframework <artifactId>spring-context ${spring.version} <groupId>org.springframework <artifactId>...
《log4j2在SpringMVC工程中的应用详解》 在现代Java开发中,日志系统扮演着至关重要的角色,它能帮助开发者追踪程序运行状态,定位错误,优化性能。Log4j2作为Apache的一个开源项目,是Log4j的升级版本,提供了更...
4. **日志配置**:引入log4j和SLF4J的依赖,配置log4j.properties或log4j.xml,定义日志级别、输出格式和目的地。 5. **数据库准备**:如`lhb_test.sql`,导入数据库脚本,建立所需的表结构和初始数据。 6. **业务...
IDEA版整合ssm(Spring+SpringMVC+Mybatis)框架,学生增删改查基础项目。附带源码的log4j
基于Java使用Spring+SpringMVC+Mybatis框架的供应链客户关系管理系统,包含log4j,JUINT等等框架集合,系统配置表,城市表,包含四千多个城市,县区信息,功能全面丰富,实现数据庞大。包含系统说明文档,用户使用...