Module: Familia::Logging

Included in:
Familia
Defined in:
lib/familia/logging.rb

Overview

The Logging module provides a set of methods and constants for logging messages at various levels of severity. It is designed to be used with the Ruby Logger class to facilitate logging in applications.

Constants:

Logger::TRACE

A custom log level for trace messages, typically used for very detailed debugging information.

Methods:

trace

Logs a message at the TRACE level. This method is only available if the LoggerTraceRefinement is used.

debug

Logs a message at the DEBUG level. This is used for low-level system information for debugging purposes.

info

Logs a message at the INFO level. This is used for general information about system operation.

warn

Logs a message at the WARN level. This is used for warning messages, typically for non-critical issues that require attention.

error

Logs a message at the ERROR level. This is used for error messages, typically for critical issues that require immediate attention.

fatal

Logs a message at the FATAL level. This is used for very severe error events that will presumably lead the application to abort.

Usage:

To use the Logging module, you need to include the LoggerTraceRefinement module and use the ‘using` keyword to enable the refinement. This will add the TRACE log level and the trace method to the Logger class.

Example:

require 'logger'

module LoggerTraceRefinement
  refine Logger do
    TRACE = 0

    def trace(progname = nil, &block)
      add(TRACE, nil, progname, &block)
    end
  end
end

using LoggerTraceRefinement

logger = Logger.new(STDOUT)
logger.trace("This is a trace message")
logger.debug("This is a debug message")
logger.info("This is an info message")
logger.warn("This is a warning message")
logger.error("This is an error message")
logger.fatal("This is a fatal message")

In this example, the LoggerTraceRefinement module is defined with a refinement for the Logger class. The TRACE constant and trace method are added to the Logger class within the refinement. The ‘using` keyword is used to apply the refinement in the scope where it’s needed.

Conditions:

The trace method and TRACE log level are only available if the LoggerTraceRefinement module is used with the ‘using` keyword. Without this, the Logger class will not have the trace method or the TRACE log level.

Minimum Ruby Version:

This module requires Ruby 2.0.0 or later to use refinements.

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#loggerObject (readonly)

Returns the value of attribute logger.



120
121
122
# File 'lib/familia/logging.rb', line 120

def logger
  @logger
end

Instance Method Details

#info(*msg) ⇒ Object

Gives our logger the ability to use our trace method. using LoggerTraceRefinement if Familia.debug



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

def info(*msg)
  @logger.info(*msg)
end

#ld(*msg) ⇒ Object



133
134
135
136
# File 'lib/familia/logging.rb', line 133

def ld(*msg)
  return unless Familia.debug?
  @logger.debug(*msg)
end

#le(*msg) ⇒ Object



138
139
140
# File 'lib/familia/logging.rb', line 138

def le(*msg)
  @logger.error(*msg)
end

#trace(label, redis_instance, ident, context = nil) ⇒ nil

Logs a trace message for debugging purposes if Familia.debug? is true.

Examples:

Familia.trace :LOAD, Familia.redis(uri), objkey, caller if Familia.debug?

Parameters:

  • label (Symbol)

    A label for the trace message (e.g., :EXPAND, :FROMREDIS, :LOAD, :EXISTS).

  • redis_instance (Object)

    The Redis instance being used.

  • ident (String)

    An identifier or key related to the operation being traced.

  • context (Array<String>, String, nil) (defaults to: nil)

    The calling context, typically obtained from ‘caller` or `caller.first`. Default is nil.

Returns:

  • (nil)


158
159
160
161
162
163
164
165
166
167
# File 'lib/familia/logging.rb', line 158

def trace(label, redis_instance, ident, context = nil)
  return unless Familia.debug? && ENV.key?('FAMILIA_TRACE')
  instance_id = redis_instance&.id
  codeline = if context
               context = [context].flatten
               context.reject! { |line| line =~ %r{lib/familia} }
               context.first
             end
  @logger.debug format('[%s] %s -> %s <- at %s', label, instance_id, ident, codeline)
end

#warn(*msg) ⇒ Object



129
130
131
# File 'lib/familia/logging.rb', line 129

def warn(*msg)
  @logger.warn(*msg)
end