1
2
3
4
5
6
7
8
9
10 package ch.qos.logback.core.sift;
11
12 import ch.qos.logback.core.Appender;
13 import ch.qos.logback.core.UnsynchronizedAppenderBase;
14 import ch.qos.logback.core.joran.spi.JoranException;
15
16
17
18
19
20
21
22
23
24
25 public abstract class SiftingAppenderBase<E> extends
26 UnsynchronizedAppenderBase<E> {
27
28 protected AppenderTracker<E> appenderTracker = new AppenderTrackerImpl<E>();
29 AppenderFactoryBase<E> appenderFactory;
30
31 Discriminator<E> discriminator;
32
33 public void setAppenderFactory(AppenderFactoryBase<E> appenderFactory) {
34 this.appenderFactory = appenderFactory;
35 }
36
37 @Override
38 public void start() {
39 int errors = 0;
40 if (discriminator == null) {
41 addError("Missing discriminator. Aborting");
42 errors++;
43 }
44 if (!discriminator.isStarted()) {
45 addError("Discriminator has not started successfully. Aborting");
46 errors++;
47 }
48 if (errors == 0) {
49 super.start();
50 }
51 }
52
53 @Override
54 public void stop() {
55 for (Appender<E> appender : appenderTracker.valueList()) {
56 appender.stop();
57 }
58 }
59
60 abstract protected long getTimestamp(E event);
61
62 @Override
63 protected void append(E event) {
64 if (!isStarted()) {
65 return;
66 }
67
68 String value = discriminator.getDiscriminatingValue(event);
69 long timestamp = getTimestamp(event);
70
71 Appender<E> appender = appenderTracker.get(value, timestamp);
72
73 if (appender == null) {
74 try {
75 appender = appenderFactory.buildAppender(context, value);
76 if (appender != null) {
77 appenderTracker.put(value, appender, timestamp);
78 }
79 } catch (JoranException e) {
80 addError("Failed to build appender for [" + value + "]", e);
81 return;
82 }
83 }
84 appenderTracker.stopStaleAppenders(timestamp);
85 appender.doAppend(event);
86 }
87
88 public Discriminator<E> getDiscriminator() {
89 return discriminator;
90 }
91
92 public void setDiscriminator(Discriminator<E> discriminator) {
93 this.discriminator = discriminator;
94 }
95
96
97 public String getDiscriminatorKey() {
98 if(discriminator != null) {
99 return discriminator.getKey();
100 } else {
101 return null;
102 }
103 }
104 }