public
Rubygem
Description: Merb Core: All you need. None you don't.
Homepage: http://www.merbivore.com
Clone URL: git://github.com/wycats/merb-core.git
Revert "Move most merb logger code out, into extlib"

This reverts commit 7a73c146dd28f4456b7ef2d1819834c67e04fa2a.
adelcambre (author)
Fri Oct 10 23:38:33 -0700 2008
commit  c9054d2c03f5daacce44aaedf225e23c9c1ee48f
tree    c5846dac16e8e081389f38a306757a3355c415ae
parent  38fc48a694d9dc3eb755f4b461f2dadb4de32c9b
...
278
279
280
281
282
283
284
285
 
286
287
288
...
278
279
280
 
 
 
 
 
281
282
283
284
0
@@ -278,11 +278,7 @@ module Merb
0
 
0
     # Logger settings
0
     def logger
0
-      Thread.current[:merb_logger] ||= Merb::Logger.new(
0
-        Merb::Config[:log_stream],
0
-        Merb::Config[:log_level],
0
-        Merb::Config[:log_delimiter],
0
-        Merb::Config[:log_auto_flush])
0
+      Thread.current[:merb_logger] ||= Merb::Logger.new
0
     end
0
 
0
     def reset_logger!
...
1
2
 
 
 
 
 
 
 
 
 
 
 
3
4
5
...
34
35
36
37
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
39
40
41
 
 
 
42
43
44
45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
47
48
 
 
 
 
 
 
 
49
50
51
52
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
54
55
56
 
 
57
58
59
60
 
61
62
63
64
65
66
67
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
69
70
...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
...
45
46
47
 
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
 
 
 
74
75
76
77
78
 
 
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
 
 
100
101
102
103
104
105
106
107
 
 
 
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
 
 
152
153
154
155
 
 
156
157
158
 
 
 
 
 
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
0
@@ -1,5 +1,16 @@
0
 # Merb::Logger = Extlib::Logger
0
 
0
+class Merb::Logger < Extlib::Logger
0
+  def verbose!(message, level = :warn)
0
+    send("#{level}!", message) if Merb::Config[:verbose]
0
+  end
0
+
0
+  def verbose(message, level = :warn)
0
+    send(level, message) if Merb::Config[:verbose]
0
+  end
0
+end
0
+
0
+# require "time" # httpdate
0
 # ==== Public Merb Logger API
0
 #
0
 # To replace an existing logger with a new one:
0
@@ -34,37 +45,168 @@
0
 #   Merb::Logger.new(log{String, IO},level{Symbol, String})
0
 module Merb
0
 
0
-  class Logger < Extlib::Logger
0
+  class Logger
0
+
0
+    attr_accessor :level
0
+    attr_accessor :delimiter
0
+    attr_accessor :auto_flush
0
+    attr_reader   :buffer
0
+    attr_reader   :log
0
+    attr_reader   :init_args
0
+
0
+    # ==== Notes
0
+    # Ruby (standard) logger levels:
0
+    # :fatal:: An unhandleable error that results in a program crash
0
+    # :error:: A handleable error condition
0
+    # :warn:: A warning
0
+    # :info:: generic (useful) information about system operation
0
+    # :debug:: low-level information for developers
0
+    Levels = Mash.new({
0
+      :fatal => 7,
0
+      :error => 6,
0
+      :warn  => 4,
0
+      :info  => 3,
0
+      :debug => 0
0
+    }) unless const_defined?(:Levels)
0
+
0
+    @@mutex = {}
0
 
0
-    # Appends a message to the log if the specified log level is at least as high as
0
-    # the log level of the logger if Merb::Config[:verbose]. Then flushes the log 
0
-    # buffer to disk.
0
+    private
0
+
0
+    # Readies a log for writing.
0
     #
0
     # ==== Parameters
0
-    # message<String>:: The message to be logged.
0
-    # level<Symbol>:: The level at which to log. Default is :warn.
0
+    # log<IO, String>:: Either an IO object or a name of a logfile.
0
+    def initialize_log(log)
0
+      close if @log # be sure that we don't leave open files laying around.
0
+
0
+      if log.respond_to?(:write)
0
+        @log = log
0
+      elsif File.exist?(log)
0
+        @log = open(log, (File::WRONLY | File::APPEND))
0
+        @log.sync = true
0
+      else
0
+        FileUtils.mkdir_p(File.dirname(log)) unless File.directory?(File.dirname(log))
0
+        @log = open(log, (File::WRONLY | File::APPEND | File::CREAT))
0
+        @log.sync = true
0
+        @log.write("#{Time.now.httpdate} #{delimiter} info #{delimiter} Logfile created\n")
0
+      end
0
+    end
0
+
0
+    public
0
+
0
+    # To initialize the logger you create a new object, proxies to set_log.
0
     #
0
-    # ==== Returns
0
-    # self:: The logger object for chaining.
0
+    # ==== Parameters
0
+    # *args:: Arguments to create the log from. See set_logs for specifics.
0
+    def initialize(*args)
0
+      set_log(*args)
0
+    end
0
+
0
+    # Replaces an existing logger with a new one.
0
     #
0
-    # @api plugin
0
-    def verbose!(message, level = :warn)
0
-      send("#{level}!", message) if Merb::Config[:verbose]
0
+    # ==== Parameters
0
+    # log<IO, String>:: Either an IO object or a name of a logfile.
0
+    # log_level<~to_sym>::
0
+    #   The log level from, e.g. :fatal or :info. Defaults to :error in the
0
+    #   production environment and :debug otherwise.
0
+    # delimiter<String>::
0
+    #   Delimiter to use between message sections. Defaults to " ~ ".
0
+    # auto_flush<Boolean>::
0
+    #   Whether the log should automatically flush after new messages are
0
+    #   added. Defaults to false.
0
+    def set_log(stream = Merb::Config[:log_stream],
0
+      log_level = Merb::Config[:log_level],
0
+      delimiter = Merb::Config[:log_delimiter],
0
+      auto_flush = Merb::Config[:log_auto_flush])
0
+
0
+      @buffer                   = []
0
+      @delimiter                = delimiter
0
+      @auto_flush               = auto_flush
0
+
0
+      if Levels[log_level]
0
+        @level                  = Levels[log_level]
0
+      else
0
+        @level                  = log_level
0
+      end
0
+
0
+      @log                      = stream
0
+      @mutex = (@@mutex[@log] ||= Mutex.new)
0
+    end
0
+
0
+    # Flush the entire buffer to the log object.
0
+    def flush
0
+      return unless @buffer.size > 0
0
+      @mutex.synchronize do
0
+        @log.write(@buffer.slice!(0..-1).to_s)
0
+      end
0
+    end
0
+
0
+    # Close and remove the current log object.
0
+    def close
0
+      flush
0
+      @log.close if @log.respond_to?(:close) && !@log.tty?
0
+      @log = nil
0
     end
0
 
0
-    # Appends a message to the log if the specified log level is at least as high as
0
-    # the log level of the logger if Merb::Config[:verbose].
0
+    # Appends a message to the log. The methods yield to an optional block and
0
+    # the output of this block will be appended to the message.
0
     #
0
     # ==== Parameters
0
-    # message<String>:: The message to be logged.
0
-    # level<Symbol>:: The level at which to log. Default is :warn.
0
+    # string<String>:: The message to be logged. Defaults to nil.
0
     #
0
     # ==== Returns
0
-    # self:: The logger object for chaining.
0
-    #
0
-    # @api plugin
0
-    def verbose(message, level = :warn)
0
-      send(level, message) if Merb::Config[:verbose]
0
+    # String:: The resulting message added to the log file.
0
+    def <<(string = nil)
0
+      message = ""
0
+      message << delimiter
0
+      message << string if string
0
+      message << "\n" unless message[-1] == ?\n
0
+      @buffer << message
0
+      flush if @auto_flush
0
+
0
+      message
0
+    end
0
+    alias :push :<<
0
+
0
+    # Generate the logging methods for Merb.logger for each log level.
0
+    Levels.each_pair do |name, number|
0
+      class_eval <<-LEVELMETHODS, __FILE__, __LINE__
0
+
0
+      # Appends a message to the log if the log level is at least as high as
0
+      # the log level of the logger.
0
+      #
0
+      # ==== Parameters
0
+      # string<String>:: The message to be logged. Defaults to nil.
0
+      #
0
+      # ==== Returns
0
+      # self:: The logger object for chaining.
0
+      def #{name}(message = nil)
0
+        self << message if #{number} >= level
0
+        self
0
+      end
0
+
0
+      # Appends a message to the log if the log level is at least as high as
0
+      # the log level of the logger. The bang! version of the method also auto
0
+      # flushes the log buffer to disk.
0
+      #
0
+      # ==== Parameters
0
+      # string<String>:: The message to be logged. Defaults to nil.
0
+      #
0
+      # ==== Returns
0
+      # self:: The logger object for chaining.
0
+      def #{name}!(message = nil)
0
+        self << message if #{number} >= level
0
+        flush if #{number} >= level
0
+        self
0
+      end
0
+
0
+      # ==== Returns
0
+      # Boolean:: True if this level will be logged by this logger.
0
+      def #{name}?
0
+        #{number} >= level
0
+      end
0
+      LEVELMETHODS
0
     end
0
 
0
   end
...
21
22
23
24
25
26
27
28
29
30
31
32
33
34
...
49
50
51
52
53
54
55
56
57
58
59
60
...
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
...
21
22
23
 
 
 
 
 
 
 
 
24
25
26
...
41
42
43
 
 
 
 
 
 
44
45
46
...
280
281
282
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
283
0
@@ -21,14 +21,6 @@ end
0
 
0
 describe Merb::Logger do
0
 
0
-  describe "Levels" do
0
-    it "should have the same entries as Extlib::Logger::Levels" do
0
-      Extlib::Logger::Levels.each do |level, value|
0
-        Merb::Logger::Levels[level].should == value
0
-      end
0
-    end
0
-  end
0
-
0
   describe "#new" do
0
     it "should call set_log with the arguments it was passed." do
0
       logger = Merb::Logger.allocate # create an object sans initialization
0
@@ -49,12 +41,6 @@ describe Merb::Logger do
0
       Merb.logger.level.should == 4
0
     end
0
 
0
-    it "should set the log level to a specific numeric value when that value is set into Mer" do
0
-      Merb::Config[:log_level] = 5
0
-      Merb.reset_logger!
0
-      Merb.logger.level.should == 5
0
-    end
0
-
0
     it "should set the log level to :debug (0) when Merb.environment is development" do
0
       Merb.environment = "development"
0
       Merb::Config.delete(:log_level)
0
@@ -294,81 +280,4 @@ describe Merb::Logger do
0
       Merb.logger.should log_with_method(:fatal)
0
     end
0
   end # #fatal
0
-  
0
-  describe "#verbose" do
0
-    before do
0
-      @stream = Merb::Config[:log_stream] = StringIO.new
0
-      Merb.reset_logger!
0
-    end
0
-    
0
-    describe "when Merb::Config[:verbose] is false" do
0
-      it "should not log any messages" do
0
-        Merb::Config[:verbose] = false
0
-        Merb::Config[:log_level] = :debug
0
-        Merb.logger.verbose("message", :fatal)
0
-        Merb.logger.flush
0
-        
0
-        Merb.logger.log.string.should_not include("message")
0
-      end
0
-    end
0
-    
0
-    describe "when Merb::Config[:verbose] is true" do
0
-      before do
0
-        Merb::Config[:verbose] = true
0
-        Merb::Config[:log_level] = :debug
0
-      end
0
-
0
-      it "adds to the buffer with error level" do
0
-        set_level(:error)
0
-        Merb.logger.verbose("message", :error)
0
-        Merb.logger.flush
0
-        Merb.logger.log.string.should include("message")
0
-      end
0
-
0
-      it "adds to the buffer with fatal level" do
0
-        set_level(:fatal)
0
-        Merb.logger.verbose("message", :error)
0
-        Merb.logger.flush
0
-        Merb.logger.log.string.should_not include("message")
0
-      end
0
-      
0
-    end
0
-  end
0
-  
0
-  describe "#verbose!" do
0
-    before do
0
-      @stream = Merb::Config[:log_stream] = StringIO.new
0
-      Merb.reset_logger!
0
-    end
0
-    
0
-    describe "when Merb::Config[:verbose] is false" do
0
-      it "should not log any messages" do
0
-        Merb::Config[:verbose] = false
0
-        Merb::Config[:log_level] = :debug
0
-        Merb.logger.verbose!("message", :fatal)
0
-        Merb.logger.log.string.should_not include("message")
0
-      end
0
-    end
0
-    
0
-    describe "when Merb::Config[:verbose] is true" do
0
-      before do
0
-        Merb::Config[:verbose] = true
0
-        Merb::Config[:log_level] = :debug
0
-      end
0
-
0
-      it "adds to the buffer with error level" do
0
-        set_level(:error)
0
-        Merb.logger.verbose!("message", :error)
0
-        Merb.logger.log.string.should include("message")
0
-      end
0
-
0
-      it "adds to the buffer with fatal level" do
0
-        set_level(:fatal)
0
-        Merb.logger.verbose!("message", :error)
0
-        Merb.logger.log.string.should_not include("message")
0
-      end
0
-      
0
-    end
0
-  end
0
-  
0
 end # Merb::Logger

Comments