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 +7 -0
- data/lib/buffering_logger/buffer.rb +39 -0
- data/lib/buffering_logger/logger.rb +31 -0
- data/lib/buffering_logger/rack_buffer.rb +11 -0
- data/lib/buffering_logger/rails.rb +30 -0
- data/lib/buffering_logger.rb +3 -0
- metadata +50 -0
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,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
|
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: []
|