詳解記錄Java Log的幾種方式
在Java中記錄日志的方式有如下幾種:
一、System.out.println(最簡(jiǎn)單)
1、輸出到控制臺(tái):System.out.println("XXX");
2、輸出到指定文件:
import java.io.PrintStream;
PrintStream ps = new PrintStream("D:\\test.txt");
System.setOut(ps);
System.out.println("XXX");
二、java.util.logging(相對(duì)簡(jiǎn)單)
JDK自帶的logging.jar中的方法。通過(guò)位于JDK安裝路徑下的jre/lib/logging.properties文件進(jìn)行配置。
1、默認(rèn)配置如下:
handlers= java.util.logging.ConsoleHandler .level= INFO # default file output is in user's home directory. java.util.logging.FileHandler.pattern = %h/java%u.log java.util.logging.FileHandler.limit = 50000 java.util.logging.FileHandler.count = 1 java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter # Limit the message that are printed on the console to INFO and above. java.util.logging.ConsoleHandler.level = INFO java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
默認(rèn)是輸出到控制臺(tái),如果既想在控制臺(tái),又想在文件中,要修改如下配置:
handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler
Logger的級(jí)別按降序排序如下:
- SEVERE(最高值)
- WARNING
- INFO
- CONFIG
- FINE
- FINER
- FINEST(最低值)
默認(rèn)所有l(wèi)og的輸出級(jí)別是INFO(.level= INFO),比INFO更低的日志不會(huì)顯示。
控制臺(tái)的Log輸出級(jí)別可以特殊控制,默認(rèn)也是INFO,可以修改如下配置:
java.util.logging.ConsoleHandler.level = INFO
2、實(shí)例
(1)輸出到控制臺(tái):
Logger log = Logger.getLogger("testLog");
log.setLevel(Level.WARNING);
log.warning("xxxx testLog warning");
輸出結(jié)果:
![]()
(2)輸出到文件:
FileHandler fileHandler;//文件控制器
try {
fileHandler = new FileHandler("D:\\temp\\text.log");
fileHandler.setLevel(Level.INFO);
fileHandler.setFormatter(new Formatter() {//定義一個(gè)匿名類
//Formatter 接受 LogRecord,并將它轉(zhuǎn)換為一個(gè)字符串。
@Override
public String format(LogRecord record) {
Date date = new Date();
String sDate = date.toString();
return "[" + sDate + "]" + "[" + record.getLevel() + "]" + ":" + record.getMessage() + "\n";
}
});
Logger log = Logger.getLogger("testLog");
log.addHandler(fileHandler);
log.info("aaa");
} catch (SecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
默認(rèn)狀況下, 日志會(huì)打印到控制臺(tái)。添加 filehandler 后, 會(huì)同時(shí)寫入文件。輸出結(jié)果:
![]()

三、log4j(最強(qiáng)大)
可以通過(guò)配置 .properties 或是 .xml 的文件, 配置日志的目的地,格式等等。具體配置不在此處詳述。
1、Log4J的輸出級(jí)別按降序排序如下:
- OFF 最高等級(jí),關(guān)閉日志
- FATAL 可能導(dǎo)致應(yīng)用中止的嚴(yán)重事件錯(cuò)誤
- ERROR 嚴(yán)重錯(cuò)誤,主要是程序錯(cuò)誤
- WARN 一般警告
- INFO 一般顯示信息
- DEBUG 調(diào)試信息
- TRACE 比DEBUG更細(xì)粒度的事件信息
- ALL 最低等級(jí)
2、實(shí)例
import org.apache.log4j.Logger;
public class Log4jTest {
private static Logger log = Logger.getLogger(Log4jTest.class);
public void log() {
log.info("hello this is log4j info log");
}
public static void main(String[] args) {
Log4jTest test = new Log4jTest();
test.log();
}
}
除了上述幾種,還存在logback等其他的日志框架,對(duì)于開發(fā)者而言,每種日志都有不同的寫法。如果以實(shí)際的日志框架來(lái)進(jìn)行編寫,之后更換日志系統(tǒng)就很麻煩。
由此誕生了以下的門面類日志框架(它們都不是日志的最終實(shí)現(xiàn),只是一套規(guī)范),將系統(tǒng)和具體的日志實(shí)現(xiàn)框架解耦合。

四、commons-logging(全稱:Jakarta Commons Logging)
commons-logging是為那些需要建立在不同環(huán)境下使用不同日志架構(gòu)的組件或庫(kù)的開發(fā)者創(chuàng)建的,由commons-logging在運(yùn)行時(shí)決定使用哪種日志架構(gòu)。
默認(rèn)的LogFactory是按照下列的步驟去發(fā)現(xiàn)并決定那個(gè)日志工具將被使用的(按照順序,尋找過(guò)程會(huì)在找到第一個(gè)工具時(shí)中止):
- 首先在classpath下尋找自己的配置文件commons-logging.properties,使用其中定義的Log實(shí)現(xiàn)類;
- 找不到commons-logging.properties文件,則在查找是否已定義系統(tǒng)環(huán)境變量org.apache.commons.logging.Log,使用其定義的Log實(shí)現(xiàn)類;
- 否則,查看classpath中是否有Log4j的包,有則自動(dòng)使用Log4j作為日志實(shí)現(xiàn)類;
- 否則,使用JDK自身的日志實(shí)現(xiàn)類(JDK1.4以后才有日志實(shí)現(xiàn)類);
- 否則,使用commons-logging自己提供的一個(gè)簡(jiǎn)單的日志實(shí)現(xiàn)類SimpleLog;
在common-logging.properties文件中設(shè)置實(shí)現(xiàn)Log接口的類:
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
commons-logging結(jié)合Log4J的實(shí)例
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class JCLTest {
private static Log log = LogFactory.getLog(JCLTest.class);
public void log() {
log.info("hello this is JCL info log");
}
public static void main(String[] args) {
JCLTest test = new JCLTest();
test.log();
}
}
五、slf4j(全稱:Simple Logging Facade for Java,簡(jiǎn)單日志門面)
SLF4j+Log4j 與 JCL+Log4J 的使用方式差不多,主要差異就在 SLF4J 用 jar 來(lái)告知用哪種日志實(shí)現(xiàn),而 JCL 是通過(guò)配置文件來(lái)獲得該選擇哪個(gè)日志實(shí)現(xiàn)。
實(shí)例
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Test {
private static final Logger log = LoggerFactory.getLogger(Test.class);
public void test() {
log.info("hello this is {} info log", "SLF4J");
}
}
到此這篇關(guān)于詳解記錄Java Log的幾種方式的文章就介紹到這了,更多相關(guān)Java Log內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
GateWay動(dòng)態(tài)路由與負(fù)載均衡詳細(xì)介紹
這篇文章主要介紹了GateWay動(dòng)態(tài)路由與負(fù)載均衡,GateWay支持自動(dòng)從注冊(cè)中心中獲取服務(wù)列表并訪問(wèn),即所謂的動(dòng)態(tài)路由2022-11-11
java實(shí)現(xiàn)在pdf模板的指定位置插入圖片
這篇文章主要為大家詳細(xì)介紹了java如何實(shí)現(xiàn)在pdf模板的指定位置插入圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10
解決調(diào)用ftpClient.retrieveFileStream(String?remoteFilePath)第二次讀
這篇文章主要給大家介紹了關(guān)于如何解決調(diào)用ftpClient.retrieveFileStream(String?remoteFilePath)第二次讀取為空問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08
Java將日期類型Date時(shí)間戳轉(zhuǎn)換為MongoDB的時(shí)間類型數(shù)據(jù)
今天小編就為大家分享一篇關(guān)于Java將日期類型Date時(shí)間戳轉(zhuǎn)換為MongoDB的時(shí)間類型數(shù)據(jù),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10
spring boot 監(jiān)控處理方案實(shí)例詳解
這篇文章主要介紹了spring boot 監(jiān)控處理方案的相關(guān)資料,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07
IDEA創(chuàng)建parent項(xiàng)目(聚合項(xiàng)目)
這篇文章主要介紹了IDEA創(chuàng)建parent項(xiàng)目(聚合項(xiàng)目),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08

