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