buffering_logger 1.0.0

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cd136895dcc57b5a55668e5667661afc9f2862cc
4
+ data.tar.gz: 2a6ff2532bb7c27445504613947d919fcc6c3680
5
+ SHA512:
6
+ metadata.gz: d29f06ff7715d96976cf797740c8c10e4494d4bc1b5026d2fb08e2b3cd5049d1ef81f2cb069731d878895461fb2fc2b02355fd8e7b03bc80ed4d5303bcbd7229
7
+ data.tar.gz: 41cba79ea6091ae71cf3099268490a223cbc39a03f4f99faba2c4d39e950c6c341bf498f565a063d96fbc184346a220ca8c0c06a46557d2811454008f71991df
@@ -0,0 +1,39 @@
1
+ # Buffer is used to wrap the logger's logdev to accomplish buffering.
2
+ # For the purposes of the Logger class a LogDevice only needs to implement
3
+ # #write and #close. We add #buffer and #flush as well.
4
+ module BufferingLogger
5
+ class Buffer
6
+ def initialize(logdev)
7
+ @logdev = logdev
8
+ @buffer = []
9
+ end
10
+
11
+ # buffers during the block and then flushes.
12
+ # returns the value of the block.
13
+ def buffered
14
+ buffering_was = @buffering # in case we're already buffering
15
+ @buffering = true
16
+ yield
17
+ ensure
18
+ @buffering = buffering_was
19
+ flush if !@buffering
20
+ end
21
+
22
+ def write(msg)
23
+ @buffer << msg
24
+ flush if !@buffering
25
+ end
26
+
27
+ def flush
28
+ if @buffer.any?
29
+ @logdev.write @buffer.join
30
+ @buffer.clear
31
+ end
32
+ end
33
+
34
+ def close
35
+ flush
36
+ @logdev.close
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,31 @@
1
+ require 'logger'
2
+
3
+ # Buffering happens within a #buffered block, like:
4
+ # logger.buffered { logger.info 'hi'; logger.info 'goodbye' }
5
+ # Buffering is implemented by wrapping the logger @logdev object with a Buffer.
6
+
7
+ module BufferingLogger
8
+ class Logger < ::Logger
9
+
10
+ def initialize(logdev, shift_age: 0, shift_size: 1048576)
11
+ @shift_age, @shift_size = shift_age, shift_size
12
+ super(nil, shift_age, shift_size)
13
+ self.logdev = logdev
14
+ end
15
+
16
+ # allow changing the log destination. e.g.: in Unicorn during after_fork to
17
+ # set a separate log path for each worker.
18
+ def logdev=(logdev)
19
+ @logdev.close if @logdev
20
+ @logdev = Buffer.new(
21
+ LogDevice.new(logdev, shift_age: @shift_age, shift_size: @shift_size)
22
+ )
23
+ end
24
+
25
+ def buffered
26
+ @logdev.buffered do
27
+ yield
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,11 @@
1
+ module BufferingLogger
2
+ class RackBuffer
3
+ def initialize(app, logger)
4
+ @app, @logger = app, logger
5
+ end
6
+
7
+ def call(env)
8
+ @logger.buffered { @app.call(env) }
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,30 @@
1
+ require 'buffering_logger'
2
+
3
+ module BufferingLogger
4
+ class Railtie < Rails::Railtie
5
+ initializer :buffering_logger, :before => :initialize_logger do |app|
6
+
7
+ # Does mostly the same things that Rails does. See http://git.io/2v9FxQ
8
+
9
+ path = app.paths["log"].first
10
+
11
+ unless File.exist? File.dirname path
12
+ FileUtils.mkdir_p File.dirname path
13
+ end
14
+
15
+ file = File.open(path, 'a')
16
+ file.binmode
17
+ file.sync = true # always flush to disk when write happen
18
+
19
+ logger = BufferingLogger::Logger.new(file)
20
+ logger.formatter = app.config.log_formatter
21
+ logger = ActiveSupport::TaggedLogging.new(logger)
22
+
23
+ app.config.logger = logger
24
+
25
+ # Inserts at the very beginning so that all logs, even from other
26
+ # middleware, get buffered together.
27
+ app.config.middleware.insert(0, BufferingLogger::RackBuffer, logger)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,3 @@
1
+ require 'buffering_logger/logger'
2
+ require 'buffering_logger/buffer'
3
+ require 'buffering_logger/rack_buffer'
metadata ADDED
@@ -0,0 +1,50 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: buffering_logger
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Jordan Brough
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-12-10 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Buffering makes it possible for log tools like Splunk or Logstash to
14
+ more reliably group multiline logs as single events.
15
+ email: rubygems.j@brgh.net
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/buffering_logger.rb
21
+ - lib/buffering_logger/buffer.rb
22
+ - lib/buffering_logger/logger.rb
23
+ - lib/buffering_logger/rack_buffer.rb
24
+ - lib/buffering_logger/rails.rb
25
+ homepage: https://github.com/jordan-brough/buffering_logger
26
+ licenses:
27
+ - MIT
28
+ metadata: {}
29
+ post_install_message:
30
+ rdoc_options: []
31
+ require_paths:
32
+ - lib
33
+ required_ruby_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ required_rubygems_version: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ requirements: []
44
+ rubyforge_project:
45
+ rubygems_version: 2.2.2
46
+ signing_key:
47
+ specification_version: 4
48
+ summary: BufferingLogger is a logger that buffers log entries and then writes them
49
+ all at once.
50
+ test_files: []