2

I have a maven project where I have written a java.util.logging filter as below.

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;
 }
}

I have a properties file in which I have configured the Console and File handlers and need to add a filter in addition to get rid of unwanted logs in the file. I added the filter as follows:

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

However the filter is not applied. What am I doing wrong here.

UPDATE: Adding the configuration file

    ############################################################
#   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
Asma Zinneera Jabir
  • 801
  • 3
  • 13
  • 31

2 Answers2

3

The problem was the missing access modifier.

When the class was not specified with an access modifier it defaults to private-package which is only visible within the package. Therefore, the FileHandler reads the .filter property as null. When it is changed as public the filter was taken. The corrected code can be found below.

public class CustomFilter implements Filter {

 public boolean isLoggable(LogRecord record) {
    return record.getLoggerName().indexOf("com.package.name") != -1;
 }
}
Asma Zinneera Jabir
  • 801
  • 3
  • 13
  • 31
0

This is possibly not a full answer to your question, but it seems to me that you are trying to filter out your logs in Web Application from a useless noise. I actually wrote an Open Source library that deals with this issue. You can configure the package that is relevant to you and the utility will very smartly filter out the stacktrace in such a way that you will still see the trace including "caused by" trace but the useless packages will be filtered out. You can get this library as a Maven artifact (including javadoc and sources) or as a source code that you can modify by yourself. Here is an article that describes what the Utility does and where to get it. Open Source Java library with stack trace filtering, Silent String parsing Unicode converter and Version comparison. See the paragraph "Stacktrace noise filter"

Michael Gantman
  • 7,315
  • 2
  • 19
  • 36