module RJack::SLF4J

Wrapper and core Logger compatible adapter for the SLF4J logging interface.

Usage

require 'rjack-slf4j'

log = RJack::SLF4J[ "my.app.logger" ]
log.info "Hello World!"

Adapters

An output adapter must be required before the first log call. All of the following output adapters are available via require from the slf4j gem:

require 'rjack-slf4j/jcl'       # Output to Jakarta Commons Logging
require 'rjack-slf4j/jdk14'     # JDK java.util.logging (JUL)
require 'rjack-slf4j/log4j12'   # Log4j (provided elsewhere)
require 'rjack-slf4j/nop'       # NOP null logger (provided)
require 'rjack-slf4j/simple'    # Simple logger (provided)

The rjack-logback gem may also be be used as the output adapter:

require 'rjack-logback'

The first loaded output adapter wins (as with multiple adapters on the classpath). A warning will be logged to “slf4j” if an attempt is made to require a second output adapter.

The following input adapters will intercept JCL, java.util.logging (JUL), or log4j log output and direct it through SLF4J:

require 'rjack-slf4j/jcl-over-slf4j'   # Route Jakarta Commons Logging to SLF4J
require 'rjack-slf4j/log4j-over-slf4j' # Log4j to SLF4J

require 'rjack-slf4j/jul-to-slf4j'     # JDK java.util.logging (JUL) to SLF4J
RJack::SLF4J::JUL.replace_root_handlers # Special case setup for JUL

Multiple input adapters may be require’d. However, a RuntimeError will be raised in the attempt to require both an output adapter and input adapter from/to the same interface, for example ‘rjack-slf4j/jcl-over-slf4j’ and ‘rjack-slf4j/jcl’, which would otherwise cause a circular logging loop (and stack overflow.)

Adapter names match the corresponding SLF4J jars.

Constants

LEVELS

SLF4J severity levels

SLF4J_VERSION

SLF4J-java version

VERSION

SLF4J gem version

Public Class Methods

[]( name ) click to toggle source

Synonym for RJack::SLF4J::Logger.new( name )

# File lib/rjack-slf4j.rb, line 252
def self.[]( name )
  Logger.new( name )
end
linked_factory() click to toggle source

The ILoggerFactory instance if an output adapter has been loaded

# File lib/rjack-slf4j.rb, line 257
def self.linked_factory
   org.slf4j.LoggerFactory.getILoggerFactory
end
logger( name = self.class.name ) click to toggle source

Get Logger by name

# File lib/rjack-slf4j.rb, line 246
def logger( name = self.class.name )
  Logger.new( name )
end
output_name() click to toggle source

Output adapter name if one has been added, or nil.

# File lib/rjack-slf4j.rb, line 128
def self.output_name
  @@output_name
end
require_adapter( name ) click to toggle source

Require an adapter by name (add the jar to classpath) This is normally done via require ‘slf4j/name

# File lib/rjack-slf4j.rb, line 82
def self.require_adapter( name )
  row = ADAPTERS.assoc( name )
  if row
    name,ban = row
    output = false
  else
    row = ADAPTERS.rassoc( name )
    ban,name = row
    output = true
  end

  if @@loaded[ ban ]
    raise "Illegal attempt to load '#{name}' when '#{ban}' is loaded."
  end

  if output
    if ! @@output_name.nil? && name != @@output_name
      logger("slf4j").warn do
        "Ignoring attempt to load #{name} after #{@@output_name} already loaded."
      end
      return
    end
    if java.lang.Thread::current_thread.context_class_loader != @@api_loader
      $stderr.puts( "WARNING: Attempting to load #{name} in child class" +
                    " loader of slf4j-api.jar loader." )
    end
    require_jar( 'slf4j-' + name )
    @@output_name = name
  else
    require_jar( name )
  end

  @@loaded[ name ] = true
end
ruby_to_java_logger_name( clz )
Alias for: to_log_name
to_log_name( clz ) click to toggle source

Return a java style class name, suitable as a logger name, from the given ruby class or module, i.e:

to_log_name( Foo::Bar::Baz ) --> "foo.bar.Baz"
# File lib/rjack-slf4j.rb, line 140
def self.to_log_name( clz )
  clz.name.gsub( /::/, '.' ).gsub( /([^\.]+)\./ ) { |m| m.downcase }
end
Also aliased as: ruby_to_java_logger_name