java自带logger_Java中自帶的Logger使用

在Java中,自帶了一個 java.util.logging.Logger, 由於有log4j的存在,這個再帶的logger貌似使用比較少。下面就簡單接收一下,這個logger的使用方法。

首先看代碼, 定義一個 LogUtil 用來返回一個自定義的log

class LogUtil {

public static Logger getLogger() {

System.setProperty("java.util.logging.config.file", "mylog.properties");

Logger log = Logger.getLogger("myLogger");

log.setLevel(Level.ALL);

return log;

}

}

上面代碼中 mylog.properties 是自定義log的配置文件,使用的相對路徑,放到工作目錄,也就是 System.getProperty("user.dir") 目錄下;當然也可以使用絕對路徑,可以放到任意目錄下。 把這個文件,作為系統屬性,設置給

java.util.logging.config.file

當然,也可在命令行指定這個屬性 java -Djava.util.logging.config.file  mylog.properties XXXClass

mylog.properties 配置內容如下:

myLogger.handlers= java.util.logging.ConsoleHandler, java.util.logging.FileHandler

myLogger.level= ALL

java.util.logging.ConsoleHandler.level = ALL

java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

java.util.logging.SimpleFormatter.format=[%1$tc][%2$s]: %4$s: %5$s%6$s%n

java.util.logging.FileHandler.pattern = C:\\Users\\myname\\myworkspace\\Demo\\mylog-%u.log

java.util.logging.FileHandler.limit = 50000

java.util.logging.FileHandler.count = 1

java.util.logging.FileHandler.level = FINE

java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter

這里配置了一個 名字叫 myLogger 的logger,給它指定的2個handlers, 並把myLogger.level 設置為ALL。

myLogger.handlers= java.util.logging.ConsoleHandler, java.util.logging.FileHandler

myLogger.level= ALL

ConsoleHandler 是把log輸出到 控制台,FileHandler 是把log輸出到文件。

每個Handler又可以定義自己的 level。log level的基本如下:

SEVERE (highest value)

WARNING

INFO

CONFIG

FINE

FINER

FINEST (lowest value)

另外還有兩個值, Level.OFF 和 Level.ALL

myLogger.level 是總開關,如果myLogger.level設置為  OFF, 它handler無論設置什么值,都不會有輸出。 如果myLogger.level設置為 FINE, 只有FINE 以上的log才會輸出,即使Handler 把Level是指為ALL。

上面配置中,ConsoleHandler 使用了單行文本輸出,FileHandler 使用了XML作為輸出。

在ConsoleHandler 中, log輸出采用 java.util.logging.SimpleFormatter  類格式化,實際是是調用如下方法格式化的。

String.format(format, date, source, logger, level, message, thrown);

格式化表達式中:

%1$ 代表 date,%2$ 代表 source, 以此類推,每一個%n$ 分別代表 String.format(....) 的一個參數。

例如:

java.util.logging.SimpleFormatter.format=[%1$tc][%2$s]: %4$s: %5$s%6$s%n

輸出的log信息類似下面的字符串

[星期二 五月 31 17:14:15 CST 2016][log.LogDemo testLog]: INFO: Info: Hellow World!

在上面 FileHandler 中, 輸出log文件名為

java.util.logging.FileHandler.pattern = C:\\Users\\myname\\myworkspace\\Demo\\mylog-%u.log在定義log文件時候,可以使用如下特殊標記"/" the local pathname separator

"%t" the system temporary directory

"%h" the value of the "user.home" system property

"%g" the generation number to distinguish rotated logs

"%u" a unique number to resolve conflicts

"%%" translates to a single percent sign "%"

這里FileHandler  我們定義為 XMLFormatter, 我們完全可以把它給成和 ConsoleHandler  一樣, 定義成 SimpleFormatter。

現在來看客戶端如何使用我們自定義的Logger, 代碼如下:

public class LogDemo {

public static void main(String[] args) {

Logger log1 = LogUtil.getLogger();

Logger log2 = LogUtil.getLogger();

System.out.println(log1 == log2 ? "log1 = log2" : "log1 != log2");

LogDemo.testLog(log1);

}

private static void testLog(Logger log) {

System.out.println("Log:" + log.getName());

log.info("Info: Hellow World!");

log.warning("warning: Hellow World!");

log.info("logname = " + log.getName());

log.info("handlers = " + log.getHandlers().length);

for (Handler h : log.getHandlers()) {

log.info(h.getClass() + " " + h.getLevel());

}

log.fine("Log Fine");

}

}

運行后輸出:

log1 = log2

Log:myLogger

[星期二 五月 31 17:14:15 CST 2016][log.LogDemo testLog]: INFO: Info: Hellow World!

[星期二 五月 31 17:14:15 CST 2016][log.LogDemo testLog]: WARNING: warning: Hellow World!

[星期二 五月 31 17:14:15 CST 2016][log.LogDemo testLog]: INFO: logname = myLogger

[星期二 五月 31 17:14:15 CST 2016][log.LogDemo testLog]: INFO: handlers = 2

[星期二 五月 31 17:14:15 CST 2016][log.LogDemo testLog]: INFO: class java.util.logging.ConsoleHandler ALL

[星期二 五月 31 17:14:15 CST 2016][log.LogDemo testLog]: INFO: class java.util.logging.FileHandler FINE

[星期二 五月 31 17:14:15 CST 2016][log.LogDemo testLog]: FINE: Log Fine

在我們的客戶端程序中, 連續調用了兩次 getLogger()

Logger log1 = LogUtil.getLogger();

Logger log2 = LogUtil.getLogger();從輸出可以看出,它們返回的是同一個對象

log1 = log2

所以對於名字為“myLogger” 這個logger實例, 它是一個單例。虛擬機只會創建一個名字為 “myLogger”的logger 對象。

下面是 FileHandler 輸出到文件中的內容

C:\Users\myname\myworkspace\Demo\mylog-0.log

2016-05-31T17:56:09

1464688569941

0

myLogger

INFO

log.LogDemo

testLog

1

Info: Hellow World!

2016-05-31T17:56:09

1464688569943

1

myLogger

WARNING

log.LogDemo

testLog

1

warning: Hellow World!

2016-05-31T17:56:09

1464688569943

2

myLogger

INFO

log.LogDemo

testLog

1

logname = myLogger

2016-05-31T17:56:09

1464688569944

3

myLogger

INFO

log.LogDemo

testLog

1

handlers = 2

2016-05-31T17:56:09

1464688569944

4

myLogger

INFO

log.LogDemo

testLog

1

class java.util.logging.ConsoleHandler ALL

2016-05-31T17:56:09

1464688569945

5

myLogger

INFO

log.LogDemo

testLog

1

class java.util.logging.FileHandler FINE

2016-05-31T17:56:09

1464688569946

6

myLogger

FINE

log.LogDemo

testLog

1

Log Fine

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值