redis_stream_logger 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|