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è)抽象類為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依賴方式
這篇文章主要介紹了Mapper層繼承BaseMapper<T>需要引入的pom依賴方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01SpringBoot如何接收Post請(qǐng)求Body里面的參數(shù)
這篇文章主要介紹了SpringBoot如何接收Post請(qǐng)求Body里面的參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03java實(shí)現(xiàn)圖書(shū)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)圖書(shū)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03Java語(yǔ)法中Lambda表達(dá)式無(wú)法拋出異常的解決
這篇文章主要介紹了Java語(yǔ)法中Lambda表達(dá)式無(wú)法拋出異常的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Spring?BeanFactory容器的構(gòu)建和使用示例詳解
BeanFactory是Spring框架中的一部分,它提供了IoC(控制反轉(zhuǎn))的實(shí)現(xiàn)機(jī)制,下面小編就來(lái)和大家簡(jiǎn)單聊聊BeanFactory容器的構(gòu)建和使用示例吧2023-07-07spring boot使用自定義的線程池執(zhí)行Async任務(wù)
這篇文章主要介紹了spring boot使用自定義的線程池執(zhí)行Async任務(wù)的相關(guān)資料,需要的朋友可以參考下2018-02-02