vx-lib-logger 0.2.2 → 0.3.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/lib/vx/lib/logger.rb +26 -10
- data/lib/vx/lib/logger/base_logger.rb +111 -0
- data/lib/vx/lib/logger/{logstash.rb → logstash_device.rb} +2 -3
- data/lib/vx/lib/logger/{journal_formatter.rb → logstash_formatter.rb} +1 -1
- data/lib/vx/lib/logger/logstash_logger.rb +35 -0
- data/lib/vx/lib/logger/rack/handle_exceptions.rb +1 -1
- data/lib/vx/lib/logger/sanitizer.rb +0 -12
- data/lib/vx/lib/logger/stdout_formatter.rb +11 -2
- data/lib/vx/lib/logger/stdout_logger.rb +27 -0
- data/lib/vx/lib/logger/version.rb +1 -1
- data/spec/lib/logger_spec.rb +1 -6
- data/spec/lib/{logstash_spec.rb → logstash_device_spec.rb} +3 -3
- data/spec/lib/logstash_logger_spec.rb +54 -0
- data/spec/lib/{instance_spec.rb → stdout_logger_spec.rb} +8 -22
- metadata +13 -9
- data/lib/vx/lib/logger/instance.rb +0 -134
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 64c86508190e0c1df39d9df46c9a0914c4494b14
|
4
|
+
data.tar.gz: 67a98127683d996e8f4eae7412ef93871b40bdab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ac21b0568bc6111366d950189fde48ff664f03b7e5c154f041ec25c1d15d54a40bd7c7a26e081f61f9b01fff3c6d7c60a62b25d8f671980edf74e870c1c756f
|
7
|
+
data.tar.gz: 983a53898174f7446157eca899a6c997b1a6c4ffde45f34a4bfae3db7adb3a671a95859a8efba04b595238a7544dfd7597e47ff0bf74e8c23105f6330715f57f
|
data/lib/vx/lib/logger.rb
CHANGED
@@ -4,25 +4,41 @@ require File.expand_path("../logger/version", __FILE__)
|
|
4
4
|
module Vx ; module Lib
|
5
5
|
module Logger
|
6
6
|
|
7
|
-
autoload :
|
7
|
+
autoload :LogstashDevice, File.expand_path("../logger/logstash_device", __FILE__)
|
8
8
|
autoload :StdoutFormatter, File.expand_path("../logger/stdout_formatter", __FILE__)
|
9
|
-
autoload :
|
10
|
-
autoload :
|
11
|
-
autoload :
|
9
|
+
autoload :LogstashFormatter,File.expand_path("../logger/logstash_formatter",__FILE__)
|
10
|
+
autoload :BaseLogger, File.expand_path("../logger/base_logger", __FILE__)
|
11
|
+
autoload :StdoutLogger, File.expand_path("../logger/stdout_logger", __FILE__)
|
12
|
+
autoload :LogstashLogger, File.expand_path("../logger/logstash_logger", __FILE__)
|
12
13
|
|
13
14
|
module Rack
|
14
15
|
autoload :HandleExceptions, File.expand_path("../logger/rack/handle_exceptions", __FILE__)
|
15
16
|
end
|
16
17
|
|
17
|
-
@@
|
18
|
-
@@default
|
18
|
+
@@progname = $0 && File.basename($0)
|
19
|
+
@@default = nil
|
20
|
+
@@logstash_device = nil
|
19
21
|
|
20
|
-
def self.
|
21
|
-
|
22
|
+
def self.progname=(value)
|
23
|
+
@@progname = value
|
22
24
|
end
|
23
25
|
|
24
|
-
def self.
|
25
|
-
@@
|
26
|
+
def self.progname
|
27
|
+
@@progname
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.logstash_device
|
31
|
+
@@logstash_device ||= LogstashDevice.new
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.get
|
35
|
+
@@default ||= begin
|
36
|
+
if logstash_device.enabled?
|
37
|
+
LogstashLogger.new
|
38
|
+
else
|
39
|
+
StdoutLogger.new(STDOUT)
|
40
|
+
end
|
41
|
+
end
|
26
42
|
end
|
27
43
|
|
28
44
|
def self.install_handle_exceptions_middleware
|
@@ -0,0 +1,111 @@
|
|
1
|
+
module Vx ; module Lib ; module Logger
|
2
|
+
|
3
|
+
class BaseLogger
|
4
|
+
|
5
|
+
def formatter
|
6
|
+
@formatter ||= ->(_,_,_,m) { m }
|
7
|
+
end
|
8
|
+
|
9
|
+
def formatter=(val) ; end
|
10
|
+
|
11
|
+
def progname
|
12
|
+
Lib::Logger.progname
|
13
|
+
end
|
14
|
+
|
15
|
+
def progname=(val)
|
16
|
+
Lib::Logger.progname = val
|
17
|
+
end
|
18
|
+
|
19
|
+
def level
|
20
|
+
@logger.level
|
21
|
+
end
|
22
|
+
|
23
|
+
def level=(new_val)
|
24
|
+
@logger.level = new_val
|
25
|
+
end
|
26
|
+
|
27
|
+
[:fatal, :warn, :debug, :error, :info].each do |m|
|
28
|
+
define_method m do |*args|
|
29
|
+
process_message(m, *args)
|
30
|
+
end
|
31
|
+
|
32
|
+
define_method :"#{m}?" do
|
33
|
+
@logger.public_send :"#{m}?"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def handle(message, options = {})
|
38
|
+
be = Time.now.to_f
|
39
|
+
re = nil
|
40
|
+
ex = nil
|
41
|
+
|
42
|
+
begin
|
43
|
+
re = yield options
|
44
|
+
rescue Exception => e
|
45
|
+
ex = e
|
46
|
+
end
|
47
|
+
|
48
|
+
en = Time.now.to_f
|
49
|
+
options.merge!(duration: (en - be))
|
50
|
+
|
51
|
+
if ex
|
52
|
+
error message, options.merge!(exception: ex) if ex
|
53
|
+
raise ex
|
54
|
+
else
|
55
|
+
info message, options
|
56
|
+
end
|
57
|
+
|
58
|
+
re
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def process_message(level, message, fields = {})
|
64
|
+
|
65
|
+
if fields[:exception] && fields[:exception].is_a?(Exception)
|
66
|
+
ex = fields.delete(:exception)
|
67
|
+
fields.merge!(
|
68
|
+
exception: [ex.class.to_s, ex.message].join(" - "),
|
69
|
+
backtrace: (ex.backtrace || []).map(&:to_s).join("\n"),
|
70
|
+
)
|
71
|
+
end
|
72
|
+
|
73
|
+
payload = {
|
74
|
+
thread_id: ::Thread.current.object_id,
|
75
|
+
}
|
76
|
+
|
77
|
+
if fields && fields != {}
|
78
|
+
|
79
|
+
duration = fields.delete(:duration)
|
80
|
+
if duration && duration.respond_to?(:to_f)
|
81
|
+
payload.merge!(duration: duration.to_f)
|
82
|
+
end
|
83
|
+
|
84
|
+
payload.merge!(
|
85
|
+
fields: sanitize_hash(fields)
|
86
|
+
)
|
87
|
+
end
|
88
|
+
|
89
|
+
@logger.public_send level, format_message(level, message, payload)
|
90
|
+
end
|
91
|
+
|
92
|
+
def sanitize_hash(payload)
|
93
|
+
payload = {} unless payload.is_a?(Hash)
|
94
|
+
|
95
|
+
payload.keys.each do |key_name|
|
96
|
+
value = payload[key_name]
|
97
|
+
unless value.is_a?(String)
|
98
|
+
payload[key_name] = value.to_s
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
payload
|
103
|
+
end
|
104
|
+
|
105
|
+
def format_message(level, message, payload)
|
106
|
+
raise NotImplementedError
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
end ; end ; end
|
@@ -4,7 +4,7 @@ require 'thread'
|
|
4
4
|
|
5
5
|
module Vx ; module Lib ; module Logger
|
6
6
|
|
7
|
-
class
|
7
|
+
class LogstashDevice
|
8
8
|
|
9
9
|
def initialize
|
10
10
|
@mutex = Mutex.new
|
@@ -58,7 +58,7 @@ module Vx ; module Lib ; module Logger
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def warn(msg)
|
61
|
-
$stderr.puts msg
|
61
|
+
$stderr.puts "[warn ] #{msg}"
|
62
62
|
end
|
63
63
|
|
64
64
|
def with_connection(&block)
|
@@ -77,7 +77,6 @@ module Vx ; module Lib ; module Logger
|
|
77
77
|
|
78
78
|
def connect
|
79
79
|
@io = TCPSocket.new(host, port).tap do |socket|
|
80
|
-
warn "#{self.class} - connect to #{uri.to_s}"
|
81
80
|
socket.sync = true
|
82
81
|
end
|
83
82
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'thread'
|
3
|
+
require 'socket'
|
4
|
+
|
5
|
+
module Vx ; module Lib ; module Logger
|
6
|
+
|
7
|
+
class LogstashLogger < BaseLogger
|
8
|
+
|
9
|
+
attr_reader :params, :logger, :logstash
|
10
|
+
|
11
|
+
def initialize(params = {})
|
12
|
+
@params = params
|
13
|
+
|
14
|
+
@logger = ::Logger.new(logstash_device)
|
15
|
+
@logger.formatter = self.formatter
|
16
|
+
@logger.progname = self.progname
|
17
|
+
end
|
18
|
+
|
19
|
+
def close
|
20
|
+
logstash_device.close
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def logstash_device
|
26
|
+
Lib::Logger.logstash_device
|
27
|
+
end
|
28
|
+
|
29
|
+
def format_message(level, message, payload)
|
30
|
+
LogstashFormatter.call(level, progname, message, payload)
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end ; end ; end
|
@@ -16,7 +16,7 @@ module Vx ; module Lib ; module Logger
|
|
16
16
|
|
17
17
|
def notify(exception, env)
|
18
18
|
unless ignore?(exception)
|
19
|
-
Lib::Logger.
|
19
|
+
Lib::Logger.get.fatal(
|
20
20
|
"Unhandled exception: #{exception.class} - #{exception.message}",
|
21
21
|
clean_env(env).merge(exception: exception)
|
22
22
|
)
|
@@ -2,18 +2,6 @@ module Vx ; module Lib ; module Logger
|
|
2
2
|
|
3
3
|
module Sanitizer
|
4
4
|
|
5
|
-
def self.hash(payload)
|
6
|
-
payload = {} unless payload.is_a?(Hash)
|
7
|
-
|
8
|
-
payload.keys.each do |key_name|
|
9
|
-
value = payload[key_name]
|
10
|
-
unless value.is_a?(String)
|
11
|
-
payload[key_name] = value.to_s
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
payload
|
16
|
-
end
|
17
5
|
|
18
6
|
end
|
19
7
|
|
@@ -5,8 +5,17 @@ module Vx ; module Lib ; module Logger
|
|
5
5
|
module StdoutFormatter
|
6
6
|
|
7
7
|
def self.call(level, message, payload)
|
8
|
-
payload
|
9
|
-
|
8
|
+
if payload[:fields] && payload[:fields] != {}
|
9
|
+
payload = " " + ::Oj.dump(payload[:fields], mode: :compat)
|
10
|
+
else
|
11
|
+
payload = ""
|
12
|
+
end
|
13
|
+
|
14
|
+
if level.length < 5
|
15
|
+
level = "#{level} "
|
16
|
+
end
|
17
|
+
|
18
|
+
"[#{level}] #{message}#{payload}\n"
|
10
19
|
end
|
11
20
|
|
12
21
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'thread'
|
3
|
+
require 'socket'
|
4
|
+
|
5
|
+
module Vx ; module Lib ; module Logger
|
6
|
+
|
7
|
+
class StdoutLogger < BaseLogger
|
8
|
+
|
9
|
+
attr_reader :params, :logger, :logstash
|
10
|
+
|
11
|
+
def initialize(io, params = {})
|
12
|
+
@params = params
|
13
|
+
|
14
|
+
@logger = ::Logger.new(io, 7, 50_000_000)
|
15
|
+
@logger.formatter = self.formatter
|
16
|
+
@logger.progname = self.progname
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def format_message(level, message, payload)
|
22
|
+
StdoutFormatter.call(level, message, payload)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end ; end ; end
|
data/spec/lib/logger_spec.rb
CHANGED
@@ -1,14 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Vx::Lib::Logger do
|
4
|
-
it "should get a new instance" do
|
4
|
+
it "should get a new instance of stdout logger" do
|
5
5
|
inst = Vx::Lib::Logger.get
|
6
6
|
assert inst
|
7
7
|
end
|
8
8
|
|
9
|
-
it "should get default instance" do
|
10
|
-
inst = Vx::Lib::Logger.default
|
11
|
-
assert inst
|
12
|
-
end
|
13
|
-
|
14
9
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe Vx::Lib::Logger::
|
3
|
+
describe Vx::Lib::Logger::LogstashDevice do
|
4
4
|
|
5
5
|
before do
|
6
6
|
ENV['LOGSTASH_HOST'] = 'localhost:9999'
|
@@ -12,7 +12,7 @@ describe Vx::Lib::Logger::Logstash do
|
|
12
12
|
|
13
13
|
it "should successfuly connect" do
|
14
14
|
re = with_socket do
|
15
|
-
log = Vx::Lib::Logger::
|
15
|
+
log = Vx::Lib::Logger::LogstashDevice.new
|
16
16
|
log.write("Hello\n")
|
17
17
|
log.close
|
18
18
|
end
|
@@ -20,7 +20,7 @@ describe Vx::Lib::Logger::Logstash do
|
|
20
20
|
end
|
21
21
|
|
22
22
|
it "should successfuly lost connection" do
|
23
|
-
log = Vx::Lib::Logger::
|
23
|
+
log = Vx::Lib::Logger::LogstashDevice.new
|
24
24
|
|
25
25
|
re = with_socket do
|
26
26
|
log.write("Hello\n")
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Vx::Lib::Logger::LogstashLogger do
|
4
|
+
|
5
|
+
before do
|
6
|
+
ENV['LOGSTASH_HOST'] = 'localhost:9999'
|
7
|
+
|
8
|
+
@log = Vx::Lib::Logger::LogstashLogger.new
|
9
|
+
assert @log
|
10
|
+
end
|
11
|
+
|
12
|
+
after do
|
13
|
+
ENV['LOGSTASH_HOST'] = nil
|
14
|
+
end
|
15
|
+
|
16
|
+
[:fatal, :warn, :debug, :error, :info].each do |m|
|
17
|
+
it "should write #{m} message" do
|
18
|
+
re = with_socket do
|
19
|
+
@log.public_send(m, "send #{m}")
|
20
|
+
@log.close
|
21
|
+
end
|
22
|
+
assert_match(/send #{m}/, re)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should write message with params" do
|
27
|
+
re = with_socket do
|
28
|
+
@log.info "text message", param: :value
|
29
|
+
@log.close
|
30
|
+
end
|
31
|
+
assert_match(/text message/, re)
|
32
|
+
assert_match(/"param":/, re)
|
33
|
+
assert_match(/:"value"/, re)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should write message with exception in params" do
|
37
|
+
re = with_socket do
|
38
|
+
@log.info "text message", exception: Exception.new("got!")
|
39
|
+
@log.close
|
40
|
+
end
|
41
|
+
assert_match(/text message/, re)
|
42
|
+
assert_match(/"exception":/, re)
|
43
|
+
assert_match(/:"Exception - got!"/, re)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should dump invalid unicode key" do
|
47
|
+
re = with_socket do
|
48
|
+
@log.info "Le Caf\xc3\xa9 \xa9", key: "Le Caf\xc3\xa9 \xa9"
|
49
|
+
@log.close
|
50
|
+
end
|
51
|
+
assert_match(/Le Caf/, re)
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -2,25 +2,26 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
require 'stringio'
|
4
4
|
|
5
|
-
describe Vx::Lib::Logger::
|
5
|
+
describe Vx::Lib::Logger::StdoutLogger do
|
6
6
|
|
7
7
|
before do
|
8
8
|
@out = StringIO.new
|
9
|
-
@log = Vx::Lib::Logger.
|
9
|
+
@log = Vx::Lib::Logger::StdoutLogger.new(@out)
|
10
10
|
assert @log
|
11
11
|
end
|
12
12
|
|
13
13
|
[:fatal, :warn, :debug, :error, :info].each do |m|
|
14
14
|
it "should write #{m} message" do
|
15
15
|
@log.public_send(m, "send #{m}")
|
16
|
-
|
16
|
+
level = m.length < 5 ? "#{m} " : m
|
17
|
+
text = "[#{level}] send #{m}\n"
|
17
18
|
assert_equal text, get_out
|
18
19
|
end
|
19
20
|
end
|
20
21
|
|
21
22
|
it "should write message with params" do
|
22
23
|
@log.info "text message", param: :value
|
23
|
-
text = "[info] text message
|
24
|
+
text = "[info ] text message {\"param\":\"value\"}\n"
|
24
25
|
assert_equal text, get_out
|
25
26
|
end
|
26
27
|
|
@@ -31,7 +32,7 @@ describe Vx::Lib::Logger::Instance do
|
|
31
32
|
|
32
33
|
it "should write message with exception in params" do
|
33
34
|
@log.info "text message", exception: Exception.new("got!")
|
34
|
-
text = "[info] text message
|
35
|
+
text = "[info ] text message {\"exception\":\"Exception - got!\",\"backtrace\":\"\"}\n"
|
35
36
|
assert_equal text, get_out
|
36
37
|
end
|
37
38
|
|
@@ -39,7 +40,7 @@ describe Vx::Lib::Logger::Instance do
|
|
39
40
|
@log.handle "text message" do
|
40
41
|
sleep 0.1
|
41
42
|
end
|
42
|
-
assert_match(/
|
43
|
+
assert_match(/text message/, get_out)
|
43
44
|
|
44
45
|
begin
|
45
46
|
@log.handle "text message", key: :value do
|
@@ -49,7 +50,6 @@ describe Vx::Lib::Logger::Instance do
|
|
49
50
|
end
|
50
51
|
|
51
52
|
body = get_out
|
52
|
-
assert_match(/duration/, body)
|
53
53
|
assert_match(/key/, body)
|
54
54
|
assert_match(/value/, body)
|
55
55
|
assert_match(/got\!/, body)
|
@@ -58,24 +58,10 @@ describe Vx::Lib::Logger::Instance do
|
|
58
58
|
|
59
59
|
it "should dump invalid unicode key" do
|
60
60
|
@log.info "Le Caf\xc3\xa9 \xa9", key: "Le Caf\xc3\xa9 \xa9"
|
61
|
-
text = "[info] Le Café \xA9
|
61
|
+
text = "[info ] Le Café \xA9 {\"key\":\"Le Café \xA9\"}\n"
|
62
62
|
assert_equal text, get_out
|
63
63
|
end
|
64
64
|
|
65
|
-
it "should write message with logstash" do
|
66
|
-
begin
|
67
|
-
ENV['LOGSTASH_HOST'] = 'localhost:9999'
|
68
|
-
log = Vx::Lib::Logger.get(@out)
|
69
|
-
re = with_socket do
|
70
|
-
log.info "Hello"
|
71
|
-
end
|
72
|
-
assert_match(/Hello/, re)
|
73
|
-
assert_match(/Hello/, get_out)
|
74
|
-
ensure
|
75
|
-
ENV['LOGSTASH_HOST'] = nil
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
65
|
def get_out
|
80
66
|
@out.rewind
|
81
67
|
body = @out.read
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vx-lib-logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dmitry Galinsky
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oj
|
@@ -65,17 +65,20 @@ files:
|
|
65
65
|
- README.md
|
66
66
|
- Rakefile
|
67
67
|
- lib/vx/lib/logger.rb
|
68
|
-
- lib/vx/lib/logger/
|
69
|
-
- lib/vx/lib/logger/
|
70
|
-
- lib/vx/lib/logger/
|
68
|
+
- lib/vx/lib/logger/base_logger.rb
|
69
|
+
- lib/vx/lib/logger/logstash_device.rb
|
70
|
+
- lib/vx/lib/logger/logstash_formatter.rb
|
71
|
+
- lib/vx/lib/logger/logstash_logger.rb
|
71
72
|
- lib/vx/lib/logger/rack/handle_exceptions.rb
|
72
73
|
- lib/vx/lib/logger/sanitizer.rb
|
73
74
|
- lib/vx/lib/logger/stdout_formatter.rb
|
75
|
+
- lib/vx/lib/logger/stdout_logger.rb
|
74
76
|
- lib/vx/lib/logger/version.rb
|
75
|
-
- spec/lib/instance_spec.rb
|
76
77
|
- spec/lib/logger_spec.rb
|
77
|
-
- spec/lib/
|
78
|
+
- spec/lib/logstash_device_spec.rb
|
79
|
+
- spec/lib/logstash_logger_spec.rb
|
78
80
|
- spec/lib/rack_handle_exceptions_spec.rb
|
81
|
+
- spec/lib/stdout_logger_spec.rb
|
79
82
|
- spec/spec_helper.rb
|
80
83
|
- vexor.yml
|
81
84
|
- vx-lib-logger.gemspec
|
@@ -104,8 +107,9 @@ signing_key:
|
|
104
107
|
specification_version: 4
|
105
108
|
summary: summary
|
106
109
|
test_files:
|
107
|
-
- spec/lib/instance_spec.rb
|
108
110
|
- spec/lib/logger_spec.rb
|
109
|
-
- spec/lib/
|
111
|
+
- spec/lib/logstash_device_spec.rb
|
112
|
+
- spec/lib/logstash_logger_spec.rb
|
110
113
|
- spec/lib/rack_handle_exceptions_spec.rb
|
114
|
+
- spec/lib/stdout_logger_spec.rb
|
111
115
|
- spec/spec_helper.rb
|
@@ -1,134 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
require 'thread'
|
3
|
-
require 'socket'
|
4
|
-
|
5
|
-
module Vx ; module Lib ; module Logger
|
6
|
-
|
7
|
-
class Instance
|
8
|
-
|
9
|
-
attr_reader :params, :logger, :logstash
|
10
|
-
|
11
|
-
def initialize(io, params = {})
|
12
|
-
@logstash = params.delete(:logstash)
|
13
|
-
@params = params
|
14
|
-
|
15
|
-
@progname = @params.delete(:progname)
|
16
|
-
|
17
|
-
@progname ||= begin
|
18
|
-
pname = $PROGRAM_NAME
|
19
|
-
pname && File.basename(pname)
|
20
|
-
end
|
21
|
-
|
22
|
-
@formatter = ->(_,_,_,m) { m }
|
23
|
-
|
24
|
-
@logger = ::Logger.new(io, 7, 50_000_000)
|
25
|
-
@logger.formatter = @formatter
|
26
|
-
@logger.progname = @progname
|
27
|
-
|
28
|
-
@logstash_logger = ::Logger.new(logstash)
|
29
|
-
@logstash_logger.formatter = @formatter
|
30
|
-
@logstash_logger.progname = @progname
|
31
|
-
end
|
32
|
-
|
33
|
-
[:fatal, :warn, :debug, :error, :info].each do |m|
|
34
|
-
define_method m do |*args|
|
35
|
-
process_message(m, *args)
|
36
|
-
end
|
37
|
-
|
38
|
-
define_method :"#{m}?" do
|
39
|
-
@logger.public_send :"#{m}?"
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def level
|
44
|
-
@logger.level
|
45
|
-
end
|
46
|
-
|
47
|
-
def level=(new_val)
|
48
|
-
@logger.level = new_val
|
49
|
-
@logstash_logger.level = new_val
|
50
|
-
end
|
51
|
-
|
52
|
-
def progname=(new_val)
|
53
|
-
@progname = new_val
|
54
|
-
end
|
55
|
-
|
56
|
-
def formatter ; nil ; end
|
57
|
-
def formatter=(val) ; nil ; end
|
58
|
-
|
59
|
-
def handle(message, options = {})
|
60
|
-
be = Time.now.to_f
|
61
|
-
re = nil
|
62
|
-
ex = nil
|
63
|
-
|
64
|
-
begin
|
65
|
-
re = yield options
|
66
|
-
rescue Exception => e
|
67
|
-
ex = e
|
68
|
-
end
|
69
|
-
|
70
|
-
en = Time.now.to_f
|
71
|
-
options.merge!(duration: (en - be))
|
72
|
-
|
73
|
-
if ex
|
74
|
-
error message, options.merge!(exception: ex) if ex
|
75
|
-
raise ex
|
76
|
-
else
|
77
|
-
info message, options
|
78
|
-
end
|
79
|
-
|
80
|
-
re
|
81
|
-
end
|
82
|
-
|
83
|
-
private
|
84
|
-
|
85
|
-
def process_message(level, message, options = {})
|
86
|
-
|
87
|
-
if level.to_s == 'fatal'
|
88
|
-
puts caller.inspect
|
89
|
-
end
|
90
|
-
|
91
|
-
if options[:exception] && options[:exception].is_a?(Exception)
|
92
|
-
ex = options.delete(:exception)
|
93
|
-
options.merge!(
|
94
|
-
exception: [ex.class.to_s, ex.message].join(" - "),
|
95
|
-
backtrace: (ex.backtrace || []).map(&:to_s).join("\n"),
|
96
|
-
)
|
97
|
-
end
|
98
|
-
|
99
|
-
body = {
|
100
|
-
thread_id: ::Thread.current.object_id,
|
101
|
-
}
|
102
|
-
|
103
|
-
if options && options != {}
|
104
|
-
|
105
|
-
duration = options.delete(:duration)
|
106
|
-
if duration && duration.respond_to?(:to_f)
|
107
|
-
body.merge!(duration: duration.to_f)
|
108
|
-
end
|
109
|
-
|
110
|
-
body.merge!(
|
111
|
-
fields: Sanitizer.hash(options)
|
112
|
-
)
|
113
|
-
end
|
114
|
-
|
115
|
-
|
116
|
-
@logger.public_send level, format_stdout(level, message, body)
|
117
|
-
|
118
|
-
if logstash.enabled?
|
119
|
-
@logstash_logger.public_send level, format_journal(level, message, body)
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
def format_stdout(level, message, payload)
|
124
|
-
StdoutFormatter.call(level, message, payload)
|
125
|
-
end
|
126
|
-
|
127
|
-
def format_journal(level, message, payload)
|
128
|
-
JournalFormatter.call(level, @progname, message, payload)
|
129
|
-
|
130
|
-
end
|
131
|
-
|
132
|
-
end
|
133
|
-
|
134
|
-
end ; end ; end
|