log4j的使用與java中properties配置檔案載入
阿新 • • 發佈:2019-02-06
日誌是我們在寫程式碼中經常會用到的,程式出錯了我們也需要去檢視日誌來調錯,對於像我們這一些新人來說,怎麼去使用日誌就比較陌生,下面我將我學習的過程分享一下:
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的位置和要讀取的檔案之間的路徑相差多遠,想辦法從當前位置出發湊一個能到達目標檔案的路徑,然後讀取試試看。總之避免讀取絕對路徑。" 總之,遇到問題,解決問題,才能學的更多。