mirror of https://github.com/micromata/borgbackup-butler.git

Kai Reinhard
15.39.2021 d80a4b3ab35af575fd06d4e2fb9a3726418c6727
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package de.micromata.borgbutler.server.logging;
 
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.spi.LoggingEvent;
 
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
 
public class Log4jMemoryAppender extends AppenderSkeleton {
    private static final int MAX_RESULT_SIZE = 1000;
    private static final int QUEUE_SIZE = 10000;
    private static Log4jMemoryAppender instance;
 
    private int lastLogEntryOrderNumber = -1;
 
    public static Log4jMemoryAppender getInstance() {
        return instance;
    }
 
    public Log4jMemoryAppender() {
        if (instance != null) {
            throw new IllegalArgumentException("Log4jMemoryAppender shouldn't be instantiated twice!");
        }
        instance = this;
    }
 
    /**
     * For test purposes.
     */
    Log4jMemoryAppender(boolean ignoreMultipleInstance) {
 
    }
 
    FiFoBuffer<LoggingEventData> queue = new FiFoBuffer<>(QUEUE_SIZE);
 
    @Override
    protected void append(LoggingEvent event) {
        LoggingEventData eventData = new LoggingEventData(event);
        eventData.orderNumber = ++lastLogEntryOrderNumber;
        queue.add(eventData);
    }
 
    /**
     * For testing purposes.
     *
     * @param event
     */
    void append(LoggingEventData event) {
        queue.add(event);
    }
 
    public List<LoggingEventData> query(LogFilter filter, Locale locale) {
        List<LoggingEventData> result = new ArrayList<>();
        if (filter == null) {
            return result;
        }
        int maxSize = filter.getMaxSize() != null ? filter.getMaxSize() : MAX_RESULT_SIZE;
        if (maxSize > MAX_RESULT_SIZE) {
            maxSize = MAX_RESULT_SIZE;
        }
        int counter = 0;
        //I18n i18n = CoreI18n.getDefault().get(locale);
        if (filter.isAscendingOrder()) {
            for (int i = 0; i < queue.getSize(); i++) {
                LoggingEventData resultEvent = getResultEvent(filter, queue.get(i), locale);
                if (resultEvent == null) continue;
                result.add(resultEvent);
                if (++counter > maxSize) break;
            }
        } else {
            for (int i = queue.getSize(); i >= 0; i--) {
                LoggingEventData resultEvent = getResultEvent(filter, queue.get(i), locale);
                if (resultEvent == null) continue;
                result.add(resultEvent);
                if (++counter > maxSize) break;
            }
        }
        return result;
    }
 
    private LoggingEventData getResultEvent(LogFilter filter, LoggingEventData event, Locale locale) {
        if (event == null) {
            return null;
        }
        if (!event.getLevel().matches(filter.getThreshold())) {
            return null;
        }
        if (filter.getLastReceivedLogOrderNumber() != null) {
            if (event.getOrderNumber() <= filter.getLastReceivedLogOrderNumber()) {
                return null;
            }
        }
        String logString = null;
        String message = event.getMessage();
        boolean localizedMessage = false;
            /*if (message != null && message.startsWith("i18n=")) {
                I18nLogEntry i18nLogEntry = I18nLogEntry.parse(message);
                message = i18n.formatMessage(i18nLogEntry.getI18nKey(), (Object[])i18nLogEntry.getArgs());
                localizedMessage = true;
            }*/
 
        if (StringUtils.isNotBlank(filter.getSearch())) {
            StringBuilder sb = new StringBuilder();
            sb.append(event.getLogDate());
            append(sb, event.getLevel(), true);
            append(sb, message, true);
            append(sb, event.getJavaClass(), true);
            append(sb, event.getStackTrace(), filter.isShowStackTraces());
            logString = sb.toString();
        }
        if (logString == null || matches(logString, filter.getSearch())) {
            LoggingEventData resultEvent = event;
            if (localizedMessage) {
                // Need a clone
                resultEvent = event.clone();
                resultEvent.setMessage(message);
            }
            return resultEvent;
        }
        return null;
    }
 
    private void append(StringBuilder sb, Object value, boolean append) {
        if (!append || value == null) {
            return;
        }
        sb.append("|#|").append(value);
    }
 
    public void close() {
    }
 
    public boolean requiresLayout() {
        return false;
    }
 
    private boolean matches(String str, String searchString) {
        if (StringUtils.isBlank(str)) {
            return StringUtils.isBlank(searchString);
        }
        if (StringUtils.isBlank(searchString)) {
            return true;
        }
        return str.toLowerCase().contains(searchString.toLowerCase());
    }
}