redis_stream_logger 0.1.0 → 0.2.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 +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +30 -3
- data/lib/redis_stream_logger.rb +1 -0
- data/lib/redis_stream_logger/log_device.rb +19 -10
- data/lib/redis_stream_logger/railtie.rb +26 -0
- data/lib/redis_stream_logger/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 39514125c61948167aa8d2f5c6720daaff2e5a2014a982db9e28db08cfa17ced
|
4
|
+
data.tar.gz: 0d08dbcf9a91e83401cd2549a5ba0b4a08147e445e3b1df1dd90043aaf21f587
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 70de80ef89b06c7bd677ac15b96b9404fc312d49e98eb52d72738225119c7de0e3e276c7ad400fd13438a18ae3c71e5e8c629e8fe74fa917caefb23884e63bf4
|
7
|
+
data.tar.gz: 176fa6ae2845a05af6b2dd217777c3aa242b510f174589d860e8a6b1d2d9cb081d43638c44efa1adc201811dc263b677d7a2335506d6a859c8631bd7a083656e
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -5,6 +5,9 @@ This gem creates a [log device](https://github.com/ruby/logger/blob/bf6d5aa37ee9
|
|
5
5
|
The log device will buffer requests internally until either a time interval or buffer size is hit and then it will send all the log entries as a pipeline to minimize network
|
6
6
|
traffic.
|
7
7
|
|
8
|
+
There is a basic viewer for this logger (or any Redis stream if you're feeling brave) [here](https://github.com/mlh758/stream_log_viewer). It supports tailing
|
9
|
+
a stream or searching logs with basic text matching.
|
10
|
+
|
8
11
|
## Installation
|
9
12
|
|
10
13
|
Add this line to your application's Gemfile:
|
@@ -15,17 +18,41 @@ gem 'redis_stream_logger'
|
|
15
18
|
|
16
19
|
## Usage
|
17
20
|
|
18
|
-
To use in
|
21
|
+
To use in an application add something like this:
|
19
22
|
|
20
23
|
```rb
|
21
24
|
redis_log = RedisStreamLogger::LogDevice.new do |config|
|
22
25
|
config.connection = Redis.new
|
23
26
|
end
|
24
|
-
|
27
|
+
logger = Logger.new(redis_log)
|
25
28
|
```
|
26
29
|
|
27
30
|
It is _highly_ recommended that you set timeouts on your Redis connection. See the [Redis docs](https://github.com/redis/redis-rb/#timeouts).
|
28
31
|
|
32
|
+
If you are using a forking Rails server like Passenger this gets a lot weirder because currently the logger uses threads
|
33
|
+
to handle IO and avoid blocking the main app. For Rails and Passenger it will look something like this:
|
34
|
+
|
35
|
+
```rb
|
36
|
+
# config.ru
|
37
|
+
if defined?(PhusionPassenger)
|
38
|
+
PhusionPassenger.on_event(:starting_worker_process) do |forked|
|
39
|
+
next unless forked
|
40
|
+
Rails.logger.close
|
41
|
+
redis_log = RedisStreamLogger::LogDevice.new do |config|
|
42
|
+
config.connection = Redis.new
|
43
|
+
config.stream_name = 'app-logs'
|
44
|
+
end
|
45
|
+
logger = Logger.new(redis_log)
|
46
|
+
logger.level = Rails.application.config.log_level
|
47
|
+
Rails.logger = logger
|
48
|
+
Rails.application.config.logger = logger
|
49
|
+
Rails.application.config.action_controller.logger = logger
|
50
|
+
end
|
51
|
+
end
|
52
|
+
```
|
53
|
+
|
54
|
+
I'm currently looking for a way to use one of the async libraries to improve things.
|
55
|
+
|
29
56
|
### Configuration
|
30
57
|
|
31
58
|
* buffer_size: Max number of items to hold in queue before attempting to write a batch. Defaults to 100
|
@@ -39,7 +66,7 @@ It is _highly_ recommended that you set timeouts on your Redis connection. See t
|
|
39
66
|
|
40
67
|
## Path to 1.0
|
41
68
|
|
42
|
-
|
69
|
+
The use of threads caused unexpected headaches in applications that rely on forking like Passenger. I'm hoping this library can drop the reliance on threads.
|
43
70
|
|
44
71
|
## Development
|
45
72
|
|
data/lib/redis_stream_logger.rb
CHANGED
@@ -12,20 +12,15 @@ module RedisStreamLogger
|
|
12
12
|
def initialize(conn = nil, stream: 'rails-log')
|
13
13
|
@config = Config.new
|
14
14
|
@closed = false
|
15
|
-
|
15
|
+
# Just in case a whole new config is passed in like in the Railtie
|
16
|
+
new_conf = yield @config if block_given?
|
17
|
+
@config = new_conf if new_conf.is_a?(Config)
|
16
18
|
@config.connection ||= conn
|
17
19
|
@config.stream_name ||= stream
|
18
20
|
raise ArgumentError, 'must provide connection' if @config.connection.nil?
|
19
21
|
|
20
22
|
@q = Queue.new
|
21
|
-
|
22
|
-
@ticker = Thread.new do
|
23
|
-
ticker(@config.send_interval)
|
24
|
-
end
|
25
|
-
@writer = Thread.new do
|
26
|
-
writer(@config.buffer_size, @config.send_interval)
|
27
|
-
end
|
28
|
-
at_exit { close }
|
23
|
+
start
|
29
24
|
end
|
30
25
|
|
31
26
|
def write(msg)
|
@@ -33,7 +28,9 @@ module RedisStreamLogger
|
|
33
28
|
end
|
34
29
|
|
35
30
|
def reopen(log = nil)
|
36
|
-
|
31
|
+
close
|
32
|
+
@config.connection._client.connect
|
33
|
+
start
|
37
34
|
end
|
38
35
|
|
39
36
|
def close
|
@@ -47,6 +44,18 @@ module RedisStreamLogger
|
|
47
44
|
|
48
45
|
private
|
49
46
|
|
47
|
+
def start
|
48
|
+
@closed = false
|
49
|
+
@error_logger = ::Logger.new(STDERR)
|
50
|
+
@ticker = Thread.new do
|
51
|
+
ticker(@config.send_interval)
|
52
|
+
end
|
53
|
+
@writer = Thread.new do
|
54
|
+
writer(@config.buffer_size, @config.send_interval)
|
55
|
+
end
|
56
|
+
at_exit { close }
|
57
|
+
end
|
58
|
+
|
50
59
|
def send_options
|
51
60
|
return {} if @config.max_len.nil?
|
52
61
|
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'rails/railtie'
|
2
|
+
|
3
|
+
module RedisStreamLogger
|
4
|
+
# I based this heavily on the LogstashLogger implementation but we'll only
|
5
|
+
# accept our own config class here
|
6
|
+
def self.setup(app)
|
7
|
+
return unless app.config.redis_stream_logger.present?
|
8
|
+
conf = app.config.redis_stream_logger
|
9
|
+
raise ArgumentError, 'unexpected config class' unless conf.is_a?(Config)
|
10
|
+
|
11
|
+
logdev = RedisStreamLogger::LogDevice.new do |_c|
|
12
|
+
conf
|
13
|
+
end
|
14
|
+
|
15
|
+
logger = Logger.new(logdev)
|
16
|
+
logger.level = app.config.log_level
|
17
|
+
app.config.logger = logger
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class Railtie < ::Rails::Railtie
|
22
|
+
config.redis_stream_logger = nil
|
23
|
+
initializer :redis_stream_logger, before: :initialize_logger do |app|
|
24
|
+
RedisStreamLogger.setup(app)
|
25
|
+
end
|
26
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis_stream_logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Harris
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-02-
|
11
|
+
date: 2021-02-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
@@ -44,6 +44,7 @@ files:
|
|
44
44
|
- lib/redis_stream_logger.rb
|
45
45
|
- lib/redis_stream_logger/config.rb
|
46
46
|
- lib/redis_stream_logger/log_device.rb
|
47
|
+
- lib/redis_stream_logger/railtie.rb
|
47
48
|
- lib/redis_stream_logger/version.rb
|
48
49
|
- redis_stream_logger.gemspec
|
49
50
|
homepage: https://github.com/mlh758/redis_stream_logger
|