2017-04-07 3 views
0

Je migre actuellement de Log4j 1.2 vers Log4j 2. Nous utilisons Apache Commons Logging 1.1 (JCL), avec Log4j2 comme implémentation.Amélioration de la couverture de code avec la journalisation Commons et Log4j 2.0

maintenant lors de l'exécution des tests unitaires, des déclarations comme

if (log.isInfoEnabled()) { 
    log.info("example"); 
} 

montrera des lignes comme non couvertes dans le rapport de couverture si le niveau de journal de journal est trop élevé (par exemple WARN dans ce examole), comme le corps if ne sera pas en réalisé.

Dans Log4j 1 quelqu'un de ma société a ainsi un enregistreur personnalisé qui retourne vrai pour toutes log.isXXXEnabled() méthodes si elle détecte qu'il est exécuté à partir Maven Surefire, comme ceci:

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.impl.Log4JLogger; 

public class Log4JEnhancedCoverage implements Log { 

    private static final long serialVersionUID = -8715529047111858959L; 

    private final Log logger; 

    private final boolean mavenRun; 

    public LogEnhancedCoverage(String name) { 
    this.logger = new Log4JLogger(_name); 
    this.mavenRun = TestsRunContext.isMavenSurefireRun(); 
    } 

    @Override 
    public boolean isTraceEnabled() { 
    return (mavenRun) ? true : logger.isTraceEnabled(); 
    } 

    @Override 
    public void trace(Object message) { 
    logger.trace(message); 
    } 

    // repeat for warn, info, etc 
} 

L'effet est que chaque isXXXEnabled() est exécuté, l'instruction log est redirigée vers log4j via un fichier de configuration. Log4j lui-même verra que seuls les messages des niveaux de journaux spécifiés sont affichés, tandis que les blocs de code pour tous les niveaux sont exécutés. Ancien: Le problème est tel que vous pouvez voir qu'une implémentation de Logger Log4j est instanciée directement à partir du package impl de JCL. (Oui, ils livrent leur propre implémentation d'adaptateur!).

Dans ma nouvelle configuration, j'utilise l'artefact log4j-jcl et je ne sais pas comment créer correctement un enregistreur compatible Log4j 2 dans le constructeur.

Mise à jour:log4j-jcl est livré avec sa propre fabrique de journaux qui charge une implémentation de logger spécifique log4j 2. Ainsi, la configuration de commons-logging pour un enregistreur spécifique n'est pas du tout respectée.

+0

Il est beaucoup plus simple d'utiliser un fichier de configuration de test log4j2 séparé que d'utiliser une classe wrapper. Êtes-vous en mesure de supprimer Log4JEnhancedCoverage de votre code entièrement? –

+0

Peut-être que vous devriez vous débarrasser de ces tests avant vos lignes de connexion. Utilisez-vous du code coûteux dans la ligne de l'enregistreur? Sinon, la déclaration de garde n'est pas vraiment utile. –

Répondre

1

Il suffit d'obtenir l'enregistreur en utilisant l'API de journalisation des communs plutôt que de l'instancier directement et tout ira bien.

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 
//REMOVE THIS: import org.apache.commons.logging.impl.Log4JLogger; 

public class Log4JEnhancedCoverage implements Log { 

    private static final long serialVersionUID = -8715529047111858959L; 

    private final Log logger; 

    private final boolean mavenRun; 

    public Log4JEnhancedCoverage(String name) { 
     //REMOVE THIS: this.logger = new Log4JLogger(name); 
     this.logger = LogFactory.getLog(name); 
     ... 
+0

Bonne idée, mais cela ne fonctionne pas car Log4j lui-même semble être responsable de la création de l'enregistreur. Voir ma mise à jour ci-dessus. – user3001

+0

@ user3001 cela fonctionne quand je mets en place un exemple de projet. Vous avez dit vous-même que vous utilisiez la journalisation des communs comme couche de structure et log4j2 comme implémentation. Votre mise à jour indique "Ainsi, la configuration de la journalisation des communs pour un enregistreur spécifique n'est pas du tout respectée." ce qui n'a pas de sens pour moi car la consignation des communs ne devrait pas avoir de configuration; seule la couche d'implémentation doit avoir un fichier de configuration. –

+0

Dans le fichier 'commons-logging.properties' vous pouvez spécifier quelle implémentation de logger doit être utilisée, mais le JCL Log4j 2 ne l'honore plus. – user3001