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

Hi,

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

<snip>

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.

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 Mar 28, 2011, at 1:16 PM, Iain Barnett 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:

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

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

···

On 28 Mar 2011, at 23:07, Tim Pease wrote: