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。