JRuby is a powerful language: it combines the pleasure of writing Ruby with the power and libraries of Java. Almost everything works perfectly, but it’s fundamentally a bastard language, and so there are a few corner cases that are quite awkward — like logging.

Most Ruby logging seems to be accomplished with simple `puts` statements or occasionally `STDERR.puts`. I’ve never seen `Logger` used. But Java has a quite complex system of a “basic” logger in the standard library (java.util.logging) and a handful of fancier systems like log4j that seem to be better suited to enterprise programming. Log4j, for instance, appears to be configured with a XML file in your classpath. This was well beyond my high-school Java skills.

My specific case was to suppress INFO statements output by the PDF parsing library PDFBox. PDFBox is the library that Tabula, a tool for extracting tabular data from PDFs, depends on to parse PDFs. For some reason, certain unimplemented PDF operators log tons of crap like:

org.apache.pdfbox.util.PDFStreamEngine 
processOperatorINFO: unsupported/disabled operation: EI

After a few hours of Googling, I found a solution to mute those log statements without integrating a log4j binary into the project. It may not be pretty or the “best” way to do it, but it sure works.

import 'java.util.logging.LogManager'
import 'java.util.logging.Level'
lm = LogManager.log_manager
lm.logger_names.each do |name|
  if name == "" # "" is the rootlogger 
                # which is apparently the logger PDFBox talks to.
    l = lm.get_logger(name)
    l.level = Level::OFF
    l.handlers.each do |h|      
        h.level = Level::OFF
    end
  end
end

I hope this solves a similar problem for you. It took me quite a while to find it, so I wrote it up to get the solution somewhere more easily findable.