- 浏览: 1528576 次
- 性别:
- 来自: 厦门
博客专栏
-
Spring 3.x企业实...
浏览量:464539
文章分类
最新评论
-
JyeChou:
学习Spring必学的Java基础知识(1)----反射 -
hhzhaoheng:
...
《Spring4.x企业应用开发实战》光盘资料下载 -
renlongnian:
//assertReflectionEquals(user1, ...
单元测试系列之3:测试整合之王Unitils -
骑着蜗牛超F1:
huang_yong 写道我的经验是,只需定义三层:1.ent ...
Spring的事务管理难点剖析(2):应用分层的迷惑 -
wangyudong:
工具地址貌似更新了哦https://github.com/Wi ...
几种常用的REST webservice客户端测试工具
引言
在打造易于部署的WEB应用项目 一文中,我们介绍了如何对WEB项目进行重构,使项目WAR包无状态化,给项目部署升级带来了极大的便利的方法:
1)首先是将项目配置文件通过JVM系统参数指定,将项目部署文件移出WAR包,使项目WAR包只包含程序,不包含配置信息;
2)此外,还介绍了在Maven项目中如何通过jetty插件提供JNDI数据源,将数据源配置移出Spring配置文件的方法。
我们给出的解决办法不但照顾到生产环境项目的可部署性,还兼顾了项目开发环境的可移植性,两者天然统一,真可移为“最佳的项目实践”了
但我们还留下了一个未考虑到的重要问题:即如何将项目的日志配置文件(即log4j的配置文件)也移出项目之外?因为,在生产环境下,项目运行性时,我们往往需要对项目的日志行为进行控制:如日志级别、日志文件大小等。
传统Log4J如何配置呢?
使用Spring框架的Web项目,一般是在web.xml中通过org.springframework.web.util.Log4jConfigListener配置Log4j的,它通过一个
log4jConfigLocation上下文参数指定log4J配置文件的地址,如下所示:
虽然你可以指定一个独立于WAR的外部log4j配置文件(如f:/conf/log4j.properties),但是,这样一来就限制了生产环境时log4j配置文件的路径的自由性,另外,log4j配置文件独立于Web项目,开发环境就麻烦了。
我们期望的解决方案,是要统一开发环境又生产环境的便捷性,因此我们希望通过一个项目配置文件的属性定义log4j配置文件。如果一来,在开发环境下将项目配置文件的属性指向项目中的log4j配置文件,而生产环境下,则指向一个外部的log4j配置文件。
最佳实践
为了可以通过项目配置文件的属性指定log4j配置文件,我们需要复写org.springframework.beans.factory.config.PropertiesFactoryBean类,以便在加载属性文件时,通过属性值加载log4j配置文件,初始化Log4J日志引擎。
完成任务的人
来看我们如何复写PropertiesFactoryBean类:
使用Spring的org.springframework.util.Log4jConfigurer可轻易初始化Log4J引擎,因为这里我们覆盖PropertiesFactoryBean的createProperties()方法,在加载项目配置文件之后,马上初始化Log4J引擎。
安装它
写好FrameworkPropertiesFactoryBean后,我们就要替换Spring配置文件中关于项目属性文件的初始化内容了:
将以下片段:
替换为:
这样FrameworkPropertiesFactoryBean初始化时,Log4J引擎就初始化就绪了。
项目配置文件相关属性
我们是通过项目配置文件的log4j.conf.location及log4j.conf.refreshInterval来定义Log4J配置文件路径及更新刷新周期的。在开发环境下,我们可以这样定义:
而生产环境下,我们可以这样定义:
小结
为了方便,在生产环境下,建议将Log4J配置文件log4j.properties和项目配置文件放在同一个目录下,这样要更改项目的配置时,只要在这个目录下找到配置文件更改即可。当然了,在开发环境下,也将两者放在一起管理为好,来看我的项目目录结构:
至此,我们就让WEB项目完全无状态化:项目属性文件,数据源,log4J配置文件都外化管理,项目实施人员升级只管大胆更新WAR包,不想笑都难了。
以后在此维护新文章:
https://www.jianshu.com/u/d7f090245ddd
在打造易于部署的WEB应用项目 一文中,我们介绍了如何对WEB项目进行重构,使项目WAR包无状态化,给项目部署升级带来了极大的便利的方法:
1)首先是将项目配置文件通过JVM系统参数指定,将项目部署文件移出WAR包,使项目WAR包只包含程序,不包含配置信息;
2)此外,还介绍了在Maven项目中如何通过jetty插件提供JNDI数据源,将数据源配置移出Spring配置文件的方法。
我们给出的解决办法不但照顾到生产环境项目的可部署性,还兼顾了项目开发环境的可移植性,两者天然统一,真可移为“最佳的项目实践”了
但我们还留下了一个未考虑到的重要问题:即如何将项目的日志配置文件(即log4j的配置文件)也移出项目之外?因为,在生产环境下,项目运行性时,我们往往需要对项目的日志行为进行控制:如日志级别、日志文件大小等。
传统Log4J如何配置呢?
使用Spring框架的Web项目,一般是在web.xml中通过org.springframework.web.util.Log4jConfigListener配置Log4j的,它通过一个
log4jConfigLocation上下文参数指定log4J配置文件的地址,如下所示:
<context-param> <param-name>log4jConfigLocation</param-name> <param-value>WEB-INF/log4j.properties</param-value> </context-param> <context-param> <param-name>log4jRefreshInterval</param-name> <param-value>600000</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener>
虽然你可以指定一个独立于WAR的外部log4j配置文件(如f:/conf/log4j.properties),但是,这样一来就限制了生产环境时log4j配置文件的路径的自由性,另外,log4j配置文件独立于Web项目,开发环境就麻烦了。
我们期望的解决方案,是要统一开发环境又生产环境的便捷性,因此我们希望通过一个项目配置文件的属性定义log4j配置文件。如果一来,在开发环境下将项目配置文件的属性指向项目中的log4j配置文件,而生产环境下,则指向一个外部的log4j配置文件。
最佳实践
为了可以通过项目配置文件的属性指定log4j配置文件,我们需要复写org.springframework.beans.factory.config.PropertiesFactoryBean类,以便在加载属性文件时,通过属性值加载log4j配置文件,初始化Log4J日志引擎。
引用
为啥非要找PropertiesFactoryBean开刀呢?因为我们希望尽早初始化log4j引擎,而启动Spring时,加载项目配置文件是第一件来做的事,因此搭这班快车就是再自然不过的了
完成任务的人
来看我们如何复写PropertiesFactoryBean类:
package com.xxx.sys; import org.springframework.beans.factory.config.PropertiesFactoryBean; import org.springframework.util.Assert; import org.springframework.util.Log4jConfigurer; import org.springframework.util.StringUtils; import java.io.IOException; import java.util.Properties; /** * 加载平台属性文件,同时初始化Log4J引擎 * @author : chenxh * @date: 2015/7/28 */ public class FrameworkPropertiesFactoryBean extends PropertiesFactoryBean { private static final String LOG4J_CONF_LOCATION = "log4j.conf.location"; private static final int REFRESH_INTERVAL_INSECONDS = 5; public static final String REFRESH_INTERVAL = "log4j.conf.refreshInterval"; @Override protected Properties createProperties() throws IOException { Properties properties = super.createProperties(); //①通过项目配置文件初始化Log4J引擎配置 initLog4j(properties); return properties; } private void initLog4j(Properties properties) throws IOException{ String confLocation = properties.getProperty(LOG4J_CONF_LOCATION); Assert.hasText(confLocation,"配置文件未定义:"+LOG4J_CONF_LOCATION); String refreshInterval = properties.getProperty(REFRESH_INTERVAL); long refreshIntervalLong = REFRESH_INTERVAL_INSECONDS; if (StringUtils.hasText(refreshInterval)) { int value = Integer.parseInt(refreshInterval); if (value < 2) { value = 2; } refreshIntervalLong = Integer.parseInt(refreshInterval)*1000L; } //②初始化Log4J引擎的配置 Log4jConfigurer.initLogging(confLocation,refreshIntervalLong); } }
使用Spring的org.springframework.util.Log4jConfigurer可轻易初始化Log4J引擎,因为这里我们覆盖PropertiesFactoryBean的createProperties()方法,在加载项目配置文件之后,马上初始化Log4J引擎。
安装它
写好FrameworkPropertiesFactoryBean后,我们就要替换Spring配置文件中关于项目属性文件的初始化内容了:
将以下片段:
<bean id="frameworkConf" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> <property name="locations"> <list> <value>#{systemProperties.FRAMEWORK_CONFFILE_PATH}</value> <value>classpath*:conf/frameworkVersion.properties</value> </list> </property> </bean>
替换为:
<bean id="frameworkConf" class="com.hsit.tso.framework.web.sys.FrameworkPropertiesFactoryBean"> <property name="locations"> <list> <value>#{systemProperties.FRAMEWORK_CONFFILE_PATH}</value> <value>classpath*:conf/frameworkVersion.properties</value> </list> </property> </bean>
这样FrameworkPropertiesFactoryBean初始化时,Log4J引擎就初始化就绪了。
项目配置文件相关属性
我们是通过项目配置文件的log4j.conf.location及log4j.conf.refreshInterval来定义Log4J配置文件路径及更新刷新周期的。在开发环境下,我们可以这样定义:
#log4j的配置文件路径 #1)文件如果在类路径下,以classpath:为前缀,形如:classpath:conf/log4j.properties #2)文件如果在文件系统下,则采用文件绝对路径,形如 f:/log4j.properties,/etc/conf/log4j.properties #①这儿=>开发环境嘛,当然基于类路径了 log4j.conf.location=classpath:conf/log4j.properties #log4j.conf.location=f:/log4j.properties #日志配置文件变更扫描刷新周期,单位为秒 log4j.conf.refreshInterval=5
而生产环境下,我们可以这样定义:
#log4j的配置文件路径 #1)文件如果在类路径下,以classpath:为前缀,形如:classpath:conf/log4j.properties #2)文件如果在文件系统下,则采用文件绝对路径,形如 f:/log4j.properties,/etc/conf/log4j.properties #①这儿=>生产环境哦,基于文件系统的路径了 log4j.conf.location=f:/log4j.properties #log4j.conf.location=f:/log4j.properties #日志配置文件变更扫描刷新周期,单位为秒 log4j.conf.refreshInterval=5
小结
为了方便,在生产环境下,建议将Log4J配置文件log4j.properties和项目配置文件放在同一个目录下,这样要更改项目的配置时,只要在这个目录下找到配置文件更改即可。当然了,在开发环境下,也将两者放在一起管理为好,来看我的项目目录结构:
至此,我们就让WEB项目完全无状态化:项目属性文件,数据源,log4J配置文件都外化管理,项目实施人员升级只管大胆更新WAR包,不想笑都难了。
以后在此维护新文章:
https://www.jianshu.com/u/d7f090245ddd
评论
2 楼
飞天奔月
2015-08-22
如果是你文章的需求, 我倒是建议你 继承 Log4jConfigListener 自定义实现
而不是 PropertiesFactoryBean
而不是 PropertiesFactoryBean
1 楼
飞天奔月
2015-08-22
要说 "希望尽早初始化log4j引擎", 那非 Listener不可以了
哥,你应该听说过 org.springframework.web.util.Log4jConfigListener
哥,你应该听说过 org.springframework.web.util.Log4jConfigListener
发表评论
-
狂魔型代码改造记
2016-10-22 13:02 2183功能需求 统计员工指定月:在职员工数,入职员工数,离职员 ... -
关于JAR包版本冲突的几个应对招数总结
2016-08-02 12:05 9731概述 Javeer们一定遇到过NoSuchMethod ... -
关于Websphere 会话管理若干奇葩问题
2015-12-09 20:45 4481引言 由于最近 ... -
几种常用的REST webservice客户端测试工具
2015-07-30 16:11 9735引言 开发了Rest WebService服务后,如果方便快捷 ... -
打造易于部署的WEB应用项目
2015-07-27 16:46 3053概述 很多WEB应用的配置文件位于项目的类路径下(如WEB-I ... -
ROCA Resource-oriented Client Architecture
2014-03-21 18:16 1785ROCA Resource-oriented Client ... -
关于Idea testng单元测试乱码的解决
2013-07-02 10:50 14186问题 我是使用intel ... -
网络技术专业名词
2012-11-07 15:30 1549MRTG 求助编辑百科名片 Multi Router Tr ... -
ETL及BI开源工具
2012-08-01 16:17 56441. Kettle Kettle是一款 ... -
HMAC简介
2012-06-11 12:38 5666HMAC简介 HMAC的典型应用 ... -
关于权限管理的一点小思考
2012-05-26 15:32 2485做任何系统组织结构和权限管理是必不可少的,同时也是最重要的,实 ... -
看看人家写东西的速度
2012-05-14 16:08 2250以下是GIT的开发日志: 2005 年4月3日 开始开发GIT ... -
明明白白AOP(傻瓜也会心领神会!)
2012-05-05 11:04 10603引子: AOP(面向方面编 ... -
学习Spring必学的Java基础知识(2)----动态代理
2012-05-02 13:03 9729引述要学习Spring框架的 ... -
单元测试系列之5:使用unitils测试Service层
2012-04-14 10:48 18476引述:Spring 的测试框架为我们提供一个强大的测试环境,解 ... -
如何用Spring读取JAR中的文件
2012-04-13 17:22 18407使用如下方式读取JAR中的文件出错 类路径下 ... -
单元测试系列之4:使用Unitils测试DAO层
2012-04-12 16:32 19691Spring 的测试框架为我们提供一个强大的测试环境,解 ... -
单元测试系列之3:测试整合之王Unitils
2012-04-09 14:11 15689引述:程序测试对保障应用程序正确性而言,其重要性怎么样强调都不 ... -
犯下这种错误,羞愧难当!
2012-03-28 15:06 2289我很早就过了SJCP,可是在实际项目中居然还是犯下了一个 ... -
单元测试系列之1:开发测试的那些事儿
2012-03-28 12:52 10019引述:程序测试对保障应用程序正确性而言,其重要性怎 ...
相关推荐
### log4j.properties配置文件详解 #### 一、概述 `log4j.properties`是Apache Log4j框架中用于配置日志记录行为的核心文件之一。通过这个文件,开发者可以定义日志消息的输出方式(例如控制台或文件)、日志级别...
`log4j.properties`是Log4j的配置文件,通过它我们可以定制日志的级别、输出方式、格式等。一个基本的`log4j.properties`配置示例如下: ```properties # 设置全局日志级别 log4j.rootLogger=DEBUG, stdout, R # ...
在 SSM 整合项目中,需要在 web.xml 文件中指定 Log4j 配置文件的位置,以便 Spring 可以加载 Log4j 配置文件。下面是一个基本的 web.xml 配置: ``` <listener-class>org.springframework.web.util.Log4...
### Log4J 全能配置文件详解 #### 一、概述 Log4J是一款非常流行的Java日志框架,被广泛应用于各种规模的应用程序中。它提供了灵活的日志记录机制,可以将日志输出到不同的目的地,如控制台、文件、数据库等,并且...
2. **log4j.properties**:这是一个配置文件,用于定制Log4j的行为。在这个文件中,你可以设置日志级别,指定哪些类或包的日志应该被记录,以及日志应该如何被输出(即选择哪个Appender)。例如,你可能想要将DEBUG...
三、Log4j配置文件 Log4j的灵活性很大程度上体现在其配置文件中,通常命名为`log4j.properties`或`log4j.xml`。配置文件定义了日志记录的行为,包括日志级别、输出目的地、格式等。在提供的`log4j.txt`文件中,我们...
Log4j 配置文件说明 ...Log4j 配置文件是 Log4j 的核心组件之一,通过配置文件可以控制日志记录的级别、输出目的地和格式。了解 Log4j 配置文件的基本结构和配置方法,可以更好地使用 Log4j 实现日志记录和管理。
通常,你可以在构建工具(如Maven或Gradle)的依赖管理中指定Log4j的版本,或者直接将jar包复制到项目的`lib`目录下。 在下载并导入`log4j.jar`后,你需要将配置文件(如`log4j.properties`)放置在一个可被Java...
#### 一、Log4j配置文件基本概念 Log4j是一种广泛应用于Java应用程序的日志框架,它可以帮助开发者轻松管理应用程序的日志记录过程。Log4j支持多种配置方式,其中.properties文件配置是最常用的一种。通过....
**二、Log4j配置文件** 在压缩包中,还包含了一份名为`log4j.properties`的配置文件。这是Log4j使用的一种配置格式,基于Java Properties格式。配置文件决定了日志信息如何输出、输出到哪里,以及日志的级别等关键...
`log4j.properties`文件是Log4j的核心配置文件,它定义了日志输出的行为,包括日志级别、输出目的地、格式以及过滤规则等。 在`log4j.properties`文件中,有以下几个关键知识点: 1. **日志级别(Logging Levels)...
《log4j-1.2.17.jar及其配置文件详解》 在IT行业中,日志记录是一项至关重要的任务,它能帮助开发者追踪程序运行状况、定位错误和调试问题。Log4j,作为Apache软件基金会的一个开源项目,是Java平台上广泛使用的...
标题"Log4j jar包 和配置文件"指的是Java日志记录库Log4j的一个特定版本——1.2.17。Log4j是Apache软件基金会开发的一个开源项目,它为Java应用程序提供了强大的日志记录功能。这里的"jar包"即Java Archive,是Java...
#### Log4j配置文件格式 Log4j支持多种配置文件格式,包括`.properties`和`.xml`。两种格式在功能上并无本质区别,选择哪种取决于个人或团队的偏好。 1. **.properties格式**: 在`.properties`文件中,配置信息...
3. **配置SpringBoot**:在`application.properties`中指定Log4j配置文件位置。 ```properties logging.config=classpath:log4j.properties ``` ### SpringBoot与Log4j2 Log4j2作为Log4j的升级版,提供更好的性能...
**log4j配置文件格式.txt、log4j配置文件基本含义说明.txt** 这两个文本文件可能包含了log4j配置文件的格式规范和详细解释,对于理解和编写配置文件非常有用。 总结来说,这个压缩包提供了log4j的使用教程、配置...
Log4j是一个广泛使用的Java日志框架,"Log4jJar.zip"中包含的是Log4j的JAR文件,用于在项目中集成Log4j。Log4j允许你灵活地控制日志信息的输出级别,例如DEBUG、INFO、WARN、ERROR等,并可以选择不同的输出目的地,...
这允许我们在不重启应用的情况下,通过修改外部的配置文件来调整日志级别和输出方式。 总的来说,理解和配置好Spring中的Log4j对于开发和维护Spring应用至关重要。通过合理配置`log4j.properties`文件,开发者可以...
要加载自己的Log4j配置文件,可以在Java代码中指定配置文件路径,例如使用`PropertyConfigurator.configure("path/to/config/file.properties")`,或者在类路径下放置名为`log4j.properties`或`log4j.xml`的文件,...
### Log4j配置文件详解 #### 一、概述 Log4j是一款开源的日志记录工具,广泛应用于Java应用程序中。其强大的配置灵活性使得开发者能够轻松地定制日志记录的细节,如日志级别、输出目的地及日志信息的格式等。本文...