日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

java日志模块_Java源码初探_logging日志模块实现

發布時間:2024/9/30 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java日志模块_Java源码初探_logging日志模块实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、用途

程序中記錄日志,打印到控制臺、文件等方式,記錄過程可根據日志級別做篩選,日志格式可以自定義。

大概結構如下所示:

簡要說明各個模塊:

(1) LogManager:管理LoggerContext及Logger,可以添加、獲取Logger。

(2) LoggerContext: 保存所有Logger,用于添加及獲取Logger,由LoggerManager管理。LoggerContext中同時保存了Logger的弱引用,在釋放Logger時使用到。

(3) Logger: 記錄日志的對象,提供接口實現對日志消息以不同的日志級別進行記錄,管理Handler、Formatter、Filter等。

(4) Handler: 記錄日志真正的對象,包括FileHandler(記錄到文件)、ConsoleHandler(記錄到控制臺)、StreamHandler(記錄到流)、SocketHandler(通過socket發送日志?)等。

(5) Formatter: 處理日志的格式,包括SimpleFormatter(簡單格式記錄,顯示時間、級別、線程、日志信息等)、XMLFormatter(以xml格式記錄日志)等。

(6) Filter: 實現日志的過濾功能,通過自定義Filter,實現對某些日志的過濾處理。

(7) ErrorManager: 記錄日志出錯時的處理對象?

(8) LogRecord: 對日志消息的抽象。

二、詳細介紹(結合源碼)

詳細描述如下:

(1)日志管理:

LoggerManager主要用來管理LogContext以及logger。

LoggerManager維護變量主要有:

(a) LogManager manager

manager對象單例,用于LogManager內部其他方法調用。在靜態構造函數中實例化,在getLogManager()方法被調用時初始化:

1 public staticLogManager getLogManager() {2 if (manager != null) {3 manager.ensureLogManagerInitialized();4 }5 returnmanager;6 }7

8

9 public voidensureLogManagerInitialized() //簡要描述10 {11 //若未初始化

12 synchronized(this)13 {14 owner.readPrimordialConfiguration(); //讀配置文件初始化manager

15 owner.rootLogger = owner.new RootLogger(); //添加rootLogger

16 owner.addLogger(owner.rootLogger);17 final Logger global = Logger.global; //添加globalLogger

18 owner.addLogger(global);19 }20 }

(b) Properties props

用于讀配置文件內容,配合完成初始化。上述readPrimordialConfiguration()函數即使用了Props獲取配置。

主要針對配置文件中對Logger及Handler等定義,進行動態設置。

默認的配置文件如下:

handlers=java.util.logging.ConsoleHandler

.level=INFO

java.util.logging.FileHandler.pattern= %h/java%u.log

java.util.logging.FileHandler.limit= 50000java.util.logging.FileHandler.count= 1java.util.logging.FileHandler.formatter=java.util.logging.XMLFormatter

java.util.logging.ConsoleHandler.level=INFO

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

com.xyz.foo.level= SEVERE

主要對默認Handler進行配置(ConsoleHanlder,默認只打印日志到控制臺),設置FileHandler的一些配置(文件名格式、寫文件大小限制、使用文件數量、日志格式為xml),設置ConsoleHandler控制臺打印的格式為普通格式(SimpleFormatter)、打印日志級別最低為INFO。

(c)? LggerContext userContext

LogContext是LogManager的內部類。

LogManager中包含默認兩個LoggerContext: userContext與systemContext,用戶添加logger皆是放入userContext。

LoggerContext內部,Logger被放入LogNode root中以鏈表形式存儲。

該類對LogManager開放接口:

添加Logger: addLogger

synchronized boolean addLocalLogger(Logger logger, boolean addDefaultLoggersIfNeeded) { //簡要說明

final LogManager owner = getOwner(); //設置logmanager

logger.setLogManager(owner);

LoggerWeakRef ref = owner.new LoggerWeakRef(logger);

namedLoggers.put(name, ref); //保存弱引用

Level level = owner.getLevelProperty(name + ".level", null); //設置Level

if (level != null && !logger.isLevelInitialized()) {

doSetLevel(logger, level);

}

processParentHandlers(logger, name); //設置父Logger(rootLogger)

Logger parent = getParentLogger();

if (parent != null) {

doSetParent(logger, parent);

}

return true;

}

查找Logger: findLogger

(d) logManager.addLogger(Logger logger)方法

void addLogger(Logger logger)

{

final String name = logger.getName();

if (name == null) {

throw new NullPointerException();

}

LoggerContext cx = getUserContext();

if (cx.addLocalLogger(logger)) {

loadLoggerHandlers(logger, name, name + ".handlers"); //根據配置文件加載logger對應handler

}

}

(e) logManager.demandLogger

調用loggerContext接口,構造logger并添加至loggerContext。

(2) 日志打印

(a) name: String

logger的名稱。

例如:Logger logger = Logger.getLogger("test"); 則,logger名稱為"test";

(b) handlers: List、addHanlder(Handler) //設置日志處理對象

Handler是日志處理類的基類,子類主要有ConsoleHandler、FileHandler、SocketHandler、StreamHandler、MemoryHandler。

Handler負責將日志消息寫到指定位置。

該變量負責維護logger上的handlers,通過addHandler(Handler)添加,removeHandler(Handler)移除

一個logger具備多個handlers,因此,一條日志可依據定制情況打印到多個位置。

例如,通過這樣,可以為logger添加具備特定formatter、loglevel的handlers:

Logger logger = Logger.getLogger(loggerName);

logger.setLevel(Level.INFO);

//添加文件輸出xml格式

Handler fileXMLhandler = new FileHandler("E:\\logging_XMLFormat.file");

Formatter xmlFormatter = new XMLFormatter();

fileXMLhandler.setFormatter(xmlFormatter);

handler.setLevel(Level.WARNING);

logger.addHandler(handler);

//添加文件輸出普通格式

Handler fileSimpleHandler = new FileHandler("E:\\logging_simpleFormat.file");

Formatter formatter = new SimpleFormatter();

handler.setFormatter(formatter);

handler.setLevel(Level.INFO);

logger.addHandler(handler);

//添加控制臺輸出

Handler consoleHandler = new ConsoleHandler();

logger.addHandler(consoleHandler);

(c) Filter、Handler.setFilter(Filter) //設置過濾器

用于過濾logRecord。

接口包含:

boolean isLoggable(in LogRecord);

實現Filter自定義設置過濾規則。

(d) Logger.getLogger(String name) //獲取logger

獲取logger(若無,則先添加后返回)

eg.

Logger logger = Logger.getLogger("testLogger");

logger.info("this is a test msg");

(e) Logger.log(LogRecord record) //日志打印過程

負責將指定log內容記錄到日志。

此處LogRecord是對日志消息的抽象,結構如下:

主要包含日志內容String msg、日志級別Level level

日志打印函數如下:

public void log(LogRecord record) {

//檢查level

if (!isLoggable(record.getLevel())) {

return;

}

//檢查過濾

Filter theFilter = filter;

if (theFilter != null && !theFilter.isLoggable(record)) {

return;

}

//處理日志打印

Logger logger = this;

while (logger != null) {

//獲取所有Handlers

final Handler[] loggerHandlers = Logger.getHandlers();

//遍歷所有Handlers,處理logRecord

for (Handler handler : loggerHandlers) {

handler.publish(record);

}

//判斷是否使用parentLogger處理,若否,結束流程

final boolean useParentHdls = logger.useParentHandlers;

if (!useParentHdls) {

break;

}

logger = isSystemLogger ? logger.parent : logger.getParent(); //通過parentLogger繼續處理

}

}

至此,java 的logging工具中的主要模塊描述結束。

有問題敬請反饋,多謝!

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的java日志模块_Java源码初探_logging日志模块实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。