class Logging::Layouts::EvenOddPattern

Constants

DIRECTIVE_TABLE

Public Class Methods

create_format_method( pf ) click to toggle source
# File lib/logging/layouts/odd_even_pattern.rb, line 126
def self.create_format_method( pf )
  spf_bag=SprintfBag.new(pf.color_scheme,COLOR_ALIAS_TABLE,DIRECTIVE_TABLE)
  pattern=pf.pattern.dup

  while true
    m = DIRECTIVE_RGXP.match(pattern)
    # * $1 is the stuff before directive or "" if not applicable
    # * $2 is the %#.# match within directive group
    # * $3 is the directive letter
    # * $4 is the precision specifier for the logger name
    # * $5 is the stuff after the directive or "" if not applicable

    spf_bag << m[1] unless m[1].empty?

    case m[3]
      when '%'; spf_bag << '%%'
      when 'c'
        spf_bag.add_colored(m[2]+'s',m[3])
        if m[4]
          precision = Integer(m[4]) rescue nil
          if precision
            raise ArgumentError, "logger name precision must be an integer greater than zero: #{precision}" unless precision > 0
            spf_bag.add_arg(".split(::Logging::Repository::PATH_DELIMITER).last(#{m[4]}).join(::Logging::Repository::PATH_DELIMITER)",true)
          else
            spf_bag << "{#{m[4]}}"
          end
        end
      when 'l' #level is dynamic
        if pf.color_scheme and pf.color_scheme.levels?
          name_map = ::Logging::LNAMES.map { |name| pf.color_scheme.color(("#{m[2]}s" % name), name) }
          name_bright_map = ::Logging::LNAMES.map { |name| pf.color_scheme.color(("#{m[2]}s" % name), "#{name}_bright") }
          the_map={0 => name_map, 1 => name_bright_map}
          spf_bag.add_variable(the_map,"@var[event.odd_even][event.level]") << '%s'
          spf_bag << "{#{m[4]}}" if m[4]
        else
          spf_bag << m[2] + 's'
          spf_bag << "{#{m[4]}}" if m[4]
          spf_bag.add_arg(DIRECTIVE_TABLE[m[3]])
        end
      when 'X'
        raise ArgumentError, "MDC must have a key reference" unless m[4]
        spf_bag.add_colored(m[2] + 's',m[3], m[4])

      when 'x'
        separator = m[4].to_s
        separator = ' ' if separator.empty?
        spf_bag.add_colored(m[2] + 's',m[3], separator)

      when *DIRECTIVE_TABLE.keys
        spf_bag.add_colored(m[2] + 's',m[3])
        spf_bag << "{#{m[4]}}" if m[4]
      when nil; break
      else
        raise ArgumentError, "illegal format character - '#{m[3]}'"
    end

    break if m[5].empty?
    pattern = m[5]
  end

  sprintf=

      code = "undef :format if method_defined? :format\n"
  code << "def format( event )
            if event.even?
              #{spf_bag.to_sprintf}
            else
              #{spf_bag.to_sprintf(true)}
            end
           end"

  ::Logging.log_internal(0) {code}
  spf_bag.set_variables(pf)
  pf._meta_eval(code, __FILE__, __LINE__)
end
new( opts = {} ) click to toggle source
# File lib/logging/layouts/odd_even_pattern.rb, line 10
def initialize( opts = {} )
  @created_at = Time.now

  @date_pattern = opts.getopt(:date_pattern)
  @date_method = opts.getopt(:date_method)
  @date_pattern = ISO8601 if @date_pattern.nil? and @date_method.nil?

  @pattern = opts.getopt(:pattern,
                         "[%d] %-#{::Logging::MAX_LEVEL_LENGTH}l -- %c : %m\n")

  cs_name = opts.getopt(:color_scheme)
  @color_scheme =
      case cs_name
        when false, nil; nil
        when true; ::Logging::ColorScheme[:default]
        else ::Logging::ColorScheme[cs_name] end

  self.class.create_date_format_methods(self)
  self.class.create_format_method(self)
end