public synchronized void doAppend(E eventObject) { // prevent re-entry. if (guard) { return; } try { guard = true; if (!this.started) { if (statusRepeatCount++ < ALLOWED_REPEATS) { addStatus(new WarnStatus( "Attempted to append to non started appender [" + name + "].", this)); } return; } if (getFilterChainDecision(eventObject) == FilterReply.DENY) { return; } // ok, we now invoke derived class' implementation of append this.append(eventObject); } catch (Exception e) { if (exceptionCount++ < ALLOWED_REPEATS) { addError("Appender [" + name + "] failed to append.", e); } } finally { guard = false; } }
經過代碼能夠知道AppenderBase類是的doAppender()是同步線程安全的;並非全部時候都須要同步,所以當不須要同步的時候可使用UnsynchronizedAppenderBase類。java
logback-core模塊是logback的基礎。下面講解一下能夠直接使用的appender。安全
logback-core模塊中的appender種類:OutputStreamAppender、ConsoleAppender、FileAppender、RollingFileAppender。網絡
你有沒有發現:logback-core中的appender的目的地都是本地啊,那有沒有能夠發送到網絡上的appender呀,固然有,在logback-classic模塊中,下一節介紹。app
這些appender之間的關係以下所示:this
這些屬性是須要配置的,所以咱們能夠經過在xml配置文件中的<appender>標籤中建立以屬性名爲標籤名的標籤,併爲這些標籤進行配置。spa
注意:<appender>中不一樣的class屬性值代表使用不一樣的目的地,所以會有不一樣的參數,從而表現出在配置文件中的標籤有所差別。線程
這些屬性是須要配置的,所以咱們能夠經過在xml配置文件中的<appender>標籤中建立以屬性名爲標籤名的標籤,併爲這些標籤進行配置。3d
注意:<appender>中不一樣的class屬性值代表使用不一樣的目的地,所以會有不一樣的參數,從而表現出在配置文件中的標籤有所差別。code
這些屬性是須要配置的,所以咱們能夠經過在xml配置文件中的<appender>標籤中建立以屬性名爲標籤名的標籤,併爲這些標籤進行配置。xml
注意:<appender>中不一樣的class屬性值代表使用不一樣的目的地,所以會有不一樣的參數,從而表現出在配置文件中的標籤有所差別。
下面講解一下fileNamePattern的部分值及做用:
注意:全部「\」和「/」都被解釋爲目錄分隔符。任何須要的目錄都會被建立。因此你能夠輕鬆地把記錄文件放到不一樣的目錄。
在logback-classic模塊中也存在一些appender,而且這些appender的目的地不是本地。下面詳細瞭解一下這些appender。
logback-classic模塊中的appender分類:SocketAppender、DBAppender、SMTPAppender、SyslogAppender、SiftingAppender以及基於JMS的兩種Appender(JMSTopicAppender和JMSQueueAppender,他們繼承自JMSAppenderBase類);提供了總共7種appender;另外還能夠自定義appender,須要經過繼承AppenderBase來實現自定義的appender。