ActiveModel::LoggerAttributes

This gem provides a convenient way to save Logger messages to an attribute on your model. Multiple logger attributes are supported.

You may be also be interested in the (ActiveRecord version)[https://github.com/chrisb/activerecord-logger_attributes].

Installation

Add this line to your application's Gemfile:

gem 'activemodel-logger_attributes', '~> 0.1.2'

And then execute:

$ bundle

Or install it yourself as:

$ gem install activemodel-logger_attributes

Usage

Your attribute should ideally be an Array or anything that responds to <<.

Defining the attribute is straightforward with logger_attr.

class Book
  include ActiveModel::Model

  logger_attr :activity_log

  # expanded version with defaults:
  # logger_attr :activity_log, logger_class: ::Logger, logger_name: :activity_log_logger, logger_init: -> {}
end

If you prefer selectively mixing in functionality, simply include ActiveModel::LoggerAttributes. If you have multiple logger attributes take care to avoid clobbering logger names.

book = Book.new # previous log history is supported: Book.new activity_log: [..]
book.activity_log_logger.info 'Finished initializing book'
book.activity_log_logger.error 'Something went wrong!'
book.activity_log # => ["I, [2018-02-05T09:59:37.871594 #34988]  INFO -- : Finished initializing book", "E, [2018-02-05T09:59:37.871960 #34988] ERROR -- : Something went wrong!"]

As you would expect book.activity_log_logger is an instance of Logger.

By default, logger_attr will use Logger for the log class the logger's name; additionally, the logger progname will be set to your model's class name and attribute. Passing a block to logger_init is a convenient way to perform custom initialization on your logger's class. You may wish to override the default progname or perhaps set a log level:

logger_attr :activity_log, logger_init: ->(l) { l.level = Logger::WARN }