2010-11-09 3 views
4

Je suis aux prises avec la méthode Log4J et isDebugEnabled().Log4J: problème avec la méthode isDebugEnabled()

Quand j'Execute:

package org.test; 

import org.apache.log4j.Level; 
import org.apache.log4j.Logger; 

public class Test { 
public static Logger logger = Logger.getLogger(Test.class.getName()); 

public static void main(String[] args) { (new Test()).test(); } 

public void test() { 
    System.out.println("Logger " + logger.getName()); 
    System.out.println("level: " + logger.getLevel()); 
    logger.setLevel(Level.DEBUG); 
    System.out.println("level: " + logger.getLevel()); 
    System.out.println("debug? " + logger.isDebugEnabled()); 
} 
} 

je reçois:

Logger org.test.Test 
level: null 
level: DEBUG 
debug? false 

Le niveau de l'enregistreur est évidemment DEBUG, mais logger.isDebugEnabled() retourne false. Avez-vous une idée pour résoudre ce problème?

EDIT: J'ai essayé avec d'autres versions de log4j et avec un cast Level, et cela n'a rien changé.

+3

Je cours ceci avec Log4J 1.2.14 et j'obtiens 'debug? vrai'. –

+1

Je l'ai juste couru sur notre construction aussi, fonctionnant bien. –

+1

Avez-vous un fichier de configuration Log4J? S'il vous plaît poster ici – Hardcoded

Répondre

1

La raison semble être un conflit avec une dépendance introduite par maven. J'ai testé pour supprimer certaines de ces dépendances, et cela a finalement fonctionné. Je ne comprends pas pourquoi, mais ... ça marche!

+0

Je risquerais de deviner où vous ramasser une ancienne version de log4j d'une de ces dépendances et il apparaissait dans le classpath d'abord. – drekka

+0

oui, je le pense. – julien

0

Vous devez effectuer les opérations suivantes (de JavaDoc):

logger.setLevel((Level) Level.DEBUG); 

-

La seule autre différence que je vois entre nos exemples est que vous avez:

public static Logger logger = Logger.getLogger(Test.class.getName()); 

où je :

public static Logger logger = Logger.getLogger(Test.class); 

C'est 99% probablement pas cela, mais comme je l'ai dit, c'est la seule différence.

+1

Oui, je l'ai déjà essayé mais ça ne change rien. Merci quand même. – julien

+0

C'est exactement la même chose que 'logger.setLevel (Level.DEBUG); '(sans le typecasting, ce que l'OP a déjà fait). –

+0

A pris un coup de couteau, juste regardé ce que la documentation a dit. J'ai ensuite exécuté l'exemple sur notre build et il semble fonctionner correctement (avec et sans la distribution). –

1

J'ai essayé de le reproduire avec ce code, mais ça marche pour moi:

package com.example; 
import org.apache.log4j.Level; 
import org.apache.log4j.Logger; 

public class LogTest { 

    public static Logger logger = Logger.getLogger(LogTest.class.getName()); 

    public static void main(String[] args) { 
    System.out.println(logger.getLevel()); 
    logger.setLevel(Level.DEBUG); 
    System.out.println(logger.getLevel()); 
    System.out.println(logger.isDebugEnabled()); 
    } 
} 

Sortie:

null 
DEBUG 
true 

Je l'ai utilisé log4j-1.2.15 pour ce test.


Alors peut-être qu'il ya un problème avec votre version de log4j - commutateur à 1.2.14 ou 1.2.15 pour un moment et il suffit de vérifier si le problème est toujours là.

4

Je vous suggère d'arrêter de faire static Logger ..... Il y a un very good article about the pros and cons qui vaut le détour, surtout si vous êtes sur un serveur.

Une autre suggestion que je ferais serait également de regarder Slf4j ou LogBack, si vous pouvez envisager des solutions de rechange. Slf4j par exemple, ne nécessite pas de "si" les instructions de garde autour de la journalisation de débogage qui à son tour signifie un code plus propre.

+0

merci pour votre suggestion. – julien

+0

le lien est cassé! –

+0

Je l'ai mis à jour. J'espère que cela vous aidera. – drekka

Questions connexes