2017-06-29 4 views
0

Mon but est d'utiliser la classe java.util.logging Level et de changer les chaînes de niveau comme 'FINE' à 'VERBOSE'.Meilleur moyen de remplacer java.util.logging Classe de niveau pour changer les chaînes de niveau

public static final Level FINE = new Level("FINE", 500);

Je sais que nous pouvons le faire en étendant le niveau comme suit:

public class MyLogLevel extends Level { 
    private static final long serialVersionUID = -8176160795706313070L; 
    private static final Level FINE = new MyLogLevel("VERBOSE", 500); 

    protected MyLogLevel(String name, int level) { 
     super(name, level); 
    } 


} 

Je voudrais savoir, est-ce la bonne façon de le faire ou sont-il des meilleures façons de fais le.

+0

Cela semble plutôt bien. Avez-vous un problème sur une erreur? – Strelok

+1

Le problème ne serait-il pas qu'un code de bibliothèque qui utilise directement 'Level.FINE' ne serait pas remplacé? Pourquoi voulez-vous remplacer ces chaînes en premier lieu? – Thomas

Répondre

0

Si vous utilisez Oracle JDK ou OpenJDK, vous pouvez simplement remplacer les noms localisés des niveaux existants. Pour ce faire, créez un nouveau regroupement de ressources (fichier de propriétés ou classe de regroupement de ressources) sous le package sun.util.logging.resources. Le bundle name doit être sous la forme logging_LANG_COUNTRY.

Par exemple, voici un programme d'essai au titre du projet appelé LevelTest:

import java.util.Locale; 
import java.util.ResourceBundle; 
import java.util.logging.Level; 

public class NewLevels { 

    public static void main(String[] args) { 
     System.out.println(Locale.getDefault()); 
     ResourceBundle rb = ResourceBundle.getBundle("sun.util.logging.resources.logging"); 
     System.out.println(rb.getLocale()); 
     System.out.println(Level.FINE.getLocalizedName()); 
     System.out.println(Level.FINER.getLocalizedName()); 
     System.out.println(Level.FINEST.getLocalizedName()); 
    } 
} 

Lorsque j'exécute ce test, le lieu est imprimé en_US. Par conséquent, mon nom de regroupement de ressources sera logging_en_US.properties.

Les propriétés faisceau de ressources contiendra les suivantes:

FINE=VERBOSE 
FINER=VERBOSE 
FINEST=VERBOSE 

Voici une liste de la structure du projet:

%USERPROFILE%\Documents\Projects\LevelTest\src\NewLevels.java 
%USERPROFILE%\Documents\Projects\LevelTest\src\sun\util\logging\resources\logging_en_US.properties 

Quand je lance le programme que je reçois la sortie suivante:

en_US 
en_US 
VERBOSE 
VERBOSE 
VERBOSE 

Sur un projet plus important, vous devrez peut-être combattre une partie de l'émission de chargeur de classe pour s'assurer que l'ensemble de ressources correct est localisé. Sinon, si vous ne voulez pas faire cela, vous pouvez créer un custom formatter.