`

java web开发中的日志的配置与原理

 
阅读更多

1. 在web.xml中需要配置一个日志配置监听类Log4jConfigListener,这样在服务器启动时就是读取和初始化的日志文件:

 

  <!--日志-->
	<context-param>
	   <param-name>log4jConfigLocation</param-name>
	   <param-value>WEB-INF/log4j.xml

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

 

  2.  在类中通过一个工厂方法得到一个Log对象:

   比如:

  private static final Log LOGGER = LogFactory.getLog("system");// 日志

  3. 在上面配置的log4j.xml中配置:

 

       <logger name="system" >
        <level value="${logginglevel
}"/>
        <appender-ref
 ref
="system"/>
    </logger>   

	<appender 
name="system" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="${loggingRoot
}/system.log"/>
		<param name="append" value="false"/>
		<param name="encoding" value="GB2312"/>
		<layout 
class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d [%X{requestURIWithQueryString}] %-5p %c{2} - %m%n"/>
		</layout>
    </appender>    

      其中的配置变量在antx.properties中配置和获取。

 

原理:其实就是通过在jboss或comcat的服务器启动的时候,会执行监听类Log4jConfigListener中的初始化方法(??),这个监听类在web.xml中要在ContextLoaderListener之前配置:

 

/**
 * Bootstrap listener for custom log4j initialization in a web environment.

 * Delegates to {@link Log4jWebConfigurer} (see its javadoc for configuration details).
 *
 * <b>WARNING: Assumes an expanded WAR file</b>, both for loading the configuration
 * file and for writing the log files. If you want to keep your WAR unexpanded or
 * don't need application-specific log files within the WAR directory, don't use
 * log4j setup within the application (thus, don't use Log4jConfigListener or
 * Log4jConfigServlet). Instead, use a global, VM-wide log4j setup (for example,
 * in JBoss) or JDK 1.4's <code>java.util.logging</code> (which is global too).
 *
 * <p>This listener should be registered before ContextLoaderListener in <code>web.xml</code>
 * when using custom log4j initialization.

 *
 * @author Juergen Hoeller
 * @since 13.03.2003
 * @see Log4jWebConfigurer
 * @see org.springframework.web.context.ContextLoaderListener
 * @see WebAppRootListener
 */
public class Log4jConfigListener implements ServletContextListener {

	public void contextInitialized(ServletContextEvent event) {
		Log4jWebConfigurer.initLogging(event.getServletContext());
	}
。。
}
 

 然后调用Log4jWebConfigurer的initLogging(。。)方法:

 

	/** Parameter specifying the location of the log4j config file
 */
	public static final String CONFIG_LOCATION_PARAM = "log4jConfigLocation";

	/** Parameter specifying the refresh interval for checking the log4j config file */
	public static final String REFRESH_INTERVAL_PARAM = "log4jRefreshInterval";

	/** Parameter specifying whether to expose the web app root system property */
	public static final String EXPOSE_WEB_APP_ROOT_PARAM = "log4jExposeWebAppRoot";

/**
	 * Initialize log4j, including setting the web app root system property.

	 * @param servletContext the current ServletContext
	 * @see WebUtils#setWebAppRootSystemProperty
	 */
	public static void initLogging(ServletContext servletContext) {
		// Expose the web app root system property.
		if (exposeWebAppRoot(servletContext)) {
			WebUtils.setWebAppRootSystemProperty(servletContext);
		}

		// Only perform custom log4j initialization in case of a config file.
		String location = servletContext.getInitParameter(CONFIG_LOCATION_PARAM);
		if (location != null) {
			// Perform actual log4j initialization; else rely on log4j's default initialization.
			try {
				// Return a URL (e.g. "classpath:" or "file:") as-is;
				// consider a plain file path as relative to the web application root directory.
				if (!ResourceUtils.isUrl(location)) {
					// Resolve system property placeholders before resolving real path.
					location = SystemPropertyUtils.resolvePlaceholders(location);
					location = WebUtils.getRealPath(servletContext, location);
				}

				// Write log message to server log.
				servletContext.log("Initializing log4j from [" + location + "]"
);

				// Check whether refresh interval was specified.
				String intervalString = servletContext.getInitParameter(REFRESH_INTERVAL_PARAM);
				if (intervalString != null) {
					// Initialize with refresh interval, i.e. with log4j's watchdog thread,
					// checking the file in the background.
					try {
						long refreshInterval = Long.parseLong(intervalString);
						Log4jConfigurer.initLogging
(location, refreshInterval);
					}
					catch (NumberFormatException ex) {
						throw new IllegalArgumentException("Invalid 'log4jRefreshInterval' parameter: " + ex.getMessage());
					}
				}
				else {
					// Initialize without refresh check, i.e. without log4j's watchdog thread.
					Log4jConfigurer.initLogging(location);
				}
			}
			catch (FileNotFoundException ex) {
				throw new IllegalArgumentException("Invalid 'log4jConfigLocation' parameter: " + ex.getMessage());
			}
		}
	}

  通过它打印出的日志,去查看服务器启动时打印出的日志server.log的最后一行日志是:

 

2012-09-14 09:30:08,609 INFO  [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/]] Set web app root system property: 'webapp.root' = [D:\all_project\riskm8.3\riskm-web\target\exploded\riskm-web.war\]
2012-09-14 09:30:08,609 INFO  [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/]] Initializing log4j from [D:\all_project\riskm8.3\riskm-web\target\exploded\riskm-web.war\WEB-INF\log4j.xml]

 可见是服务器启动后的加载sprng bean容器的日志是通过log4j.xml的配置打印到了应用的具体路径下的日志文件里的,

  然后调用:Log4jConfigurer.initLogging()

	/** Pseudo URL prefix for loading from the class path: "classpath:" */
	public static final String CLASSPATH_URL_PREFIX = "classpath:";

	/** Extension that indicates a log4j XML config file: ".xml" */
	public static final String XML_FILE_EXTENSION = ".xml";	


/**
	 * Initialize log4j from the given location, with the given refresh interval
	 * for the config file. Assumes an XML file in case of a ".xml" file extension,
	 * and a properties file otherwise.

	 * <p>Log4j's watchdog thread will asynchronously check whether the timestamp
	 * of the config file has changed, using the given interval between checks.
	 * A refresh interval of 1000 milliseconds (one second), which allows to
	 * do on-demand log level changes with immediate effect, is not unfeasible.
	 * <p><b>WARNING:</b> Log4j's watchdog thread does not terminate until VM shutdown;
	 * in particular, it does not terminate on LogManager shutdown. Therefore, it is
	 * recommended to <i>not</i> use config file refreshing in a production J2EE
	 * environment; the watchdog thread would not stop on application shutdown there.
	 * @param location the location of the config file: either a "classpath:" location
	 * (e.g. "classpath:myLog4j.properties"), an absolute file URL
	 * (e.g. "file:C:/log4j.properties), or a plain absolute path in the file system
	 * (e.g. "C:/log4j.properties")
	 * @param refreshInterval interval between config file refresh checks, in milliseconds
	 * @throws FileNotFoundException if the location specifies an invalid file path
	 */
	public static void initLogging(String location, long refreshInterval) throws FileNotFoundException {
		String resolvedLocation = SystemPropertyUtils.resolvePlaceholders(location);
		File file = ResourceUtils.getFile(resolvedLocation);
		if (!file.exists()) {
			throw new FileNotFoundException("Log4j config file [" + resolvedLocation + "] not found");
		}
		if (resolvedLocation.toLowerCase().endsWith(XML_FILE_EXTENSION)) {
			DOMConfigurator.configureAndWatch(file.getAbsolutePath(), refreshInterval);
		}
		else {
			PropertyConfigurator.configureAndWatch(file.getAbsolutePath(), refreshInterval);
		}
	}

    这样就读取了log4j.xml的工程中用到的日志的配置,然后相当于生成了一个日志容器,然后通过工厂方法就可以获取和生成配置文件配置的具体的日志对象,然后把日志打印到相应的文件中。

 

 

分享到:
评论

相关推荐

    Tomcat与Java Web开发技术详解(第2版).pdf

    《Tomcat与Java Web开发技术详解(第2版)》是一本深入探讨Java Web应用程序部署和运行环境的权威指南。本书主要围绕Apache Tomcat服务器展开,涵盖了从基础概念到高级特性的全方位讲解,旨在帮助读者掌握Java Web...

    Tomcat与Java Web开发技术详解

    最后,本书还会讨论Java Web开发中的性能调优技巧,包括内存管理和线程池配置,以及如何通过日志分析和性能监控工具(如JMX)来诊断和优化应用性能。同时,也会涉及安全性问题,如HTTPS配置、身份验证和授权机制,...

    java web 开发与应用教材源码

    《Java Web开发与应用教材源码》是一本深入讲解Java Web技术的教科书,它涵盖了从基础到高级的各种Web应用程序开发技术。源码包含了教材中的各个章节示例,可以帮助读者更好地理解和实践Java Web编程。标签"web"、...

    Tomcat与Java.Web开发技术详解(PDF)

    【标题】:“Tomcat与Java.Web开发技术详解”是一本深度探讨Tomcat服务器与Java Web应用开发的专业资料,旨在帮助开发者全面理解并掌握这两项关键技术。 【内容详解】: 1. **Tomcat介绍**:Tomcat是Apache软件基金...

    [Tomcat与Java.Web开发技术详解][第一版][孙卫琴][PDF清晰版]+APK

    《Tomcat与Java.Web开发技术详解》是由孙卫琴编著的一本专业书籍,主要针对Java Web开发初学者和进阶者,详细介绍了如何使用Tomcat服务器进行Web应用的开发和部署。这本书以其清晰易懂的特点,深受读者喜爱,特别...

    Tomcat与Java.Web开发技术详解

    《Tomcat与Java.Web开发技术详解》是一本深入解析Tomcat服务器和Java Web开发的教程。本书旨在帮助读者全面理解如何使用Tomcat作为Java Web应用的运行环境,并掌握相关的开发和部署技巧。以下是对该主题的详细阐述:...

    21天学通Java Web开发.PDF

    14. **框架**:Spring Framework是Java Web开发中的热门选择,它提供了依赖注入、AOP(面向切面编程)以及Spring MVC和Spring Boot等模块,简化了开发流程。 15. **持续集成/持续部署(CI/CD)**:了解Jenkins等...

    Tomcat与Java Web开发技术详解(第2版)PDF

    《Tomcat与Java Web开发技术详解(第2版)》是一本深入探讨如何使用Tomcat进行Java Web应用程序开发的专业书籍。Tomcat作为Apache软件基金会的一个开源项目,是世界上最流行的Java Servlet容器之一,广泛用于部署...

    Java Web开发实践教程源码ch06

    在Java Web开发领域,实践...通过阅读和运行这些代码,你可以深入理解Java Web开发的工作原理,提升你的编程技能。同时,遇到不理解的部分,可以查阅相关文档或参考书籍,结合实际项目实践,将理论知识转化为实践经验。

    初学 Java Web 开发,请远离各种框架,从 Servlet 开发

    这样做的目的是为了更好地理解Web开发的基本原理,为后续深入学习和掌握复杂框架打下坚实的基础。 首先,要进行Java Web开发,具备良好的Java编程基础是必不可少的。这意味着你应该对Java语言有深入的理解,包括...

    NIIT JAVA WEB 开发

    这个应用可能包括球员的信息存储、查询、更新和删除等功能,帮助学员理解如何在实际项目中运用Java Web开发技术。 【标签】"NIIT JAVA WEB 开发 程序1"进一步强化了这是一个初级阶段的Java Web编程实践,可能涉及...

    Tomcat与Java.Web开发技术详解源代码

    本主题“Tomcat与Java.Web开发技术详解源代码”将深入探讨Tomcat的工作原理、配置方法以及如何结合Java进行Web应用开发。 一、Tomcat简介 Tomcat是Apache软件基金会的Jakarta项目的一部分,它实现了Java Servlet和...

    tomcat与java web开发技术详解

    【描述】:“Tomcat与Java Web开发技术详解”旨在为开发者提供一个全面理解Tomcat工作原理和Java Web开发实践的平台。内容涵盖Tomcat的安装配置、项目部署、性能优化,以及如何通过Tomcat进行JSP和Servlet的开发。...

    Tomcat与Java.Web开发技术详解附书光盘1

    《Tomcat与Java.Web开发技术详解》是一本深入探讨Java Web应用服务器——Tomcat以及相关开发技术的专业书籍。光盘附带的"sourcecode1"文件可能是书中示例代码或练习项目的源码,旨在帮助读者更好地理解和实践所学...

    Java Web开发技术(课件)

    Java Web开发技术是IT行业中一个重要的领域,它涵盖了多种技术和概念,主要用来构建基于Web的交互式应用程序。这个课件涵盖了以下几个核心知识点: 1. **Java Web基础**:这部分内容通常会讲解Java语言如何与Web...

    Tomcat与Java Web开发技术详解源代码

    《Tomcat与Java Web开发技术详解》是一本深入解析Tomcat服务器及Java Web开发的经典著作,作者孙卫琴以其丰富的经验和深入的理解,为读者呈现了Java Web应用在Tomcat上的实现过程。书中涵盖了大量的实践案例和详尽的...

    Java开发的简单WEB服务器源码Java实用源码整理learns

    下面将详细解释与这个主题相关的Java Web开发知识。 1. **Java Web基础**: - **Servlet**:Java Web开发的核心是Servlet,它是一个Java类,用于扩展服务器的功能,处理HTTP请求并返回响应。 - **JSP(JavaServer...

    Java Web开发详解.pdf

    1. **Java Web基础知识**:这部分会讲解Java Web开发的基本概念,包括Servlet、JSP(JavaServer Pages)以及它们在Web应用中的作用。Servlet是Java编写服务器端程序的标准接口,JSP则是用于创建动态网页的视图技术。...

Global site tag (gtag.js) - Google Analytics