logback高效狀態(tài)管理器StatusManager源碼解析
序
本文主要研究一下logback的StatusManager
StatusManager
ch/qos/logback/core/status/StatusManager.java
public interface StatusManager {
/**
* Add a new status message.
*
* @param status
*/
void add(Status status);
/**
* Obtain a copy of the status list maintained by this StatusManager.
*
* @return
*/
List<Status> getCopyOfStatusList();
/**
* Return the highest level of all the statii.
*
* @return
*/
// int getLevel();
/**
* Return the number of status entries.
*
* @return
*/
int getCount();
/**
* Add a status listener.
*
* @param listener
*/
/**
* Add a status listener. The StatusManager may decide to skip installation if
* an earlier instance was already installed.
*
* @param listener
* @return true if actually added, false if skipped
*/
boolean add(StatusListener listener);
/**
* ); Remove a status listener.
*
* @param listener
*/
void remove(StatusListener listener);
/**
* Clear the list of status messages.
*/
void clear();
/**
* Obtain a copy of the status listener list maintained by this StatusManager
*
* @return
*/
List<StatusListener> getCopyOfStatusListenerList();
}StatusManager接口針對(duì)status定義了add、getCopyOfStatusList、getCount、clear方法,針對(duì)StatusListener定義了add、remove、getCopyOfStatusListenerList方法
BasicStatusManager
ch/qos/logback/core/BasicStatusManager.java
public class BasicStatusManager implements StatusManager {
final protected List<Status> statusList = new ArrayList<Status>();
final protected CyclicBuffer<Status> tailBuffer = new CyclicBuffer<Status>(TAIL_SIZE);
final protected LogbackLock statusListLock = new LogbackLock();
final protected List<StatusListener> statusListenerList = new ArrayList<StatusListener>();
final protected LogbackLock statusListenerListLock = new LogbackLock();
//......
}BasicStatusManager實(shí)現(xiàn)了StatusManager接口,它使用statusList及statusListLock來(lái)操作status,使用statusListenerList及statusListenerListLock來(lái)操作StatusListener;另外針對(duì)status還提供了tailBuffer
add status
public void add(Status newStatus) {
// LBCORE-72: fire event before the count check
fireStatusAddEvent(newStatus);
count++;
if (newStatus.getLevel() > level) {
level = newStatus.getLevel();
}
synchronized (statusListLock) {
if (statusList.size() < MAX_HEADER_COUNT) {
statusList.add(newStatus);
} else {
tailBuffer.add(newStatus);
}
}
}add方法先加鎖,再判斷是否超出限制,沒(méi)有則添加到statusList,超出則添加到tailBuffer
getCopyOfStatusList
public List<Status> getCopyOfStatusList() {
synchronized (statusListLock) {
List<Status> tList = new ArrayList<Status>(statusList);
tList.addAll(tailBuffer.asList());
return tList;
}
}getCopyOfStatusList則加鎖,然后從statusList及tailBuffer獲取status
clear
public void clear() {
synchronized (statusListLock) {
count = 0;
statusList.clear();
tailBuffer.clear();
}
}clear則加鎖,重置count,清空statusList及tailBuffer
add listener
public boolean add(StatusListener listener) {
synchronized (statusListenerListLock) {
if (listener instanceof OnConsoleStatusListener) {
boolean alreadyPresent = checkForPresence(statusListenerList, listener.getClass());
if (alreadyPresent)
return false;
}
statusListenerList.add(listener);
}
return true;
}
private boolean checkForPresence(List<StatusListener> statusListenerList, Class<?> aClass) {
for (StatusListener e : statusListenerList) {
if (e.getClass() == aClass)
return true;
}
return false;
}add listener方法先加鎖,然后判斷是否已經(jīng)存在,不存在則添加到statusListenerList
remove
public void remove(StatusListener listener) {
synchronized (statusListenerListLock) {
statusListenerList.remove(listener);
}
}remove則先加鎖,然后從statusListenerList中移除
getCopyOfStatusListenerList
public List<StatusListener> getCopyOfStatusListenerList() {
synchronized (statusListenerListLock) {
return new ArrayList<StatusListener>(statusListenerList);
}
}getCopyOfStatusListenerList則先加鎖然后拷貝statusListenerList
Status
ch/qos/logback/core/status/Status.java
public interface Status {
int INFO = 0;
int WARN = 1;
int ERROR = 2;
int getLevel();
int getEffectiveLevel();
Object getOrigin();
String getMessage();
Throwable getThrowable();
/**
* @eprecated. Use getTimestamp instead.
* @return
*/
@Deprecated
default Long getDate() {
return getTimestamp();
}
long getTimestamp();
boolean hasChildren();
void add(Status child);
boolean remove(Status child);
Iterator<Status> iterator();
}Status接口定義了getLevel、getEffectiveLevel、getOrigin、getMessage、getThrowable、getTimestamp、hasChildren、add、remove、iterator方法
StatusBase
ch/qos/logback/core/status/StatusBase.java
abstract public class StatusBase implements Status {
static private final List<Status> EMPTY_LIST = new ArrayList<Status>(0);
int level;
final String message;
final Object origin;
List<Status> childrenList;
Throwable throwable;
long timestamp;
public synchronized void add(Status child) {
if (child == null) {
throw new NullPointerException("Null values are not valid Status.");
}
if (childrenList == null) {
childrenList = new ArrayList<Status>();
}
childrenList.add(child);
}
public synchronized boolean hasChildren() {
return ((childrenList != null) && (childrenList.size() > 0));
}
public synchronized Iterator<Status> iterator() {
if (childrenList != null) {
return childrenList.iterator();
} else {
return EMPTY_LIST.iterator();
}
}
public synchronized boolean remove(Status statusToRemove) {
if (childrenList == null) {
return false;
}
// TODO also search in childrens' children
return childrenList.remove(statusToRemove);
}
public synchronized int getEffectiveLevel() {
int result = level;
int effLevel;
Iterator<Status> it = iterator();
Status s;
while (it.hasNext()) {
s = (Status) it.next();
effLevel = s.getEffectiveLevel();
if (effLevel > result) {
result = effLevel;
}
}
return result;
}
//......
}StatusBase聲明實(shí)現(xiàn)Status接口,它通過(guò)childrenList來(lái)存儲(chǔ)子status
InfoStatus
ch/qos/logback/core/status/InfoStatus.java
public class InfoStatus extends StatusBase {
public InfoStatus(String msg, Object origin) {
super(Status.INFO, msg, origin);
}
public InfoStatus(String msg, Object origin, Throwable t) {
super(Status.INFO, msg, origin, t);
}
}InfoStatus繼承了StatusBase,它的level為Status.INFO
WarnStatus
ch/qos/logback/core/status/WarnStatus.java
public class WarnStatus extends StatusBase {
public WarnStatus(String msg, Object origin) {
super(Status.WARN, msg, origin);
}
public WarnStatus(String msg, Object origin, Throwable t) {
super(Status.WARN, msg, origin, t);
}
}WarnStatus繼承了StatusBase,它的level為Status.WARN
ErrorStatus
ch/qos/logback/core/status/ErrorStatus.java
public class ErrorStatus extends StatusBase {
public ErrorStatus(String msg, Object origin) {
super(Status.ERROR, msg, origin);
}
public ErrorStatus(String msg, Object origin, Throwable t) {
super(Status.ERROR, msg, origin, t);
}
}ErrorStatus繼承了StatusBase,它的level為Status.ERROR
小結(jié)
logback定義了StatusManager用于管理status及其listener,其add方法會(huì)回調(diào)listener,之后加鎖,再判斷是否超出限制,沒(méi)有則添加到statusList,超出則添加到tailBuffer;Status是個(gè)接口,它有一個(gè)抽象類(lèi)為StatusBase,而InfoStatus、WarnStatus、ErrorStatus都繼承了StatusBase。
以上就是logback高效狀態(tài)管理器StatusManager源碼解析的詳細(xì)內(nèi)容,更多關(guān)于logback StatusManager狀態(tài)管理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Mapper層繼承BaseMapper<T>需要引入的pom依賴(lài)方式
這篇文章主要介紹了Mapper層繼承BaseMapper<T>需要引入的pom依賴(lài)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
SpringBoot如何接收Post請(qǐng)求Body里面的參數(shù)
這篇文章主要介紹了SpringBoot如何接收Post請(qǐng)求Body里面的參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Java操作集合工具類(lèi)Collections使用詳解
這篇文章主要介紹了java操作集合工具類(lèi)Collections使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
java實(shí)現(xiàn)圖書(shū)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)圖書(shū)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03
Java語(yǔ)法中Lambda表達(dá)式無(wú)法拋出異常的解決
這篇文章主要介紹了Java語(yǔ)法中Lambda表達(dá)式無(wú)法拋出異常的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Spring?BeanFactory容器的構(gòu)建和使用示例詳解
BeanFactory是Spring框架中的一部分,它提供了IoC(控制反轉(zhuǎn))的實(shí)現(xiàn)機(jī)制,下面小編就來(lái)和大家簡(jiǎn)單聊聊BeanFactory容器的構(gòu)建和使用示例吧2023-07-07
spring boot使用自定義的線程池執(zhí)行Async任務(wù)
這篇文章主要介紹了spring boot使用自定義的線程池執(zhí)行Async任務(wù)的相關(guān)資料,需要的朋友可以參考下2018-02-02

