2017-08-14 7 views
1

J'ai un projet maven où j'ai écrit un filtre java.util.logging comme ci-dessous.java util logging configurer le filtre dans le fichier de propriétés

package com.xyz.filters; 

import java.util.logging.Filter; 
import java.util.logging.LogRecord; 

class CustomFilter implements Filter { 

public boolean isLoggable(LogRecord record) { 
    return record.getLoggerName().indexOf("com.package.name") != -1; 
} 
} 

J'ai un fichier de propriétés dans lequel j'ai configuré la console et les gestionnaires de fichiers et ont besoin d'ajouter un filtre, en plus de se débarrasser des journaux indésirables dans le fichier. Je ajouté le filtre comme suit:

java.util.logging.FileHandler.filter = com.xyz.filters.CustomFilter 

Cependant, le filtre n'est pas appliquée. Qu'est-ce que je fais mal ici.

MISE À JOUR: Ajout du fichier de configuration

############################################################ 
# Default Logging Configuration File 
# 
# You can use a different file by specifying a filename 
# with the java.util.logging.config.file system property. 
# For example java -Djava.util.logging.config.file=myfile 
############################################################ 

############################################################ 
# Global properties 
# NOTE: this configuration file use to get the handler list, 
# Properties(except level property) define for each handler 
# may be not available because LogRecords handover to log4j 
# appenders in runtime. 
############################################################ 

# "handlers" specifies a comma separated list of log Handler 
# classes. These handlers will be installed during VM startup. 
# Note that these classes must be on the system classpath. 
# By default we only configure a ConsoleHandler, which will only 
# show messages at the INFO and above levels. 
#handlers= java.util.logging.ConsoleHandler 

# To also add the FileHandler, use the following line instead. 
#handlers= java.util.logging.FileHandler 
# Add org.wso2.carbon.bootstrap.logging.handlers.LogEventHandler to handlers if you need to push java logs to LOGEVENT appender 

handlers=java.util.logging.FileHandler, java.util.logging.ConsoleHandler 

# Default global logging level. 
# This specifies which kinds of events are logged across 
# all loggers. For any given facility this global level 
# can be overriden by a facility specific level 
# Note that the ConsoleHandler also has a separate level 
# setting to limit messages printed to the console. 
.level= INFO 

############################################################ 
# Handler specific properties. 
# Describes specific configuration info for Handlers. 
# 

java.util.logging.FileHandler.level = FINE 
java.util.logging.FileHandler.pattern = /path/to/custom.log 
java.util.logging.FileHandler.limit = 50000 
java.util.logging.FileHandler.count = 1 
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter 
java.util.logging.SimpleFormatter.format = [%1$tY-%1$tm-%1$td %1$tk:%1$tM:%1$tS,%1$tL] %4$s {%2$s} - %5$s %6$s %n 
java.util.logging.FileHandler.filter = om.xyz.filters.CustomFilter 

java.util.logging.ConsoleHandler.level = INFO 


############################################################ 
# Facility specific properties. 
# Provides extra control for each logger. 
############################################################ 

# For example, set the com.xyz.foo logger to only log SEVERE 
# messages: 
#com.xyz.foo.level = SEVERE 
com.package.name.level = FINE 
+0

Si la méthode 'isLoggable()' renvoie false, le paramètre LogRecord n'est pas consigné. Si la méthode 'renvoie true', le' LogRecord' est transmis aux gestionnaires du Logger donné. Qu'est-ce qui vous appartient? – soorapadman

+0

C'est le même vieux fichier que je reçois avec tous les enregistrements. J'ai essayé de mettre un point de débogage dans la méthode isLoggable(), mais il ne fonctionne pas. –

+0

Vous pouvez essayer 'return true' à la place' record.getLoggerName(). IndexOf ("com.package.name")! = -1' quand il fonctionne? Si ça marche, ça pourrait être un problème avec 'record'. – soorapadman

Répondre

0

Le problème était le modificateur d'accès manquant.

Lorsque la classe n'a pas été spécifiée avec un modificateur d'accès, elle est par défaut private-package, visible seulement dans le package. Par conséquent, FileHandler lit la propriété .filter comme nulle. Quand il est changé comme public le filtre a été pris. Le code corrigé peut être trouvé ci-dessous.

public class CustomFilter implements Filter { 

public boolean isLoggable(LogRecord record) { 
    return record.getLoggerName().indexOf("com.package.name") != -1; 
} 
} 
0

Ceci est peut-être pas une réponse complète à votre question, mais il me semble que vous essayez de filtrer vos journaux dans l'application Web à partir d'un bruit inutile. J'ai effectivement écrit une bibliothèque Open Source qui traite de ce problème. Vous pouvez configurer le paquet qui vous intéresse et l'utilitaire filtrera très intelligemment la pile de manière à ce que vous puissiez toujours voir la trace incluant «causé par» mais les paquets inutiles seront filtrés. Vous pouvez obtenir cette bibliothèque en tant qu'artefact Maven (y compris javadoc et sources) ou en tant que code source que vous pouvez modifier vous-même. Voici un article qui décrit ce que l'utilitaire fait et où l'obtenir. Open Source Java library with stack trace filtering, Silent String parsing Unicode converter and Version comparison. Voir le paragraphe "Filtre de bruit Stacktrace"