java util logging настроить фильтр в файле свойств
У меня есть проект Maven, где я написал фильтр java.util.logging, как показано ниже.
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;
}
}
У меня есть файл свойств, в котором я настроил обработчики консоли и файлов, и мне нужно добавить фильтр, чтобы избавиться от нежелательных журналов в файле. Я добавил фильтр следующим образом:
java.util.logging.FileHandler.filter = com.xyz.filters.CustomFilter
Однако фильтр не применяется. Что я тут не так делаю.
ОБНОВЛЕНИЕ: Добавление файла конфигурации
############################################################
# 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
2 ответа
Проблема была в отсутствующем модификаторе доступа.
Когда класс не был указан с модификатором доступа, по умолчанию private-package
который виден только внутри пакета. Поэтому FileHandler читает .filter
свойство как ноль. Когда это изменяется как public
фильтр был взят. Исправленный код можно найти ниже.
public class CustomFilter implements Filter {
public boolean isLoggable(LogRecord record) {
return record.getLoggerName().indexOf("com.package.name") != -1;
}
}
Возможно, это не полный ответ на ваш вопрос, но мне кажется, что вы пытаетесь отфильтровать свои журналы в веб-приложении от бесполезного шума. Я на самом деле написал библиотеку с открытым исходным кодом, которая занимается этой проблемой. Вы можете настроить соответствующий вам пакет, и утилита будет очень умно отфильтровывать трассировку стека таким образом, что вы все равно увидите трассировку, в том числе "вызванную" трассировкой, но бесполезные пакеты будут отфильтрованы. Вы можете получить эту библиотеку как артефакт Maven (включая javadoc и исходники) или как исходный код, который вы можете изменить самостоятельно. Вот статья, которая описывает, что делает Утилита и где ее взять. Java-библиотека с открытым исходным кодом с фильтрацией трассировки стека, конвертер Unicode Sarsnt String и сравнение версий. Смотрите параграф "Фильтр шумов Stacktrace"