Class: Jinx::Log

Inherits:
Object show all
Includes:
Singleton
Defined in:
lib/jinx/helpers/log.rb

Overview

Wraps a standard global Logger.

Constant Summary collapse

FORMAT =

Stream-lined log format.

%{%s [%s] %5s %s\n}
LINUX_LOG_DIR =

The default log file.

'/var/log'

Instance Method Summary collapse

Instance Method Details

#closeObject

Closes and releases the #logger.



95
96
97
98
# File 'lib/jinx/helpers/log.rb', line 95

def close
  @logger.close
  @logger = nil
end

#default_linux_log_file(app) ⇒ String? (private)

Returns the default file name.

Parameters:

  • app (String)

    the application name

Returns:

  • (String, nil)

    the default file name



136
137
138
139
140
141
142
# File 'lib/jinx/helpers/log.rb', line 136

def default_linux_log_file(app)
  return unless File.exists?(LINUX_LOG_DIR)
  base = app.underscore.gsub(' ', '_')
  file = File.expand_path("#{base}.log", LINUX_LOG_DIR)
  log = file if File.exists?(file) ? File.writable?(file) : File.writable?(LINUX_LOG_DIR)
  log || '/dev/null'
end

#default_log_file(app = nil) ⇒ String (private)

Returns the log file, as described in #open.

If the standard Linux log location exists, then try that. Otherwise, try the conventional Windows app data location. If all else fails, use the working directory.

The file must be creatable or writable.

Parameters:

  • app (String, nil) (defaults to: nil)

    the application name (default jinx)

Returns:



129
130
131
132
# File 'lib/jinx/helpers/log.rb', line 129

def default_log_file(app=nil)
  app ||= 'Jinx'
  default_linux_log_file(app) || default_windows_log_file(app) || "log/#{app}.log"
end

#default_windows_log_file(app) ⇒ String? (private)

Returns the default file name.

Parameters:

  • app (String)

    the application name

Returns:

  • (String, nil)

    the default file name



146
147
148
149
150
151
152
153
154
155
156
# File 'lib/jinx/helpers/log.rb', line 146

def default_windows_log_file(app)
  # the conventional Windows app data location  
  app_dir = ENV['LOCALAPPDATA'] || return
  dir = app_dir + "/#{app}/log"
  file = File.expand_path("#{app}.log", dir)
  if File.exists?(file) ? File.writable?(file) : (File.directory?(dir) ? File.writable?(dir) : File.writable?(app_dir)) then
    file
  else
    'NUL'
  end
end

#fileString?

Returns the log file, or nil if the log was opened on an IO rather than a String.

Returns:

  • (String, nil)

    the log file, or nil if the log was opened on an IO rather than a String



107
108
109
# File 'lib/jinx/helpers/log.rb', line 107

def file
  @dev if String === @dev
end

#loggerMultilineLogger

Returns the global logger.

Returns:



101
102
103
# File 'lib/jinx/helpers/log.rb', line 101

def logger
  @logger ||= open
end

#open(dev = nil, opts = nil) ⇒ MultilineLogger

Opens the log. The default log location is determined from the application name. The application name is the value of the :app option, or Jinx by default. For an application MyApp, the log location is determined as follows:

  • /var/log/my_app.log for Linux

  • %LOCALAPPDATA%MyApplogMyApp.log for Windows

  • ./log/MyApp.log otherwise

The default file must be creatable or writable. If the device argument is not provided and there is no suitable default log file, then logging is disabled.

Parameters:

  • dev (String, IO, nil) (defaults to: nil)

    the log file or device

  • opts (Hash, nil) (defaults to: nil)

    the logger options

Options Hash (opts):

  • :app (String)

    the application name

  • :shift_age (Integer)

    the number of log files retained in the rotation

  • :shift_size (Integer)

    the maximum size of each log file

  • :debug (Boolean)

    whether to include debug messages in the log file

Returns:

Raises:

  • (RuntimeError)


68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/jinx/helpers/log.rb', line 68

def open(dev=nil, opts=nil)
  raise RuntimeError.new("Log already open") if open?
  dev, opts = nil, dev if Hash === dev
  dev ||= default_log_file(Options.get(:app, opts)) 
  FileUtils.mkdir_p(File.dirname(dev)) if String === dev
  # default is 4-file rotation @ 16MB each
  shift_age = Options.get(:shift_age, opts, 4)
  shift_size = Options.get(:shift_size, opts, 16 * 1048576)
  @logger = MultilineLogger.new(dev, shift_age, shift_size)
  @logger.level = Options.get(:debug, opts) ? Logger::DEBUG : Logger::INFO
  @logger.formatter = lambda do |severity, time, progname, msg|
    FORMAT % [
      progname || 'I',
      DateTime.now.strftime("%d/%b/%Y %H:%M:%S"),
      severity,
      msg]
  end
  @dev = dev
  @logger
end

#open?Boolean

Returns whether the logger is open.

Returns:

  • (Boolean)

    whether the logger is open



90
91
92
# File 'lib/jinx/helpers/log.rb', line 90

def open?
  !!@logger
end