web-dev-qa-db-fra.com

Est-il possible de recharger le fichier log4j.xml/log4j.properties de manière dynamique dans Tomcat?

Le problème est que chaque fois que vous modifiez le fichier log4j.properties/log4j.xml, vous devez redémarrer Tomcat [ou tout autre serveur]. Existe-t-il une solution de contournement du rechargement de la configuration log4j?

33
Rakesh Juyal

De http://logging.Apache.org/log4j/1.2/faq.html#3.6

Y at-il un moyen d'obtenir log4j à recharger automatiquement une configuration déposer si cela change?

Oui. DOMConfigurator et le PropertyConfigurator prend en charge automatique rechargement à travers le configureAndWatch, méthode. Voir la Documentation API pour plus d'informations détails.

Parce que configureAndWatch est lancé un thread Wathdog séparé, et parce que il n'y a aucun moyen d'arrêter ce fil dans log4j 1.2, le configureAndWatch méthode est dangereuse pour une utilisation dans J2EE envrironments où les applications sont recyclé.

Cela dit, j'ai utilisé avec succès la méthode PropertyConfigurator # configureAndWatch dans un environnement Java EE (Sun One Web Server, pas Tomcat).

26
Guido

A partir de log4j 2.x, vous pouvez recharger la configuration périodiquement, dans cet exemple toutes les 30 secondes:

<configuration monitorInterval="30">

Veuillez jeter un coup d'œil ici pour plus d'informations sur la configuration de log4j 2.x: 

Vous pouvez écrire un petit code d’initialisation en procédant comme suit:

  • écoutez "BEFORE_START_EVENT", 
  • lorsque l'événement se produit (une fois par redémarrage de Tomcat), démarrez log4j à l'aide de la méthode configureAndWatch
  • de plus, n'oubliez pas d'installer un crochet d'arrêt pour nettoyer le fil de l'observateur

Voir cet article de blog pour plus de détails - recharger la configuration de log4j dans Tomcat

Ils l'ont également déplacé vers github .

5
Kieren Dixon

Mise à jour: Si vous utilisez lg4j2.xml, la configuration est la seule chose dont vous aurez besoin pour que log4j soit géré au moment de l'exécution.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO" monitorInterval="30">
  <Loggers>
-------
  </Loggers>
</Configuration>

Monitor interval 30 charge les changements log4j toutes les 30 secondes.

La solution ci-dessous est si vous utilisez une ancienne version de log4j.

Oui, vous pouvez modifier le niveau log4j au moment de l’exécution sans avoir à redémarrer le serveur, à condition que vous utilisiez Spring.

public class OptionalLog4jConfigurer extends Log4jConfigurer implements
 InitializingBean {

public static final Long DEFAULT_REFRESH = 30000L;
 private static final Log LOG = LogFactory
 .getLog(OptionalLog4jConfigurer.class);

private String configLocation;
 private Long refreshInterval;

public OptionalLog4jConfigurer(final String configLocation,
 final Long refreshInterval) {
 this.configLocation = configLocation;

if (refreshInterval == null) {
 this.refreshInterval = DEFAULT_REFRESH;
 }
 else {
 this.refreshInterval = refreshInterval;
 }
 }


 public void afterPropertiesSet() throws Exception {
 if (!StringUtils.isEmpty(this.configLocation)) {
 LOG.info("Log4J configuration is being customized.");

this.initLoggingInternal();
 }
 else {
 LOG
 .info("Using default Log4J configuration. No customization requested");
 }
 }

public String getConfigLocation() {
 return this.configLocation;
 }

public Long getRefreshInterval() {
 return this.refreshInterval;
 }

}

Ensuite, apportez ces modifications à applicationContext.

<bean id="optionalLog4jInitialization"  class="com.skg.jetm.OptionalLog4jConfigurer">
<constructor-arg index="0" type="Java.lang.String"  value="${log4j.configuration}" />
<constructor-arg index="1" type="Java.lang.Long" value="100" />
 </bean>

Le code complet et l'explication peuvent être trouvés ici 

Changer le niveau de log4j de manière dynamique

4
vsingh

Vous pouvez créer une action strut ou un servlet qui recharge le fichier de propriétés. Ainsi, après avoir modifié le fichier log4j.properties, vous devrez appeler le servlet pour le recharger.

Par exemple:

public class Log4JServlet extends HttpServlet{
  private static final long serialVersionUID = 1L;
  protected static Logger log = Logger.getLogger(Log4JTestServlet.class);

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println("Reload Log4J prop file");
    String path = "C:\\GlassFishESBv22\\glassfish\\domains\\domain1\\config\\log4j.properties";
    PropertyConfigurator.configure(path);

    /*
    log.debug("debug message");
    log.info("info message");
    log.warn("warn message");
    log.error("error message");
    log.fatal("fatal message");
    */

    }
}
4
Remy Mellet

Une autre méthode consiste à configurer Log4jConfigListener dans Spring Framework dans web.xml

3
Prashant Bhate

La réponse de Guido Garcia est tout à fait cadrée.

Log4j 1 offre un moyen de recharger la configuration de log4j de manière non sécurisée par un thread JEE.

Donc, si vous êtes dans un continent JEE, vous pouvez résoudre votre problème de manière triviale en:

(A) Créez votre temporisateur @Singleton ejb pour analyser périodiquement votre fichier log4j.properties.

(b) Regardez la mise en œuvre de la surveillance log4j donnée par log4j . Ce qu'il fait quand il est temps de recharger un fichier est tout simplement et commodément, comme suit:

new PropertyConfigurator().doConfigure(filename,LogManager.getLoggerRepository());

Faites de même, si l’horodatage de votre fichier de configuration change… .. C’est tout.

1
99Sono

Une autre méthode consiste à configurer un observateur de fichiers à l'aide de Java File WatcherService comme expliqué ci-dessous pour relier et recharger la configuration Log4J sur n'importe quelle modification de fichier.

https://dzone.com/articles/how-watch-file-system-changes

Le rechargement peut être effectué à l'aide des API de DOMConfigurator

https://logging.Apache.org/log4j/1.2/apidocs/org/Apache/log4j/xml/DOMConfigurator.html

0
Ramesh Ponnada