我有一个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
答案 0 :(得分:2)
问题是缺少访问修饰符。
如果没有使用访问修饰符指定类,则默认为private-package
,这只在包中可见。因此,FileHandler将.filter
属性读为null。如果将其更改为public
,则会过滤掉过滤器。更正后的代码可以在下面找到。
public class CustomFilter implements Filter {
public boolean isLoggable(LogRecord record) {
return record.getLoggerName().indexOf("com.package.name") != -1;
}
}
答案 1 :(得分:0)
这可能不是您问题的完整答案,但在我看来,您试图从无用的噪音中过滤掉Web应用程序中的日志。我实际上写了一个处理这个问题的开源库。您可以配置与您相关的软件包,该实用程序将非常巧妙地过滤掉堆栈跟踪,使您仍然可以看到包含"由"引起的跟踪。跟踪,但无用的包将被过滤掉。您可以将此库作为Maven工件(包括javadoc和源)或作为您可以自行修改的源代码。这篇文章描述了实用程序的功能以及从何处获取它。 Open Source Java library with stack trace filtering, Silent String parsing Unicode converter and Version comparison。请参阅段落" Stacktrace噪音过滤器"
答案 2 :(得分:0)
我使用了上面解释的方式,看到在记录过程中根本没有调用isLoggable()方法。
`package abc.def.geh.ijk;
private static Logger logger = Logger.getLogger(lmn.class.getName());
logger.log(Level.SEVERE, "Failed to get ConnectionFactory", ex);`
java.util.logging.FileHandler.filter = abc.def.geh.ijk.LoggingFilter
abc.def.geh.ijk.level=INFO
`package abc.def.geh.ijk; 导入java.util.logging.Filter; 导入java.util.logging.LogRecord;
public class LoggingFilter implements Filter{
public boolean isLoggable(LogRecord record) {
return record.getLoggerName().indexOf("abc.def.geh.ijk") != -1;
}
}`