View Javadoc

1   /**
2    * Logback: the generic, reliable, fast and flexible logging framework.
3    * 
4    * Copyright (C) 2000-2008, QOS.ch
5    * 
6    * This library is free software, you can redistribute it and/or modify it under
7    * the terms of the GNU Lesser General Public License as published by the Free
8    * Software Foundation.
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   * This appender serves as the base class for actual SiftingAppenders
18   * implemented by the logback-classic and logback-access modules. In a nutshell,
19   * a SiftingAppender contains other appenders which it can build dynamically
20   * depending on discriminating values supplied by event currently being
21   * processed. The built appender is specified as part of a configuration file.
22   * 
23   * @author Ceki Gulcu
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 }