Module: SemanticLogger

Defined in:
lib/semantic_logger/base.rb,
lib/semantic_logger.rb,
lib/semantic_logger/logger.rb,
lib/semantic_logger/version.rb,
lib/semantic_logger/loggable.rb,
lib/semantic_logger/appender/base.rb,
lib/semantic_logger/appender/file.rb,
lib/semantic_logger/appender/syslog.rb,
lib/semantic_logger/semantic_logger.rb,
lib/semantic_logger/appender/mongodb.rb,
lib/semantic_logger/appender/wrapper.rb

Overview

Wrapper appender

Wraps the Rails log, log4r, or Ruby Logger with the SemanticLogger API's

Defined Under Namespace

Modules: Appender, Loggable Classes: Base, Logger

Constant Summary collapse

VERSION =
"2.7.0"
LEVELS =

Logging levels in order of most detailed to most severe

[:trace, :debug, :info, :warn, :error, :fatal]

Class Method Summary collapse

Class Method Details

.[](klass) ⇒ Object

Return a logger for the supplied class or class_name



7
8
9
# File 'lib/semantic_logger/semantic_logger.rb', line 7

def self.[](klass)
  SemanticLogger::Logger.new(klass)
end

.add_appender(appender, log_level = nil, &block) ⇒ Object

Add a new logging appender as a new destination for all log messages emitted from Semantic Logger

Appenders will be written to in the order that they are added

If a block is supplied then it will be used to customize the format of the messages sent to that appender. See SemanticLogger::Logger.new for more information on custom formatters

Parameters

appender [String|IO|SemanticLogger::Appender::Base|::Logger]
  Filename to write log messages to
     Or,
  STDOUT, STDERR, or any IO stream to write log messages to
     Or,
  Any SemanticLogger::Appender instance such as
    SemanticLogger::Appender::File
    SemanticLogger::Appender::Wrapper
    SemanticLogger::Appender::Mongodb
     Or,
  A custom appender derived from SemanticLogger::Appender::Base
     Or,
  Ruby built-in Logger, or any logger that implements the following methods:
    :debug, :info, :warn, :error, :fatal

log_level [Symbol]
  Optional
  By setting the log_level higher than the SemanticLogger::default_level
  this appender can exclude lower level log messages
  Any one of SemanticLogger::LEVELS. For example: :trace, :debug, :info, :warn, :error, :fatal

Examples:

# Send all logging output to Standard Out (Screen)
SemanticLogger.add_appender(STDOUT)

# Send all logging output to a file
SemanticLogger.add_appender('logfile.log')

# Send all logging output to a file and only :info and above to standard output
SemanticLogger.add_appender('logfile.log')
SemanticLogger.add_appender(STDOUT, :info)

Log to an existing logger:

# Send Semantic logging output to an existing logger
require 'logger'
require 'semantic_logger'

# Built-in Ruby logger
log = Logger.new(STDOUT)
log.level = Logger::DEBUG

SemanticLogger.default_level = :debug
SemanticLogger.add_appender(log)

logger = SemanticLogger['Example']
logger.info "Hello World"
logger.debug("Login time", :user => 'Joe', :duration => 100, :ip_address=>'127.0.0.1')


83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/semantic_logger/semantic_logger.rb', line 83

def self.add_appender(appender, log_level=nil, &block)
  appender_instance = if appender.is_a?(String) || appender.is_a?(IO)
    # $stderr, STDOUT, other IO, or a filename
    SemanticLogger::Appender::File.new(appender, log_level, &block)
  elsif appender.is_a? Appender::Base
    # Already an instance of an appender
    appender.log_level = log_level if log_level
    appender.formatter = block if block
    appender
  else
    # Check if the custom appender responds to all the log levels. For example Ruby ::Logger
    if does_not_implement = LEVELS[1..-1].find{|i| !appender.respond_to?(i)}
      raise "Supplied appender does not implement:#{does_not_implement}. It must implement all of #{LEVELS[1..-1].inspect}"
    end

    raise "Change the log level to #{log_level}, update the log level directly against the supplied appender" if log_level
    SemanticLogger::Appender::Wrapper.new(appender, &block)
  end
  @@appenders << appender_instance

  # Start appender thread if it is not already running
  SemanticLogger::Logger.start_appender_thread

  appender_instance
end

.appendersObject

Returns [SemanticLogger::Appender::Base] a copy of the list of active appenders for debugging etc. Use SemanticLogger.add_appender and SemanticLogger.remove_appender to manipulate the active appenders list



119
120
121
# File 'lib/semantic_logger/semantic_logger.rb', line 119

def self.appenders
  @@appenders.clone
end

.default_levelObject

Returns the global default log level for new Logger instances



19
20
21
# File 'lib/semantic_logger/semantic_logger.rb', line 19

def self.default_level
  @@default_level
end

.default_level=(level) ⇒ Object

Allow for setting the global default log level This change only applies to new loggers, existing logger levels will not be changed in any way



14
15
16
# File 'lib/semantic_logger/semantic_logger.rb', line 14

def self.default_level=(level)
  @@default_level = level
end

.flushObject

Wait until all queued log messages have been written and flush all active appenders



125
126
127
# File 'lib/semantic_logger/semantic_logger.rb', line 125

def self.flush
  SemanticLogger::Logger.flush
end

.on_metric(&block) ⇒ Object

Supply a block to be called whenever a metric is seen during benchmark logging

Parameters
  block
    The block to be called

Example:

SemanticLogger.on_metric do |log_struct|
  puts "#{log_struct.metric} was received. Log Struct: #{log_struct.inspect}"
end


149
150
151
# File 'lib/semantic_logger/semantic_logger.rb', line 149

def self.on_metric(&block)
  SemanticLogger::Logger.on_metric(&block)
end

.remove_appender(appender) ⇒ Object

Remove an existing appender Currently only supports appender instances



111
112
113
# File 'lib/semantic_logger/semantic_logger.rb', line 111

def self.remove_appender(appender)
  @@appenders.delete(appender)
end

.reopenObject

After forking an active process call SemanticLogger.reopen to re-open any open file handles etc to resources

Note: Only appenders that implement the reopen method will be called



133
134
135
136
137
# File 'lib/semantic_logger/semantic_logger.rb', line 133

def self.reopen
  @@appenders.each {|appender| appender.reopen if appender.respond_to?(:reopen)}
  # After a fork the appender thread is not running, start it if it is not running
  SemanticLogger::Logger.start_appender_thread
end