Adjust Logging level for apache commons logging?
Asked Answered
E

4

25

I have a simple console app which uses apache's PDFBox library, which in turn uses commons logging. I'm getting a lot of junk messages in my console which I'd like to suppress:

Feb 15, 2011 3:56:40 PM org.apache.pdfbox.util.PDFStreamEngine processOperator INFO: unsupported/disabled operation: EI

In my code, I've tried to reset the log levels to no avail:

Logger.getLogger("org.apache.pdfbox.util.PDFStreamEngine").setLevel(Level.OFF);
Logger.getLogger("org.apache.pdfbox.util").setLevel(Level.OFF);
Logger.getLogger("org.apache.pdfbox").setLevel(Level.OFF);

Despite these settings, the messages are still showing up on the console. Retrieving the log object from Commons logging doesn't help either, since it doesn't seem to have a way to set the level.

Is there a way to suppress these messages programmatically? Or do I need to add a config file?

Elderberry answered 15/2, 2011 at 21:23 Comment(0)
L
10

Commons-logging is only a logging-facade, meaning it doesn't provide the code which actually writes the logdata to e.g., disk. What you need to change is the configuration for the actual logging implementation (such as logback, log4j, etc.). If no such library is found it defaults to java.util.logging.

I would recommend putting e.g., log4j in the classpath and add a log4j.xml configuration file in your classpath. The mere presence of log4j in the classpath is in this case enough to initialize it. Log4j can also be configured programmatically.

Lueluebke answered 15/2, 2011 at 21:27 Comment(3)
I am using java logging (i.e. I have no other logging library present). And yet it seems to be ignoring the specification of level on the Java.util.logger.Elderberry
You can with a properties file, although I generally advice against java.util.logging.Tytybald
slf4j is also a logging facade, not a logging implementation.Eightfold
P
3

This works for me:

String[] loggers = { "org.apache.pdfbox.util.PDFStreamEngine",
        "org.apache.pdfbox.pdmodel.font.PDSimpleFont" };
for (String logger : loggers) {
  org.apache.log4j.Logger logpdfengine = org.apache.log4j.Logger
         .getLogger(logger);
  logpdfengine.setLevel(org.apache.log4j.Level.OFF);
}
Phew answered 27/6, 2015 at 18:15 Comment(0)
E
3

In case you have no time to figure out which Logging implementation is used underneath by the Apache commons-logging, try to disable all that are in you classpath. Following code tests three implementations.

If any of the lines doesn't compile, do not add the dependency! Just remove the line.

String[] loggers = { "org.apache.pdfbox.util.PDFStreamEngine",
    "org.apache.pdfbox.pdmodel.font.PDSimpleFont", "httpclient.wire.header" , "httpclient.wire.content"
for (String ln : names) {
  // Try java.util.logging as backend
  java.util.logging.Logger.getLogger(ln).setLevel(java.util.logging.Level.WARNING);

  // Try Log4J as backend
  org.apache.log4j.Logger.getLogger(ln).setLevel(org.apache.log4j.Level.WARN);

  // Try another backend
  Log4JLoggerFactory.getInstance().getLogger(ln).setLevel(java.util.logging.Level.WARNING);
 }
Elemental answered 27/3, 2016 at 22:5 Comment(0)
E
2

Apache commons-logging uses some other logging framework underneath (java.util.logging or Log4J), you have to investigate which one it uses on your project and set proper logging levels there.

Endarch answered 15/2, 2011 at 21:28 Comment(1)
I am using java logging (i.e. I have no other logging library present). And yet it seems to be ignoring the specification of level on the Java.util.logger.Elderberry

© 2022 - 2024 — McMap. All rights reserved.