View | Details | Raw Unified | Return to bug 4913
Collapse All | Expand All

(-)src/main/java/org/apache/log4j/PropertyConfigurator.java (-1 / +7 lines)
Lines 39-44 Link Here
39
import org.apache.log4j.helpers.FileWatchdog;
39
import org.apache.log4j.helpers.FileWatchdog;
40
import org.apache.log4j.helpers.LogLog;
40
import org.apache.log4j.helpers.LogLog;
41
import org.apache.log4j.helpers.OptionConverter;
41
import org.apache.log4j.helpers.OptionConverter;
42
import org.apache.log4j.helpers.ShutdownEventListener;
42
import org.apache.log4j.or.RendererMap;
43
import org.apache.log4j.or.RendererMap;
43
import org.apache.log4j.spi.Configurator;
44
import org.apache.log4j.spi.Configurator;
44
import org.apache.log4j.spi.Filter;
45
import org.apache.log4j.spi.Filter;
Lines 473-478 Link Here
473
    PropertyWatchdog pdog = new PropertyWatchdog(configFilename);
474
    PropertyWatchdog pdog = new PropertyWatchdog(configFilename);
474
    pdog.setDelay(delay);
475
    pdog.setDelay(delay);
475
    pdog.start();
476
    pdog.start();
477
    LogManager.getLoggerRepository().addShutdownEventListener(pdog);
476
  }
478
  }
477
479
478
480
Lines 941-947 Link Here
941
  }
943
  }
942
}
944
}
943
945
944
class PropertyWatchdog extends FileWatchdog {
946
class PropertyWatchdog extends FileWatchdog implements ShutdownEventListener {
945
947
946
  PropertyWatchdog(String filename) {
948
  PropertyWatchdog(String filename) {
947
    super(filename);
949
    super(filename);
Lines 955-960 Link Here
955
    new PropertyConfigurator().doConfigure(filename,
957
    new PropertyConfigurator().doConfigure(filename,
956
            LogManager.getLoggerRepository());
958
            LogManager.getLoggerRepository());
957
  }
959
  }
960
  
961
  public void shutdown() {
962
    this.interrupt();
963
  }
958
}
964
}
959
965
960
class NameValue {
966
class NameValue {
(-)src/main/java/org/apache/log4j/spi/LoggerRepository.java (+8 lines)
Lines 23-28 Link Here
23
import org.apache.log4j.Category;
23
import org.apache.log4j.Category;
24
import org.apache.log4j.Level;
24
import org.apache.log4j.Level;
25
import org.apache.log4j.Logger;
25
import org.apache.log4j.Logger;
26
import org.apache.log4j.helpers.ShutdownEventListener;
26
27
27
/**
28
/**
28
   A <code>LoggerRepository</code> is used to create and retrieve
29
   A <code>LoggerRepository</code> is used to create and retrieve
Lines 107-110 Link Here
107
  abstract
108
  abstract
108
  void resetConfiguration();
109
  void resetConfiguration();
109
110
111
  /**
112
     Add a {@link HierarchyEventListener} event to the repository.
113
  */
114
  public
115
  void addShutdownEventListener(ShutdownEventListener listener);
116
117
  
110
}
118
}
(-)src/main/java/org/apache/log4j/spi/NOPLoggerRepository.java (+7 lines)
Lines 20-25 Link Here
20
import org.apache.log4j.Category;
20
import org.apache.log4j.Category;
21
import org.apache.log4j.Logger;
21
import org.apache.log4j.Logger;
22
import org.apache.log4j.Appender;
22
import org.apache.log4j.Appender;
23
import org.apache.log4j.helpers.ShutdownEventListener;
23
24
24
import java.util.Enumeration;
25
import java.util.Enumeration;
25
import java.util.Vector;
26
import java.util.Vector;
Lines 128-131 Link Here
128
     */
129
     */
129
    public void resetConfiguration() {
130
    public void resetConfiguration() {
130
    }
131
    }
132
133
    /**
134
     * {@inheritDoc}
135
     */
136
    public void addShutdownEventListener(ShutdownEventListener listener) {
137
    }
131
}
138
}
(-)src/main/java/org/apache/log4j/helpers/FileWatchdog.java (-1 / +2 lines)
Lines 103-109 Link Here
103
      try {
103
      try {
104
     Thread.sleep(delay);
104
     Thread.sleep(delay);
105
      } catch(InterruptedException e) {
105
      } catch(InterruptedException e) {
106
 // no interruption expected
106
     interrupted = true;
107
     break;
107
      }
108
      }
108
      checkAndConfigure();
109
      checkAndConfigure();
109
    }
110
    }
(-)src/main/java/org/apache/log4j/helpers/ShutdownEventListener.java (+13 lines)
Line 0 Link Here
1
package org.apache.log4j.helpers;
2
3
/**
4
 * Interface to receive a notification when the LoggerRepository is being shut down.
5
 * Used to terminate the {@link FileWatchdog} thread.
6
 *
7
 */
8
public interface ShutdownEventListener {
9
 /**
10
  * Called when the LoggerRepository is being shut down.
11
  */
12
 public void shutdown();
13
}
(-)src/main/java/org/apache/log4j/Hierarchy.java (+18 lines)
Lines 39-44 Link Here
39
import org.apache.log4j.or.RendererMap;
39
import org.apache.log4j.or.RendererMap;
40
import org.apache.log4j.or.ObjectRenderer;
40
import org.apache.log4j.or.ObjectRenderer;
41
import org.apache.log4j.helpers.LogLog;
41
import org.apache.log4j.helpers.LogLog;
42
import org.apache.log4j.helpers.ShutdownEventListener;
42
import org.apache.log4j.spi.ThrowableRendererSupport;
43
import org.apache.log4j.spi.ThrowableRendererSupport;
43
import org.apache.log4j.spi.ThrowableRenderer;
44
import org.apache.log4j.spi.ThrowableRenderer;
44
45
Lines 67-72 Link Here
67
68
68
  private LoggerFactory defaultFactory;
69
  private LoggerFactory defaultFactory;
69
  private Vector listeners;
70
  private Vector listeners;
71
  private Vector shutdownListeners;
70
72
71
  Hashtable ht;
73
  Hashtable ht;
72
  Logger root;
74
  Logger root;
Lines 90-95 Link Here
90
  Hierarchy(Logger root) {
92
  Hierarchy(Logger root) {
91
    ht = new Hashtable();
93
    ht = new Hashtable();
92
    listeners = new Vector(1);
94
    listeners = new Vector(1);
95
    shutdownListeners = new Vector(1);
93
    this.root = root;
96
    this.root = root;
94
    // Enable all level levels by default.
97
    // Enable all level levels by default.
95
    setThreshold(Level.ALL);
98
    setThreshold(Level.ALL);
Lines 115-120 Link Here
115
    }
118
    }
116
  }
119
  }
117
120
121
  public
122
  void addShutdownEventListener(ShutdownEventListener listener) {
123
    if(shutdownListeners.contains(listener)) {
124
      LogLog.warn("Ignoring attempt to add an existent listener.");
125
    } else {
126
      shutdownListeners.addElement(listener);
127
    }
128
  }
129
118
  /**
130
  /**
119
     This call will clear all logger definitions from the internal
131
     This call will clear all logger definitions from the internal
120
     hashtable. Invoking this method will irrevocably mess up the
132
     hashtable. Invoking this method will irrevocably mess up the
Lines 475-480 Link Here
475
 c.removeAllAppenders();
487
 c.removeAllAppenders();
476
      }
488
      }
477
    }
489
    }
490
    
491
    Enumeration listeners = shutdownListeners.elements();
492
    while (listeners.hasMoreElements()) {
493
      ShutdownEventListener listener = (ShutdownEventListener)listeners.nextElement();
494
      listener.shutdown();
495
    }
478
  }
496
  }
479
497
480
498
(-)src/main/java/org/apache/log4j/xml/DOMConfigurator.java (-1 / +7 lines)
Lines 27-32 Link Here
27
import org.apache.log4j.helpers.Loader;
27
import org.apache.log4j.helpers.Loader;
28
import org.apache.log4j.helpers.LogLog;
28
import org.apache.log4j.helpers.LogLog;
29
import org.apache.log4j.helpers.OptionConverter;
29
import org.apache.log4j.helpers.OptionConverter;
30
import org.apache.log4j.helpers.ShutdownEventListener;
30
import org.apache.log4j.or.RendererMap;
31
import org.apache.log4j.or.RendererMap;
31
import org.apache.log4j.spi.AppenderAttachable;
32
import org.apache.log4j.spi.AppenderAttachable;
32
import org.apache.log4j.spi.Configurator;
33
import org.apache.log4j.spi.Configurator;
Lines 735-740 Link Here
735
    XMLWatchdog xdog = new XMLWatchdog(configFilename);
736
    XMLWatchdog xdog = new XMLWatchdog(configFilename);
736
    xdog.setDelay(delay);
737
    xdog.setDelay(delay);
737
    xdog.start();
738
    xdog.start();
739
    LogManager.getLoggerRepository().addShutdownEventListener(xdog);
738
  }
740
  }
739
  
741
  
740
  private interface ParseAction {
742
  private interface ParseAction {
Lines 1111-1117 Link Here
1111
}
1113
}
1112
1114
1113
1115
1114
class XMLWatchdog extends FileWatchdog {
1116
class XMLWatchdog extends FileWatchdog implements ShutdownEventListener {
1115
1117
1116
    XMLWatchdog(String filename) {
1118
    XMLWatchdog(String filename) {
1117
    super(filename);
1119
    super(filename);
Lines 1125-1128 Link Here
1125
    new DOMConfigurator().doConfigure(filename, 
1127
    new DOMConfigurator().doConfigure(filename, 
1126
             LogManager.getLoggerRepository());
1128
             LogManager.getLoggerRepository());
1127
  }
1129
  }
1130
  
1131
  public void shutdown() {
1132
 this.interrupt();
1133
  }
1128
}
1134
}

Return to bug 4913