buffering_logger 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: []