配置文件为什么要放在项目之外
在项目开发阶段,我们使用的是测试区的数据库,FTP 等等 资源。
在项目上线时,自然要切换到正式区。 如果配置文件写在项目里面,那么发布时就要变更代码,修改链接地址。
所以讲配置文件放在项目之外,就可以解决这个问题了。
为什么要动态配置 log4j.properties 的路径
因为目前我的项目要给多个外包厂用,部署到多个服务器上。 因外包厂服务器安装目录不同,各自的命令规范也无法统一。
所以需要客户自己制定log路径位置。
基本思路
* 在tomcat的context.xml中 新增一个变量,维护log4j的位置.
* 在项目启动加载时,根据路径读取log4j的文件,重新定义log4j配置文件.
配置tomcat的context.xml
- context.xml 新增一行
<Environment name="myLog4jPath" override="false" type="java.lang.String" value="/opt/conf/log4j.properties"/>
创建maven项目
- pom.xml
注意事项 : log4j要是1.2.17以上版本,否则不支持
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>MyLogger</finalName>
</build>
新建servlet
package com;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class MyLoggerServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private Logger logger = Logger.getLogger(MyLoggerServlet.class);
/**
* @see HttpServlet#HttpServlet()
*/
public MyLoggerServlet() {
Context initCtx = null;
String config = null;
InputStream is = null;
Context envCtx = null;
try {
initCtx = new InitialContext();
envCtx = (Context) initCtx.lookup("java:comp/env");
config = (String) envCtx.lookup("myLog4jPath");
is = new FileInputStream(new File(config));
PropertyConfigurator.configure(is);
logger.info("========================config file path============="
+ config);
} catch (Exception ex) {
logger.error(ex.toString());
} finally {
if (envCtx != null) {
try {
envCtx.close();
} catch (NamingException e) {
e.printStackTrace();
}
}
if (initCtx != null) {
try {
initCtx.close();
} catch (NamingException e) {
e.printStackTrace();
}
}
}
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
PrintWriter pw = response.getWriter();
logger.info("hello servlet, hello log4j");
pw.write("okok");
pw.flush();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
`
web.xml
<servlet>
<servlet-name>MyLoggerServlet</servlet-name>
<display-name>MyLoggerServlet</display-name>
<description></description>
<servlet-class>com.MyLoggerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyLoggerServlet</servlet-name>
<url-pattern>/MyLoggerServlet</url-pattern>
</servlet-mapping>
###测试 Servlet会在第一次调用时加载/opt/conf/log4j.properties文件, 并打印log到指定目录 http://localhost:8080/MyLogger/MyLoggerServlet