將 Log4j 配置文件放在項目外面

配置文件爲何要放在項目以外

在項目開發階段,咱們使用的是測試區的數據庫,FTP 等等 資源。
在項目上線時,天然要切換到正式區。 若是配置文件寫在項目裏面,那麼發佈時就要變動代碼,修改連接地址。
因此講配置文件放在項目以外,就能夠解決這個問題了。

爲何要動態配置 log4j.properties 的路徑

由於目前個人項目要給多個外包廠用,部署到多個服務器上。 因外包廠服務器安裝目錄不一樣,各自的命令規範也沒法統一。

因此須要客戶本身制定log路徑位置。java

基本思路

* 在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"/>web

建立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);
}

}數據庫

`apache

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/MyLoggerServletapi

相關文章
相關標籤/搜索