log4j(二):动态配置日志输出路径

上一篇有提到:log4j.appender.R.File = /logs/my.log,日志文件直接输出在盘符根目录下的logs文件夹下,而不是常用的项目根目录的logs目录下,这篇说说让其输出到项目的根目录下。

一、没有spring帮助管理的情况下,如前一篇的例子:简单的servlet作为容器的。

第一种方法:

log4j.properties的文件输出配置如下:log4j.appender.R.File = /logs/my.log

1、修改web.xml,将log4j作为init-param添加到servlet配置中:

<servlet>
  <servlet-name>TestLog4jServlet</servlet-name>
  <servlet-class>com.wjl.servlet.TestLog4jServlet</servlet-class>
  <init-param>  
  	<param-name>log4j</param-name>  
  	<param-value>/WEB-INF/classes/log4j.properties</param-value>  
  </init-param>  
  <load-on-startup>0</load-on-startup>
</servlet>

 2、修改TestLog4jServlet的init方法:

public void init(ServletConfig config) throws ServletException {
	String prifix = config.getServletContext().getRealPath("/"); 
	//getInitParameter("log4j"):web.xml中init-param的param-name,两者必须一致
	String file = config.getInitParameter("log4j"); 
	if(file != null){ 
		Properties prop = new Properties(); 
		try{ 
			prop.load(new FileInputStream(prifix+file)); 
			//log4j.appender.R.File:log4j.properties中文件输出位置的配置,必须与配置文件中的一致
			prop.setProperty("log4j.appender.R.File", 
			prifix + prop.getProperty("log4j.appender.R.File")); 
			PropertyConfigurator.configure(prop); 
		}catch(IOException e){ 
			e.printStackTrace(); 
		} 
	} 
}

第二种方法(使用系统变量的方法):

log4j.properties的文件输出配置如下:log4j.appender.R.File = ${webRoot}/logs/my.log

1、修改web.xml文件,内容与方法一种的相同。

2、修改TestLog4jServlet的init方法:

扫描二维码关注公众号,回复: 564309 查看本文章
public void init(ServletConfig config) throws ServletException {
	String root = config.getServletContext().getRealPath("/");
	String log4jLocation = config.getInitParameter("log4j");
	System.setProperty("webRoot", root);
	if (log4jLocation!=null) {
		PropertyConfigurator.configure(root + log4jLocation);
	}
}

第三种方法:使用服务器环境变量
log4j的配置文件支持服务器的vm的环境变量,格式类似${catalina.home}
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=${catalina.home}/logs/logs_tomcat.log
log4j.appender.R.MaxFileSize=10KB
其中的${catalina.home}并非windows系统的环境变量,这个环境变量就不需要在Windows系统的环境变量中设置。之所以这样,你可以看看tomcat\bin\catalina.bat(startup,shutdown都是调用这个)里面自带有-Dcatalina.home= "%CATALINA_HOME%" 。继承这个思想,所以你也可以自己设定一个参数-Dmylog.home="D:/abc/log"到对应的服务器java启动的vm参数中。

该方法参考自:http://www.linuxidc.com/Linux/2014-09/106571.htm

没看懂什么意思,所以没有实验

二、有spring帮助管理的:

log4j.properties的文件输出配置如下:log4j.appender.R.File = ${webRoot_root}/logs/my.log

在web.xml中初始化log4j:

<context-param>
	<description>日志文件的路径 </description>
	<param-name>log4jConfigLocation</param-name>
	<param-value>/WEB-INF/classes/log4j.properties</param-value>
</context-param>
<context-param> 
	<description>log4jRefreshInterval为6000表示 开一条watchdog线程每6秒扫描一下配置文件的变化。 </description>
	<param-name>log4jRefreshInterval</param-name> 
	<param-value>600000</param-value> 
</context-param>
<context-param>
	<description>设置日志文件中,取系统根目录的key</description>
	<param-name>webAppRootKey</param-name>
	<param-value>webRoot_root</param-value>
</context-param>
<listener>
	<display-name>日志文件的侦听器</display-name>
	<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
写道
spring提供了org.springframework.web.util.Log4jConfigListener监听器来初始化一些必要的log4j信息,比如它使用了System.setProperty(key, root); 没错key=webapp.root,而root就是当前项目的真实路径(得到项目的真实路径也很简单ServletContext.getRealPath("/")),这样我们就可以使用${webapp.root}来获取项目的真实路径。需要注意的是:该listener需要放在spring的Listener之前。

猜你喜欢

转载自1017401036.iteye.com/blog/2332210