lumberjack 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -48,7 +48,7 @@ A unit of work can be used to tie together all log messages within a block. This
48
48
 
49
49
  When a Logger logs a LogEntry, it sends it to a Lumberjack::Device. Lumberjack comes with a variety of devices for logging to IO streams or files.
50
50
 
51
- * Lumberjack::Device::Stream - Writes log entries to an IO stream.
51
+ * Lumberjack::Device::Writer - Writes log entries to an IO stream.
52
52
  * Lumberjack::Device::LogFile - Writes log entries to a file.
53
53
  * Lumberjack::Device::DateRollingLogFile - Writes log entries to a file that will automatically roll itself based on date.
54
54
  * Lumberjack::Device::SizeRollingLogFile - Writes log entries to a file that will automatically roll itself based on size.
@@ -77,7 +77,17 @@ If you use the built in devices, you can also customize the Template used to for
77
77
 
78
78
  === Buffered Performance
79
79
 
80
- The built in stream based logging devices use an internal buffer to increase performance by batching physical writes.
80
+ The logger has hooks for devices that support buffering to increase performance by batching physical writes. Log entries are not guaranteed to be written until the Lumberjack::Logger#flush method is called.
81
+
82
+ You can use the <tt>:flush_seconds</tt> option on the logger to periodically flush the log. This is usually a good idea so you can more easily debug hung processes. Without periodic flushing, a process that hangs may never write anything to the log because the messages are sitting in a buffer. By turning on periodic flushing, the logged messages will be written which can greatly aid in debugging the problem.
83
+
84
+ The built in stream based logging devices use an internal buffer. The size of the buffer (in bytes) can be set with the <tt>:buffer_size</tt> options when initializing a logger. The default behavior is to not to buffer.
85
+
86
+ # Set buffer to flush after 8K has been written to the log.
87
+ logger = Lumberjack::Logger.new("application.log", :buffer_size => 8192)
88
+
89
+ # Turn off buffering so entries are immediately written to disk.
90
+ logger = Lumberjack::Logger.new("application.log", :buffer_size => 0)
81
91
 
82
92
  === Automatic Log Rolling
83
93
 
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'rake'
3
- require 'rake/gempackagetask'
4
- require 'rake/rdoctask'
3
+ require 'rubygems/package_task'
4
+ require 'rdoc/task'
5
5
 
6
6
  desc 'Default: run unit tests.'
7
7
  task :default => :test
@@ -42,7 +42,7 @@ spec_file = File.expand_path('../lumberjack.gemspec', __FILE__)
42
42
  if File.exist?(spec_file)
43
43
  spec = eval(File.read(spec_file))
44
44
 
45
- Rake::GemPackageTask.new(spec) do |p|
45
+ Gem::PackageTask.new(spec) do |p|
46
46
  p.gem_spec = spec
47
47
  end
48
48
  Rake.application["package"].prerequisites.unshift("rbx:delete_rbc_files")
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.0
1
+ 1.0.1
@@ -1,12 +1,13 @@
1
1
  module Lumberjack
2
2
  class Device
3
- # This logging device writes log entries as strings to an IO stream.
3
+ # This logging device writes log entries as strings to an IO stream. By default, messages will be buffered
4
+ # and written to the stream in a batch when the buffer is full or when +flush+ is called.
4
5
  class Writer < Device
5
6
  DEFAULT_FIRST_LINE_TEMPLATE = "[:time :severity :progname(:pid) #:unit_of_work_id] :message".freeze
6
7
  DEFAULT_ADDITIONAL_LINES_TEMPLATE = "#{Lumberjack::LINE_SEPARATOR}> [#:unit_of_work_id] :message".freeze
7
8
 
8
9
  # The size of the internal buffer. Defaults to 32K.
9
- attr_accessor :buffer_size
10
+ attr_reader :buffer_size
10
11
 
11
12
  # Internal buffer to batch writes to the stream.
12
13
  class Buffer # :nodoc:
@@ -49,12 +50,14 @@ module Lumberjack
49
50
  # The default template is <tt>"[:time :severity :progname(:pid) #:unit_of_work_id] :message"</tt>
50
51
  # with additional lines formatted as <tt>"\n [#:unit_of_work_id] :message"</tt>. The unit of
51
52
  # work id will only appear if it is present.
53
+ #
54
+ # The size of the internal buffer in bytes can be set by providing <tt>:buffer_size</tt> (defaults to 32K).
52
55
  def initialize(stream, options = {})
53
56
  @lock = Mutex.new
54
57
  @stream = stream
55
58
  @stream.sync = true if @stream.respond_to?(:sync=)
56
59
  @buffer = Buffer.new
57
- @buffer_size = (options[:buffer_size] || 32 * 1024)
60
+ @buffer_size = (options[:buffer_size] || 0)
58
61
  template = (options[:template] || DEFAULT_FIRST_LINE_TEMPLATE)
59
62
  if template.respond_to?(:call)
60
63
  @template = template
@@ -64,6 +67,13 @@ module Lumberjack
64
67
  end
65
68
  end
66
69
 
70
+ # Set the buffer size in bytes. The device will only be physically written to when the buffer size
71
+ # is exceeded.
72
+ def buffer_size=(value)
73
+ @buffer_size = value
74
+ flush
75
+ end
76
+
67
77
  # Write an entry to the stream. The entry will be converted into a string using the defined template.
68
78
  def write(entry)
69
79
  string = @template.call(entry)
@@ -114,7 +114,7 @@ module Lumberjack
114
114
 
115
115
  alias_method :log, :add
116
116
 
117
- # Flush the logging device.
117
+ # Flush the logging device. Messages are not guaranteed to be written until this method is called.
118
118
  def flush
119
119
  device.flush
120
120
  @last_flushed_at = Time.now
@@ -13,7 +13,7 @@ describe Lumberjack::Device::RollingLogFile do
13
13
  let(:entry){ Lumberjack::LogEntry.new(Time.now, 1, "New log entry", nil, $$, nil) }
14
14
 
15
15
  it "should check for rolling the log file on flush" do
16
- device = Lumberjack::Device::RollingLogFile.new(File.join(tmp_dir, "test.log"))
16
+ device = Lumberjack::Device::RollingLogFile.new(File.join(tmp_dir, "test.log"), :buffer_size => 32767)
17
17
  device.write(entry)
18
18
  device.should_receive(:roll_file?).twice.and_return(false)
19
19
  device.flush
@@ -22,7 +22,7 @@ describe Lumberjack::Device::RollingLogFile do
22
22
 
23
23
  it "should roll the file by archiving the existing file and opening a new stream and calling after_roll" do
24
24
  log_file = File.join(tmp_dir, "test_2.log")
25
- device = Lumberjack::Device::RollingLogFile.new(log_file, :template => ":message")
25
+ device = Lumberjack::Device::RollingLogFile.new(log_file, :template => ":message", :buffer_size => 32767)
26
26
  device.should_receive(:roll_file?).and_return(false, true)
27
27
  device.should_receive(:after_roll)
28
28
  device.stub!(:archive_file_suffix).and_return("rolled")
@@ -59,7 +59,7 @@ describe Lumberjack::Device::RollingLogFile do
59
59
 
60
60
  process_count.times do
61
61
  Process.fork do
62
- device = Lumberjack::Device::SizeRollingLogFile.new(log_file, :max_size => max_size, :template => ":message")
62
+ device = Lumberjack::Device::SizeRollingLogFile.new(log_file, :max_size => max_size, :template => ":message", :buffer_size => 32767)
63
63
  threads = []
64
64
  thread_count.times do
65
65
  threads << Thread.new do
@@ -95,7 +95,7 @@ describe Lumberjack::Device::RollingLogFile do
95
95
 
96
96
  it "should only keep a specified number of archived log files" do
97
97
  log_file = File.join(tmp_dir, "test_5.log")
98
- device = Lumberjack::Device::RollingLogFile.new(log_file, :template => ":message", :keep => 2)
98
+ device = Lumberjack::Device::RollingLogFile.new(log_file, :template => ":message", :keep => 2, :buffer_size => 32767)
99
99
  device.should_receive(:roll_file?).and_return(false, true, true, true)
100
100
  device.stub!(:archive_file_suffix).and_return("delete", "another", "keep")
101
101
  t = Time.now
@@ -8,7 +8,7 @@ describe Lumberjack::Device::Writer do
8
8
  let(:entry){ Lumberjack::LogEntry.new(time, Lumberjack::Severity::INFO, "test message", "app", 12345, "ABCD") }
9
9
 
10
10
  it "should buffer output and not write directly to the stream" do
11
- device = Lumberjack::Device::Writer.new(stream, :template => ":message")
11
+ device = Lumberjack::Device::Writer.new(stream, :template => ":message", :buffer_size => 32767)
12
12
  device.write(entry)
13
13
  stream.string.should == ""
14
14
  device.flush
@@ -34,7 +34,7 @@ describe Lumberjack::Device::Writer do
34
34
  def io.sync; @sync; end
35
35
  io.init
36
36
 
37
- device = Lumberjack::Device::Writer.new(io, :template => ":message")
37
+ device = Lumberjack::Device::Writer.new(io, :template => ":message", :buffer_size => 32767)
38
38
  device.write(entry)
39
39
  io.string.should == ""
40
40
  device.flush
@@ -49,9 +49,9 @@ describe Lumberjack::Device::Writer do
49
49
  device.buffer_size.should == 100
50
50
  end
51
51
 
52
- it "should have a default buffer size of 32K" do
52
+ it "should have a default buffer size of 0" do
53
53
  device = Lumberjack::Device::Writer.new(stream)
54
- device.buffer_size.should == 32768
54
+ device.buffer_size.should == 0
55
55
  end
56
56
 
57
57
  it "should write entries out to the stream with a default template" do
@@ -173,7 +173,7 @@ describe Lumberjack::Logger do
173
173
  context "flushing" do
174
174
  it "should autoflush the buffer if it hasn't been flushed in a specified number of seconds" do
175
175
  output = StringIO.new
176
- logger = Lumberjack::Logger.new(output, :flush_seconds => 0.1, :level => Lumberjack::Severity::INFO, :template => ":message")
176
+ logger = Lumberjack::Logger.new(output, :flush_seconds => 0.1, :level => Lumberjack::Severity::INFO, :template => ":message", :buffer_size => 32767)
177
177
  logger.info("message 1")
178
178
  logger.info("message 2")
179
179
  output.string.should == ""
@@ -187,7 +187,7 @@ describe Lumberjack::Logger do
187
187
 
188
188
  it "should write the log entries to the device on flush and update the last flushed time" do
189
189
  output = StringIO.new
190
- logger = Lumberjack::Logger.new(output, :level => Lumberjack::Severity::INFO, :template => ":message")
190
+ logger = Lumberjack::Logger.new(output, :level => Lumberjack::Severity::INFO, :template => ":message", :buffer_size => 32767)
191
191
  logger.info("message 1")
192
192
  output.string.should == ""
193
193
  last_flushed_at = logger.last_flushed_at
@@ -198,7 +198,7 @@ describe Lumberjack::Logger do
198
198
 
199
199
  it "should flush the buffer and close the devices" do
200
200
  output = StringIO.new
201
- logger = Lumberjack::Logger.new(output, :level => Lumberjack::Severity::INFO, :template => ":message")
201
+ logger = Lumberjack::Logger.new(output, :level => Lumberjack::Severity::INFO, :template => ":message", :buffer_size => 32767)
202
202
  logger.info("message 1")
203
203
  output.string.should == ""
204
204
  logger.close
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lumberjack
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 21
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
- - 0
10
- version: 1.0.0
9
+ - 1
10
+ version: 1.0.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Brian Durand
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-02-11 00:00:00 -06:00
18
+ date: 2011-06-23 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies: []
21
21
 
@@ -120,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
120
  requirements: []
121
121
 
122
122
  rubyforge_project:
123
- rubygems_version: 1.5.0
123
+ rubygems_version: 1.5.2
124
124
  signing_key:
125
125
  specification_version: 3
126
126
  summary: A simple, powerful, and very fast logging utility that can be a drop in replacement for Logger or ActiveSupport::BufferedLogger.