log4j appender自定义_log4j routingappender_fileappender log4j(7)

电脑杂谈  发布时间:2017-01-30 04:04:43  来源:网络整理

AsyncAppender并不会在每一次的doAppend()调用中都直接将消息输出,而是使用了buffer,即只有等到buffer中LoggingEvent实例到达bufferSize个的时候才真正的处理这些消息,当然我们也可以讲bufferSize设置成1,从而实现每一个LoggingEvent实例的请求都会直接执行。如果bufferSize设置过大,在应用程序异常终止时可能会丢失部分日志。

1 public static final int DEFAULT_BUFFER_SIZE = 128;

2 private final List buffer = new ArrayList();

3 private final Map discardMap = new HashMap();

4 private int bufferSize = DEFAULT_BUFFER_SIZE;

5 private final Thread dispatcher;

6 private boolean locationInfo = false;

7 private boolean blocking = true;

对其他字段,discardMap用于存放当当前LoggingEvent请求数已经超过bufferSize或当前线程被中断的情况下能继续保留这些日志信息;locationInfo用于设置是否需要保留位置信息;blocking用于设置在消费者正在处理时,是否需要生产者“暂停”下来,默认为true;而dispatcher即是消费者线程,它在构建AsyncAppender是启动,每次buffer这个list,如果发现buffer中存在LoggingEvent实例,则将所有buffer和discardMap中的LoggingEvent实例拷贝到数组中,清空buffer和discardMap,并调用AsyncAppender内部注册的Appender实例打印日志。

1 public void run() {

2boolean isActive = true;

3try {

4while (isActive) {

5LoggingEvent[] events = null;

6synchronized (buffer) {

7int bufferSize = buffer.size();

8isActive = !parent.closed;

9

10while ((bufferSize == 0) && isActive) {

11buffer.wait();

12bufferSize = buffer.size();

13isActive = !parent.closed;

14}

15if (bufferSize > 0) {

16events = new LoggingEvent[bufferSize

17+ discardMap.size()];

18buffer.toArray(events);

19int index = bufferSize;

20

21for (Iterator iter = discardMap.values().iterator(); iter

22.hasNext();) {

23events[index++] = ((DiscardSummary) iter.next())

24.createEvent();

25}

26buffer.clear();

27discardMap.clear();


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-29497-7.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...