[#11073] segfault printing instruction sequence for iterator — <noreply@...>

Bugs item #10527, was opened at 2007-05-02 14:42

14 messages 2007/05/02
[#11142] Re: [ ruby-Bugs-10527 ] segfault printing instruction sequence for iterator — Nobuyoshi Nakada <nobu@...> 2007/05/10

Hi,

[#11188] Re: [ ruby-Bugs-10527 ] segfault printing instruction sequence for iterator — Paul Brannan <pbrannan@...> 2007/05/16

On Thu, May 10, 2007 at 04:51:18PM +0900, Nobuyoshi Nakada wrote:

[#11234] Planning to release 1.8.6 errata — Urabe Shyouhei <shyouhei@...>

Hi all.

17 messages 2007/05/25

Re: Logger::Application accessor for logger

From: "NAKAMURA, Hiroshi" <nakahiro@...>
Date: 2007-05-10 13:55:35 UTC
List: ruby-core #11146
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi,

Brian Candler wrote:
> http://svn.ruby-lang.org/repos/ruby/trunk/lib/logger.rb
> 
> I have come across some strangeness in Logger::Application.
> 
> (1) attr_reader :logdev is declared - but @logdev is never initialised.

Sure.  Something wrong.

> (2) the actual logger is @log, but is not exposed via an accessor.

Yes.

> This means that:
> 
> (a) if you wish to change the format of logging from outside the app, it
>     gets messy:
> 
>     worker = MyApp.new			# subclass of Logger::Application
>     worker.log = "/tmp/worker.log"	# this is fine
>     worker.level = Logger::INFO		# so is this
>     worker.instance_variable_get(:@log).formatter = Logger::Formatter.new # Ugh!
> 
>     This is a useful pattern when using dependency injection to prepare
>     the application.

Agreed.  It should be easily doable.

> (b) if you wish to use the "logger.info" syntax within your application,
>     then you have to refer to the instance variable, i.e.
> 
>     @log.info "hello"
> 
> or else define your own accessor, e.g.
> 
>     def logger; @log; end
>     ...
>     logger.info "hello"

Right.

> (c) if a Logger::Application wishes to pass its logger to another object,
>     it has to refer to @log explicitly rather than using an accessor
>     (which seems a little fragile)

Agreed.

In summary, you are completely right and I cannot remember why I do it
like this...  It must be a bug and should be fixed.

> I expect this is unintentional, and perhaps the attr_reader :logdev was
> intended to expose the underlying logger object - or maybe the LogDevice
> object it contains. But either way, it always returns nil at present.
> 
> I'm not sure of the best way to improve this. At minimum, the useless
> attr_reader :logdev can be removed.
> 
> Maybe
> 
>     def logger
>       @log
>     end
> 
> is the easiest solution (unfortunately you can't make attr_reader :log
> because method 'log' has been used to call @log.add).

Attached is a patch created along to your suggestion.  I'll commit if
you don't have any trouble with this.

Regards,
// NaHi

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (Cygwin)

iQEVAwUBRkMkNx9L2jg5EEGlAQJxpwgAm7oQRjudBOKURzxzCSacnMK9kICuf/Pb
HZWF+Z/Fr6rXbDRFHA4TPDC72nNxNH058tw4l9zgBuPA9jUK2lXlMm2ERHRpSnoX
0ttKfP1aP52dqkneCuBKsFuoJdibd8NUp1nVthgkaryJolkefgmAS/HsAi29nYGS
KNHEANE1Hw0haD+zpPRKAsbg+wZ6NvEr3XTD7WuqeQqgH6VNsyl5IP6xGKfXeJdv
hx+jHBstiDyc3r8XOGau7b5JMM/YELYr6v48SW/dSfkfNT+EGJ2wiypJvR6qWglR
AWIndmv+5+UY6NBNPPdkljUm6GT2SvENx/WygM3w2+sTclo7SYUG2Q==
=SCoL
-----END PGP SIGNATURE-----

Attachments (1)

logger.diff (2.51 KB, text/x-diff)
Index: lib/logger.rb
===================================================================
--- lib/logger.rb	(revision 12272)
+++ lib/logger.rb	(working copy)
@@ -1,8 +1,9 @@
 # logger.rb - saimple logging utility
 # Copyright (C) 2000-2003, 2005  NAKAMURA, Hiroshi <nakahiro@sarion.co.jp>.
 
-require 'monitor'
 
+# = logger.rb
+#
 # Simple logging utility.
 #
 # Author:: NAKAMURA, Hiroshi  <nakahiro@sarion.co.jp>
@@ -12,6 +13,11 @@
 #   license; either the dual license version in 2003, or any later version.
 # Revision:: $Id$
 #
+# See Logger for documentation.
+#
+
+
+#
 # == Description
 #
 # The Logger class provides a simple but sophisticated logging utility that
@@ -149,8 +155,8 @@
 #
 # == Format
 #
-# Log messages are rendered in the output stream in a certain format.  The
-# default format and a sample are shown below:
+# Log messages are rendered in the output stream in a certain format by
+# default.  The default format and a sample are shown below:
 #
 # Log format:
 #   SeverityID, [Date Time mSec #pid] SeverityLabel -- ProgName: message
@@ -163,11 +169,18 @@
 #   logger.datetime_format = "%Y-%m-%d %H:%M:%S"
 #         # e.g. "2004-01-03 00:54:26"
 #
-# There is currently no supported way to change the overall format, but you may
-# have some luck hacking the Format constant.
+# You may change the overall format with Logger#formatter= method.
 #
+#   logger.formatter = proc { |severity, datetime, progname, msg|
+#     "#{datetime}: #{msg}\n"
+#   }
+#         # e.g. "Thu Sep 22 08:51:08 GMT+9:00 2005: hello world"
+#
 
 
+require 'monitor'
+
+
 class Logger
   VERSION = "1.2.6"
   /: (\S+),v (\S+)/ =~ %q$Id$
@@ -625,8 +638,8 @@
   class Application
     include Logger::Severity
 
+    # Name of the application given at initialize.
     attr_reader :appname
-    attr_reader :logdev
 
     #
     # == Synopsis
@@ -665,10 +678,22 @@
       status
     end
 
+    # Logger for this application.  See the class Logger for an explanation.
+    def logger
+      @log
+    end
+
     #
-    # Sets the log device for this application.  See the class Logger for an
-    # explanation of the arguments.
+    # Sets the logger for this application.  See the class Logger for an explanation.
     #
+    def logger=(logger)
+      @log = logger
+    end
+
+    #
+    # Sets the log device for this application.  See <tt>Logger.new</tt> for an explanation
+    # of the arguments.
+    #
     def set_log(logdev, shift_age = 0, shift_size = 1024000)
       @log = Logger.new(logdev, shift_age, shift_size)
       @log.progname = @appname

In This Thread