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接口針對status定義了add、getCopyOfStatusList、getCount、clear方法,針對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實現(xiàn)了StatusManager接口,它使用statusList及statusListLock來操作status,使用statusListenerList及statusListenerListLock來操作StatusListener;另外針對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方法先加鎖,再判斷是否超出限制,沒有則添加到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聲明實現(xiàn)Status接口,它通過childrenList來存儲子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方法會回調(diào)listener,之后加鎖,再判斷是否超出限制,沒有則添加到statusList,超出則添加到tailBuffer;Status是個接口,它有一個抽象類為StatusBase,而InfoStatus、WarnStatus、ErrorStatus都繼承了StatusBase。
以上就是logback高效狀態(tài)管理器StatusManager源碼解析的詳細內(nèi)容,更多關(guān)于logback StatusManager狀態(tài)管理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
spring配置文件中util:properties和context:property-placeholder用法
這篇文章主要介紹了spring配置文件中util:properties和context:property-placeholder用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
Java實現(xiàn)讀取TXT和CSV文件內(nèi)容
這篇文章主要為大家詳細介紹了如何利用Java語言實現(xiàn)讀取TXT和CSV文件內(nèi)容的功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2023-02-02
基于springboot+jwt實現(xiàn)刷新token過程解析
這篇文章主要介紹了基于springboot+jwt實現(xiàn)刷新token過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-03-03
java微信開發(fā)API第三步 微信獲取以及保存接口調(diào)用憑證
這篇文章主要為大家詳細介紹了java微信開發(fā)API第二步,微信獲取以及保存接口調(diào)用憑證,感興趣的小伙伴們可以參考一下2016-06-06

