【问题标题】:java util logging configure filter in properties file属性文件中的 java util logging 配置过滤器
【发布时间】:2017-08-14 09:06:55
【问题描述】:

我有一个 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

【问题讨论】:

  • 如果isLoggable()方法returns falseLogRecord不会被记录。如果returns true方法,LogRecord被转发给给定Logger的Handler。你的呢?
  • 这是我得到的所有记录的同一个旧文件。我尝试在 isLoggable() 方法中放置一个调试点,但没有成功。
  • 您可以尝试return true 而不是record.getLoggerName().indexOf("com.package.name") != -1 是否有效?如果可以,那么record 可能有问题。
  • 这也不起作用。既然调试的时候没有命中方法,那不是一开始没有应用过滤器吗?
  • 那么它看起来像过滤器根本不适用。

标签: java maven filter java.util.logging filehandler


【解决方案1】:

问题是缺少访问修饰符。

当类没有使用访问修饰符指定时,它默认为private-package,它只在包中可见。因此,FileHandler 将.filter 属性读取为空。当它更改为public 时,过滤器被采用。更正后的代码可以在下面找到。

public class CustomFilter implements Filter {

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

【讨论】:

    【解决方案2】:

    这可能不是您问题的完整答案,但在我看来,您正试图从无用的噪音中过滤掉 Web 应用程序中的日志。我实际上写了一个开源库来处理这个问题。您可以配置与您相关的包,该实用程序将非常巧妙地过滤掉堆栈跟踪,这样您仍然会看到包括“由”跟踪在内的跟踪,但无用的包将被过滤掉。您可以将此库作为 Maven 工件(包括 javadoc 和源代码)或作为您可以自己修改的源代码来获取。这是一篇文章,描述了该实用程序的功能以及从何处获取它。 Open Source Java library with stack trace filtering, Silent String parsing Unicode converter and Version comparison。请参阅“Stacktrace 噪声过滤器”段落

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-24
      • 1970-01-01
      • 2018-08-08
      • 2016-09-17
      • 2016-12-24
      • 2015-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多