1. 程式人生 > >log4j的使用與java中properties配置檔案載入

log4j的使用與java中properties配置檔案載入

    日誌是我們在寫程式碼中經常會用到的,程式出錯了我們也需要去檢視日誌來調錯,對於像我們這一些新人來說,怎麼去使用日誌就比較陌生,下面我將我學習的過程分享一下:

1.需要找到一個log4j包,我使用的是log4j-1.2.15.jar。放在工程lib資料夾下

2.新建一個peoperties配置檔案,一般取名為:log4j.properties,最好放在src資料夾下,配置檔案詳解如下:

# 將等級為debug的日誌資訊輸出到stdout和R這兩個目的地,stdout和R的定義在下面的程式碼,可以任意起名
log4j.rootLogger = debug, stdout,R

# 定義stdout的輸出端是哪種型別,可以是ConsoleAppender(控制檯),FileAppender(檔案)等
log4j.appender.stdout=org.apache.log4j.ConsoleAppender

#指定輸出端的layout(佈局)是哪種型別
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

#以PatternLayout佈局,就是設定輸出格式
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

#同stdout
log4j.appender.R=org.apache.log4j.RollingFileAppender
#定義以檔案型別輸出的問津路徑及檔名
log4j.appender.R.File=D:\\nepalon\\classes\\TestLog4j\\example.log

# Archive log files (one backup file here)
#設定儲存一個備份檔案
log4j.appender.R.MaxBackupIndex=1

#以下都同stdout
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n

3.新建java類用來測試,程式碼如下:

package com.xmh.log1;

import org.apache.log4j.Logger;
import org.apache.log4j.Priority;
import org.apache.log4j.PropertyConfigurator;

public class TestLog4j {
	//獲取logger物件,引數為需要使用Logger的相關類
	static Logger logger = Logger.getLogger(TestLog4j.class.getName()); //(2)
	public TestLog4j(){}
	public static void main(String[] args)
	{
		System.out.println("TestLog4j:"+TestLog4j.class);
		System.out.println("TestLog4j:"+TestLog4j.class.getName());
		//同時輸出到控制檯和一個檔案的例項並實現了Logger的繼承
		//載入配置檔案,建議放在src下面
		PropertyConfigurator.configure("<a target=_blank href="file://\\log4j.properties">\\log4j.properties</a>");
		//下面是用logger的5個等級分別輸出日誌
		logger.debug("Start of the main() in TestLog4j");
		logger.info("Just testing a log message with priority set to INFO");
		logger.warn("Just testing a log message with priority set to WARN");
		logger.error("Just testing a log message with priority set to ERROR");
		logger.fatal("Just testing a log message with priority set to FATAL");
		logger.log(Priority.WARN, "Testing a log message use a alternate form");
		logger.debug(TestLog4j.class.getName());
		//呼叫另一檔案的testLog()方法
		TestLog4 testLog4j2 = new TestLog4();
		testLog4j2.testLog();
	}
}
package com.xmh.log1;

import java.io.IOException;
import java.util.Properties;

import org.apache.log4j.Logger;
import org.apache.log4j.Priority;
import org.apache.log4j.PropertyConfigurator;
import com.xmh.servlet.Log4j.Log4jInit;

public class TestLog4 {
	static Logger logger = Logger.getLogger(TestLog4.class.getName());
	public TestLog4(){}
	public void testLog()
	{	
		//同時輸出到控制檯和一個檔案的例項
		/* 用log4包載入配置檔案 */
		//PropertyConfigurator.configure("\\log4j.properties");
		/* 用java自帶peoperties載入配置檔案  */
		Properties props=new Properties();
		try {
			System.out.println("++++++properties++++++++");
			props.load(Log4jInit.class
					.getClassLoader()
					.getResourceAsStream("log4j.properties")
					);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		logger.debug("2Start of the main()");
		logger.info("2Just testing a log message with priority set to INFO");
		logger.warn("2Just testing a log message with priority set to WARN");
		logger.error("2Just testing a log message with priority set to ERROR");
		logger.fatal("2Just testing a log message with priority set to FATAL");
		logger.log(Priority.DEBUG, "Testing a log message use a alternate form");
		logger.debug("2End of the main()");
	}
}

4.在java的web專案中初始化Logger,這樣在專案中就不用每次載入,只要在需要用到的類中生成logger物件。

  a.配置web.xml檔案

  	<servlet>
		<servlet-name>log4j-init</servlet-name>
		<servlet-class>com.xmh.servlet.Log4j.Log4jInit</servlet-class>
		<init-param>
			<param-name>log4j-init-file</param-name>
			<param-value>log4j.properties</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

  b.新建一個servlet,重寫init方法,注意不要重寫帶引數的init方法,否則會有問題。

package com.xmh.servlet.Log4j;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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;

/**
 * Servlet implementation class Log4jInit
 */
@WebServlet("/Log4jInit")
public class Log4jInit extends HttpServlet {
	private static final long serialVersionUID = 1L;
	/**
	 * @see Servlet#init(ServletConfig)
	 */
	static Logger logger = Logger.getLogger(Log4jInit.class.getName());
	public void init() throws ServletException {
		System.out.println("logger初始化......");
		// TODO Auto-generated method stub
		//通過web.xml來動態取得配置檔案
		String file = getInitParameter("log4j-init-file");
		System.out.println("file:"+file);
		// 如果沒有給出相應的配置檔案,則不進行初始化
		if(file != null)
		{
			System.out.println("----------start init------------------");
			PropertyConfigurator.configure("/" + file);
			logger.error("Start of the main() in TestLog4j");
		}else{
			System.out.println("===========沒有初始化配置檔案!==============");
		}
	}
}

5.遇到的問題:

在自學的過程中,肯定會遇到一些問題,有些人不重視,可能這才是我們真正需要學習的。

像log4的用法,在網上也有很多資料,很容易找到解釋,但我在載入配置檔案的時候就遇到了一些不理解的地方,

我開始向網上的方法一樣,用的

String prefix = this.getServletContext().getRealPath("/");

但這取到的是絕對物理路徑,這樣會導致部署後有可能讀取錯誤。(我剛開始在這裡就報錯,如果不報錯可能也不能學習到這個知識點了)

我後來又在網上找了其他方法,基本上都不行。

後來請教以前的老師,和我簡單說了一下,我和大家分享一下:

"在web應用程式中,想要載入一個檔案,路徑直接以 / 開頭,然後看看當前讀取的位置,決定是回到了應用名之前,還是應用名之後。在拼湊一個目標檔案的位置就行了。不要讀取getRealPath這樣的絕對物理路徑,這樣會導致部署後有可能讀取錯誤。

注意的地方,就是把配置檔案要放在src裡面,保證部署的時候能夠部署到伺服器中,然後看讀取檔案的servlet的位置和要讀取的檔案之間的路徑相差多遠,想辦法從當前位置出發湊一個能到達目標檔案的路徑,然後讀取試試看。總之避免讀取絕對路徑。"     總之,遇到問題,解決問題,才能學的更多。