aboutsummaryrefslogtreecommitdiffstats
path: root/openecomp-be/lib/openecomp-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/logback/EventTypeDiscriminator.java
blob: 5aa36656af00dde0596380d682c176ac9f0731b2 (plain)
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
/*-
 * ============LICENSE_START=======================================================
 * SDC
 * ================================================================================
 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
 * ================================================================================
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ============LICENSE_END=========================================================
 */

package org.openecomp.sdc.logging.logback;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.sift.AbstractDiscriminator;
import org.openecomp.sdc.logging.Markers;
import org.slf4j.Marker;

/**
 * Can be used with {@link ch.qos.logback.classic.sift.SiftingAppender} to route events of different types to
 * separate log files. For example,
 *
 * <pre>
 *     &lt;configuration&gt;
 *         &lt;appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender"&gt;
 *             &lt;discriminator class="org.openecomp.sdc.logging.logback.EventTypeDiscriminator"/&gt;
 *             &lt;sift&gt;
 *                  &lt;appender name="{EventType}" class="ch.qos.logback.core.rolling.RollingFileAppender"&gt;
 *                      &lt;file&gt;${logDirectory}/${eventType}.log&lt;/file&gt;
 *                      &lt;rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"&gt;
 *                          &lt;fileNamePattern&gt;${logDirectory}/${eventType}.%i.log.zip&lt;/fileNamePattern&gt;
 *                          &lt;minIndex&gt;1&lt;/minIndex&gt;
 *                          &lt;maxIndex&gt;9&lt;/maxIndex&gt;
 *                      &lt;/rollingPolicy&gt;
 *                      &lt;triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"&gt;
 *                          &lt;maxFileSize&gt;5MB&lt;/maxFileSize&gt;
 *                      &lt;/triggeringPolicy&gt;
 *                      &lt;encoder&gt;
 *                          &lt;pattern&gt;${defaultPattern}&lt;/pattern&gt;
 *                      &lt;/encoder&gt;
 *                  &lt;/appender&gt;
 *             &lt;/sift&gt;
 *         &lt;/appender&gt;
 *
 *         &lt;root level="INFO"&gt;
 *             &lt;appender-ref ref="SIFT" /&gt;
 *         &lt;/root&gt;
 *     &lt;/configuration&gt;
 * </pre>
 *
 * @author evitaliy
 * @since 21/07/2016.
 */
public class EventTypeDiscriminator extends AbstractDiscriminator<ILoggingEvent> {

    private static final String KEY = "eventType";

    private static final String AUDIT = "Audit";
    private static final String METRICS = "Metrics";
    private static final String ERROR = "Error";
    private static final String DEBUG = "Debug";
    private static final String DEFAULT = DEBUG;

    private static final int MIN_ERROR_LEVEL = Level.WARN_INT;
    private static final int MAX_ERROR_LEVEL = Level.ERROR_INT;
    private static final int DEFAULT_LEVEL = Level.DEBUG_INT;

    @Override
    public String getDiscriminatingValue(ILoggingEvent event) {

        Level level = event.getLevel();
        final int levelInt = level == null ? DEFAULT_LEVEL : level.toInt();
        if ((levelInt > MIN_ERROR_LEVEL - 1) && (levelInt < MAX_ERROR_LEVEL + 1)) {
            return ERROR;
        }

        if (levelInt == Level.DEBUG_INT) {
            return DEBUG;
        }

        /*
         * After DEBUG, ERROR, and WARNING have been filtered out,
         * only TRACE and INFO are left. TRACE is less than DEBUG
         * and therefore cannot be used. So, INFO should be used for
         * custom routing like AUDIT and METRICS
         */
        if (levelInt == Level.INFO_INT) {

            final Marker marker = event.getMarker();
            if (marker != null) {

                if (marker.contains(Markers.AUDIT)) {
                    return AUDIT;
                }

                if (marker.contains(Markers.METRICS)) {
                    return METRICS;
                }
            }

            return ERROR;
        }

        return DEFAULT;
    }

    @Override
    public String getKey() {
        return KEY;
    }
}