Logger for class method from an included module

Hi,

I want to log what’s happening when a class method is called, using a
Logger instance. The code resembles this:

  module Helpers
    def self.included(klass)
      klass.extend ClassMethods
    end

    module ClassMethods

      def my_classy_method( arg1, arg2 )
  #I want to log in here
        ...
      end

    end#ClassMethods

  end#Helpers


class User

  include Helpers

  #boring stuff...

end


#called as such
User.my_classy_method( "blah", "plop" )

I’ve no idea where I should send the logger instance to that I’ve
already set up in the rest of the app. Would someone be good enough to
enlighten me? Should I perhaps alter the method signature to send the
logger in as an argument on the end like this:

def my_classy_method( arg1, arg2, options={} )
  options[:logger].debug ...

User.my_classy_method( "blah", "plop", {logger: @logger} )

or would that be bad form?

Any help on the matter is much appreciated.

Regards,
Iain

On Mar 28, 2011, at 1:16 PM, Iain B. wrote:

Hi,

I want to log what’s happening when a class method is called, using a Logger
instance. The code resembles this:

Since you want to reference a single Logger instance globally, perhaps a
global variable might be useful?

$app_logger = Logger.new( … )

If global variables turn your stomach, you could create an application
level module that contains your logger and/or other common objects.

module MyApp
extend self

def logger
  @logger ||= Logger.new( ... )
end

end

And now from anywhere in your code you can get the global logger thus

MyApp.logger

Another option to consider is the “logging” gem
https://github.com/TwP/logging. The advantages of the logging gem are
the ability to give each class it’s own logger and still send all log
events to the same destination (stdout, file, syslog, or any
combination). You can then tweak the log level on a class by class
basis. You can set the log level for one class to “debug” and keep all
the others at “info” or “warn”. This is great when you only need to
debug a small subset of your application.

Blessings,
TwP

On 28 Mar 2011, at 23:07, Tim P. wrote:

Since you want to reference a single Logger instance globally, perhaps a global
variable might be useful?

$app_logger = Logger.new( … )

If global variables turn your stomach,

I think the general ire against global vars prevented my head from
considering this :slight_smile:

And now from anywhere in your code you can get the global logger thus

MyApp.logger

I can see I start using this in code a lot, not just for loggers, and
probably inappropriately, but there you go.

Another option to consider is the “logging” gem
https://github.com/TwP/logging. The advantages of the logging gem are the
ability to give each class it’s own logger and still send all log events to the
same destination (stdout, file, syslog, or any combination). You can then tweak
the log level on a class by class basis. You can set the log level for one class
to “debug” and keep all the others at “info” or “warn”. This is great when you
only need to debug a small subset of your application.

I’ve downloaded it and am giving it a whirl now! Thanks.

Regards,
Iain