A. 如何在eclipse中使用log4j
工具/原料
Eclipse
方法/步驟
到官網下載對應版本的log4j的jar包:
http://archive.apache.org/dist/logging/log4j/
選擇要使用的版本,直接點擊下載.zip後綴的壓縮文件即可。
為java項目導入log4j.jar包:
在Eclipse中新建一個java項目,右鍵單擊該項目選擇「屬性(properties)」打開當前項目的屬性窗口,選擇Java構建路徑(Java Build Path)>>庫(Libaries)>>添加外部JAR(Add External JARs),將剛才下載的log4j.jar包添加到項老空攔目中去。
在項目中新建一個log4j.properties的配置文件:
該文件專門用於配置日誌信息,其內容決定日誌信息的輸出位置及格式。右鍵單擊項目選擇 新建 >侍胡> 文件 ,文件名命名為 xxx.properties
將配置信息寫入到剛才建立的文件log4j.properties中去:
###將日誌信息輸出到控制台###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}%m%n %l%n
###將日誌信息輸出到文件中###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=sysInfo.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}%m%n %l%n
###設置日誌的優先順序別###
log4j.rootLogger=debug,stdout,file
新建一個java文件,測試配置是否成功:
import org.apache.log4j.Logger;
public class Log4jDemo {
public static void main(String[] args) {
Logger log = null;
try{
// 初始化日誌生成器,載入日誌配置文件
//PropertyConfigurator.configure("bin/log4j.properties");
log = Logger.getLogger(Log4jDemo.class.getName());
log.debug("main");
int i = 1/0;
} catch(Exception e){
// 記錄日誌
log.info(e.getMessage());
//e.printStackTrace();
}
}
}
查看生成的日誌文件,發現日誌寫入成功。
END
注意事項
新建log4j的配置文件時後綴名一定是.properties
初始化日誌生成器,載入日誌配置虧備文件時,配置文件的路徑不要弄錯了
B. log4j2 配置簡要分析
對於做後端的同學來說,log是分析bug、查找問題不可或缺的工具,好的日誌配置將使我們的開發工作如虎添翼。 把視線聚焦到java,常用的日誌工具有log4j,log4j2以及logback等,其中log4j2功能較為強大,運行效率也較高,我們就來用一個例子看一看log4j2的配置思路,下面就是這個配置文件:
我們看到,Configuration有2個屬性status和monitorInterval,它們分別是log4j2自身組件的日誌級別以及重新刷新配置文件的時間,通過配置status可以看到log4j2相關的日誌,配置monitorInterval可以通過修改配置文件來改變日誌配置。
從上面的log4j2.xml配置文件中,我們可以看到log4j2的配置文件中主要分為2塊,一塊為appender,描述了如何記錄日誌,另外一部分是log config,記錄了哪種日誌對應哪種級別。 而不同的LogConfig之間其實是有繼承關系的,子LogConfig會繼承parent的屬性,而所有LogConfig都繼承自Root LogConfig。所以即使只配置了root logger,你一樣可以在任何地方通過LoggerFactory.getLogger獲取一個logger對象,記錄日誌。
那麼日誌之間的繼承關系是由什麼決定的呢?看看上面的配置文件中root以外的2個logConfig,只有3個配置:日誌級別,name以及appender,從直覺上看應當是name最可能決定了LogConfig的繼承關系,其實也正是如此:com.foo是com.foo.Bar的父級;java是java.util的父級,是java.util.vector的祖先(注意name區分大小寫)。
理解了這一點,我們就能理清log4j2配置的思路:先配置一個root,讓所有需要使用日誌的logger繼承,然後對有特別需要的logger進行特殊的配置,比如我們希望 org.springframework 包只記錄error以及warn級別的log,再比如,我們希望能顯示mybatis執行的sql的日誌,都可以進行個性化的配置。
appender是LogConfig的重要組成部分,一個LogConfig可以使用多個appender,一個appender也可以被多個LogConfig使用,appender多種多樣,不同的appender也有不同的屬性和配置,難以一一闡述,需要使用時可以直接查看文檔來進行個性化配置。不過就filters可以單獨拿出來討論一下。filter有兩個重要屬性 onMatch 和 onMismatch 。可以有DENY、ACCEPT或NEUTRAL配置,DENY說明不由當前appender處理,ACCEPT說明由當前filter處理,而NEUTRAL說明如果按順序還有其他filter則由其他filter處理,如果當前filter已經是最後一個filter,則由當前appender處理。
log4j2的官方文檔建議記錄程序行為日誌非同步日誌,效率更高。因為非同步日誌使用的是無鎖技術,所以需要引入 Disruptor 。然後可以通過配置非同步的appender或Logger來實現非同步日誌:
或
動態修改日誌級別是一個很實用的功能,關於如果動態修改日誌級別,請參考美團的一篇文章: 日誌級別動態調整——小工具解決大問題
以上就是對log4j2的配置的一些總結,更多信息請關注官方文檔。
C. log4j的使用,即java該如何使用日誌文件
java使用日誌文件log4j的方法:
1、 新建一個Java工程,導入Log4j包,pom文件中對應的配置代碼如下:
<!-- log4j support -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2、resources目錄下創建log4j.properties文件
### 設置###
log4j.rootLogger = debug,stdout,D,E
### 輸出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 輸出DEBUG 級別以上的日誌到=/home/qi/logs/debug.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = /home/qi/logs/debug.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 輸出ERROR 級別以上的日誌到=/home/admin/logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =/home/admin/logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
3、輸出日誌的例子如下
package com.java.log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Log4JTest {
private static final Logger logger = LoggerFactory.getLogger(Log4JTest.class);
public static void main(String[] args) {
// 記錄debug級別的信息
logger.debug("This is debug message.");
// 記錄info級別的信息
logger.info("This is info message.");
// 記錄error級別的信息
logger.error("This is error message.");
}
}
4、輸出結果
首先,控制台輸入如下圖所示:
D. 為什麼java不用自帶的日誌工具而要用log4j
log4j對日誌的管理能力非常強大,可以根據自定義的日誌等級輸出日誌到指定位置,還可以對日誌文件進行切分。Java自帶的功能滿足不了需要。