大型項目中很是多狀況下要分析程序的日誌信息,怎樣管理本身的日誌信息相當重要。html
在應用程序中加入日誌記錄總的來講基於三個目的 ,java
最普通的作法就是在代碼中嵌入不少的打印語句,這些打印語句可以輸出到控制檯或文件裏,比較好的作法就是構造一個日誌操做類 來封裝此類操做。而不是讓一系列的打印語句充斥了代碼的主體。apache
這篇文章主要針對基於Java語言實現的項目中的日誌管理進行簡單的闡述。markdown
在強調可重用組件開發的今天。除了本身從頭至尾開發一個可重用的日誌操做類外, Apache 爲咱們提供了一個強有力的日誌操做包 -Log4j 。app
Log4j 是 Apache 的一個開放源碼項目,經過使用 Log4j 。咱們可以控制日誌信息輸送的目的地是控制檯、文件、 GUI 組件、甚至是套接口服 務器、 NT 的事件記錄器、 UNIX Syslog 守護進程等;咱們也可以控制每一條日誌的輸出格式;經過定義每一條日誌信息的級別,咱們可以更加仔細地控制日誌的生成過程。最使人感興趣的就 是,這些可以經過一個配置文件來靈活地進行配置,而不需要改動應用的代碼。分佈式
此外,經過 Log4j 其它語言接口,您可以在 C 、C++、.Net 、PL/SQL 程序中使用 Log4j ,其語法和使用方法與在 Java 程序中同樣,使得多語言分佈式系統獲得一個統一一致的日誌組件模塊。函數
而且。通 過使用各類第三方擴展,您可以很是方便地將 Log4j 集成到 J2EE 、 JINI 甚至是 SNMP 應用中。工具
Log4j主要配置三方面的內容,佈局
#配置日誌寫出器
#log4j.rootLogger = [ level ] , appenderName, appenderName, …
#當中。 level 是日誌記錄的優先級,分爲 OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。
#Log4j 建議僅僅使用四個級別,優先級從高到低各自是ERROR、WARN、INFO、DEBUG 。
#經過在這裏定義的級別,您可以控制到應用程序中對應級別的日誌信息的開關。比方在這裏定義了info級別。則應用程序中所有DEBUG級別的日誌信息將不被打印出來。
#appenderName 就是指日誌信息輸出到哪一個地方。可以同一時候指定多個輸出目的地。
log4j.rootLogger=info,R,stdout
#配置日誌目的地,輸出到控制檯
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#追加的方式輸出
log4j.appender.stdout.follow=true
#配置日誌格式化器
#可以靈活地指定佈局模式
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#指定佈局模式的格式
log4j.appender.stdout.layout.ConversionPattern=%d[%t](%F%L)-%m%n
#文件大小到達指定尺寸的時候產生一個新的文件
log4j.appender.R=org.apache.log4j.RollingFileAppender
#輸出日誌文件的位置路徑TestServer.log
log4j.appender.R.File=TestServer.log
#單個文件最大尺寸,在日誌文件到達該大小時,將會本身主動滾動。即將原來的內容移到 TestServer.log.1 文件。
log4j.appender.R.MaxFileSize=20MB
#指定可以產生的滾動文件的最大數
log4j.appender.R.MaxBackupIndex=20
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d%5p[%t](%F%L)-%m%n
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class logTest {
static public Logger m_logger;
static private void InitLog() {
try {
m_logger = Logger.getLogger(logTest.class.getName());
PropertyConfigurator.configure("log4j.properties");
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) {
logTest.InitLog();
m_logger.info("main is start [...]");
try {
m_logger.info("本身定義的異常類對象");
throw new MyException("本身定義的異常");// 拋一個本身定義的異常類對象,傳入的參數就是給控制檯看的異常
} catch (MyException e) {
m_logger.error(e.getExceptionName().toString(), e);
m_logger.debug(e);
}
m_logger.info("main is over [ OK ]");
}
}
class MyException extends Exception // 本身定義的異常類 繼承Exception類
{
private static final long serialVersionUID = 1L;
private String exceptionName; // 定義一個私有變量,用來爲本身定義異常
public MyException() {
} // 建立一個無參數的構造函數
public MyException(String exceptionName) { // 建立一個有參數的構造函數,傳入的參數爲前面定義的異常名稱
this.exceptionName = exceptionName;
}
public String getExceptionName() { // 定義一個方法,提供給外部來獲取私有變量
return this.exceptionName;
}
}
測試結果post
– 控制檯輸出例如如下。
– project文件夾路徑輸出例如如下。