logdna 1.0.9 → 1.1.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 +13 -5
- data/lib/logdna.rb +133 -180
- data/lib/logdna/client.rb +148 -151
- data/lib/logdna/resources.rb +13 -17
- data/lib/logdna/version.rb +1 -1
- data/logdna.gemspec +4 -2
- data/test.rb +2 -2
- metadata +35 -21
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
OTJiZmU0NGMxNmRjYTc0OWRhZTJkNTY4Mjc0ZTQ4Njg3ZGU1N2MxZA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MjU4ZjYwZGJmY2I3NTcwMDkyMjJmNzc4N2QzNTgxYzdlYTExOGIxMA==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
OGExMzVjOTMyY2NjNmUwMDY1YTkwNzdlNjkwNGIzMmYzNTQyNTdmMWY2ODEx
|
10
|
+
NzcyMjVkYWI0ZjRmN2EyNWU3OWVhMGFmZjgyY2I2Njc2YjQwYzdkOTg4YzFh
|
11
|
+
ZTI2MzQwYjQ4NzEzYzc5ODQxODgyYTRjMWI4NWNlNjAxNDkyYzg=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
YmEyN2JiYmFkNGZkN2Y2NDg3ZmMwZTQ4ZDZiOGY1ZDg1NTZlMDBlMzVmMzAz
|
14
|
+
MDZhYjY2YmVkMDA4NzJhOWY5NGE3NDUwMzMzZjYxNzAwM2QyNTVjNmNlYjE1
|
15
|
+
YThmODJlMTU1YzJjODJkNmJhYWFiZWI4ZjFlYmMyNTllMTk5NTc=
|
data/lib/logdna.rb
CHANGED
@@ -1,205 +1,158 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# encoding: utf-8
|
3
|
+
# require 'singleton'
|
3
4
|
require 'socket'
|
5
|
+
require 'uri'
|
4
6
|
require_relative 'logdna/client.rb'
|
5
7
|
require_relative 'logdna/resources.rb'
|
6
8
|
module Logdna
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
end
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
def warn(msg=nil, opts={})
|
58
|
-
opts[:level] = "WARN"
|
59
|
-
loggerExist?
|
60
|
-
optionChanged?
|
61
|
-
@response = @@client.tobuffer(msg, opts)
|
62
|
-
'Saved'
|
63
|
-
end
|
64
|
-
|
65
|
-
def error(msg=nil, opts={})
|
66
|
-
opts[:level] = "ERROR"
|
67
|
-
loggerExist?
|
68
|
-
optionChanged?
|
69
|
-
@response = @@client.tobuffer(msg, opts)
|
70
|
-
'Saved'
|
71
|
-
end
|
72
|
-
|
73
|
-
def fatal(msg=nil, opts={})
|
74
|
-
opts[:level] = "FATAL"
|
75
|
-
loggerExist?
|
76
|
-
optionChanged?
|
77
|
-
@response = @@client.tobuffer(msg, opts)
|
78
|
-
'Saved'
|
79
|
-
end
|
9
|
+
class ValidURLRequired < ArgumentError; end
|
10
|
+
class MaxLengthExceeded < ArgumentError; end
|
11
|
+
|
12
|
+
class Ruby < ::Logger
|
13
|
+
# uncomment line below and line 3 to enforce singleton
|
14
|
+
# include Singleton
|
15
|
+
Logger::TRACE = 5
|
16
|
+
attr_accessor :level, :app, :env, :meta
|
17
|
+
|
18
|
+
def initialize(key, opts={})
|
19
|
+
@app = opts[:app] || 'default'
|
20
|
+
@level = opts[:level] || 'INFO'
|
21
|
+
@env = opts[:env]
|
22
|
+
@meta = opts[:meta]
|
23
|
+
@@client = nil unless defined? @@client
|
24
|
+
|
25
|
+
hostname = opts[:hostname] || Socket.gethostname
|
26
|
+
ip = opts.key?(:ip) ? "&ip=#{opts[:ip]}" : ''
|
27
|
+
mac = opts.key?(:mac) ? "&mac=#{opts[:mac]}" : ''
|
28
|
+
url = "#{Resources::ENDPOINT}?hostname=#{hostname}#{mac}#{ip}"
|
29
|
+
|
30
|
+
begin
|
31
|
+
if (hostname.size > Resources::MAX_INPUT_LENGTH || @app.size > Resources::MAX_INPUT_LENGTH )
|
32
|
+
raise MaxLengthExceeded.new
|
33
|
+
end
|
34
|
+
rescue MaxLengthExceeded => e
|
35
|
+
puts "Hostname or Appname is over #{Resources::MAX_INPUT_LENGTH} characters"
|
36
|
+
handle_exception(e)
|
37
|
+
return
|
38
|
+
end
|
39
|
+
|
40
|
+
begin
|
41
|
+
uri = URI(url)
|
42
|
+
rescue URI::ValidURIRequired => e
|
43
|
+
puts "Invalid URL Endpoint: #{url}"
|
44
|
+
handle_exception(e)
|
45
|
+
return
|
46
|
+
end
|
47
|
+
|
48
|
+
begin
|
49
|
+
request = Net::HTTP::Post.new(uri.request_uri, 'Content-Type' => 'application/json')
|
50
|
+
request.basic_auth 'username', key
|
51
|
+
rescue => e
|
52
|
+
handle_exception(e)
|
53
|
+
return
|
54
|
+
end
|
55
|
+
|
56
|
+
@@client = Logdna::Client.new(request, uri, opts)
|
57
|
+
end
|
80
58
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
end
|
59
|
+
def handle_exception(e)
|
60
|
+
exception_message = e.message
|
61
|
+
exception_backtrace = e.backtrace
|
62
|
+
# NOTE: should log with Ruby logger?
|
63
|
+
puts exception_message
|
64
|
+
end
|
88
65
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
66
|
+
def default_opts
|
67
|
+
{
|
68
|
+
app: @app,
|
69
|
+
level: @level,
|
70
|
+
env: @env,
|
71
|
+
meta: @meta,
|
72
|
+
}
|
73
|
+
end
|
96
74
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
logLevel('INFO')
|
103
|
-
end
|
75
|
+
def level=(value)
|
76
|
+
if value.is_a? Numeric
|
77
|
+
@level = Resources::LOG_LEVELS[value]
|
78
|
+
return
|
79
|
+
end
|
104
80
|
|
105
|
-
|
106
|
-
|
107
|
-
unless @level
|
108
|
-
return 'WARN' == @@client.getLevel
|
109
|
-
end
|
110
|
-
logLevel('WARN')
|
111
|
-
end
|
81
|
+
@level = value
|
82
|
+
end
|
112
83
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
84
|
+
def log(msg=nil, opts={})
|
85
|
+
loggerExist?
|
86
|
+
@response = @@client.buffer(msg, default_opts.merge(opts).merge({
|
87
|
+
timestamp: (Time.now.to_f * 1000).to_i
|
88
|
+
}))
|
89
|
+
'Saved'
|
90
|
+
end
|
120
91
|
|
121
|
-
|
122
|
-
|
123
|
-
unless @level
|
124
|
-
return 'FATAL' == @@client.getLevel
|
125
|
-
end
|
126
|
-
logLevel('FATAL')
|
127
|
-
end
|
92
|
+
Resources::LOG_LEVELS.each do |lvl|
|
93
|
+
name = lvl.downcase
|
128
94
|
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
@env = nil
|
135
|
-
@meta = nil
|
136
|
-
return true
|
137
|
-
end
|
95
|
+
define_method name do |msg=nil, opts={}|
|
96
|
+
self.log(msg, opts.merge({
|
97
|
+
level: lvl,
|
98
|
+
}))
|
99
|
+
end
|
138
100
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
end
|
101
|
+
define_method "#{name}?" do
|
102
|
+
return Resources::LOG_LEVELS[self.level] == lvl if self.level.is_a? Numeric
|
103
|
+
self.level == lvl
|
104
|
+
end
|
105
|
+
end
|
145
106
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
@meta = nil
|
153
|
-
end
|
154
|
-
end
|
107
|
+
def clear
|
108
|
+
@app = 'default'
|
109
|
+
@level = 'INFO'
|
110
|
+
@env = nil
|
111
|
+
@meta = nil
|
112
|
+
end
|
155
113
|
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
114
|
+
def loggerExist?
|
115
|
+
if @@client.nil?
|
116
|
+
puts "Logger Not Initialized Yet"
|
117
|
+
close
|
118
|
+
end
|
119
|
+
end
|
162
120
|
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
'Saved'
|
169
|
-
end
|
121
|
+
def <<(msg=nil, opts={})
|
122
|
+
self.log(msg, opts.merge({
|
123
|
+
level: '',
|
124
|
+
}))
|
125
|
+
end
|
170
126
|
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
127
|
+
def add(*arg)
|
128
|
+
puts "add not supported in LogDNA logger"
|
129
|
+
return false
|
130
|
+
end
|
175
131
|
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
'Saved'
|
182
|
-
end
|
132
|
+
def unknown(msg=nil, opts={})
|
133
|
+
self.log(msg, opts.merge({
|
134
|
+
level: 'UNKNOWN',
|
135
|
+
}))
|
136
|
+
end
|
183
137
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
138
|
+
def datetime_format(*arg)
|
139
|
+
puts "datetime_format not supported in LogDNA logger"
|
140
|
+
return false
|
141
|
+
end
|
188
142
|
|
189
143
|
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
144
|
+
def close
|
145
|
+
if defined? @@client and !@@client.nil?
|
146
|
+
@@client.exitout()
|
147
|
+
end
|
148
|
+
exit!
|
149
|
+
end
|
196
150
|
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
end
|
151
|
+
at_exit do
|
152
|
+
if defined? @@client and !@@client.nil?
|
153
|
+
@@client.exitout()
|
154
|
+
end
|
155
|
+
exit!
|
203
156
|
end
|
157
|
+
end
|
204
158
|
end
|
205
|
-
|
data/lib/logdna/client.rb
CHANGED
@@ -1,169 +1,166 @@
|
|
1
1
|
require 'net/http'
|
2
|
-
require 'uri'
|
3
2
|
require 'socket'
|
4
3
|
require 'json'
|
5
4
|
require 'concurrent'
|
6
5
|
require 'thread'
|
6
|
+
|
7
7
|
module Logdna
|
8
|
-
|
9
|
-
|
10
|
-
class ValidURLRequired < ArgumentError; end
|
11
|
-
class MaxLengthExceeded < ArgumentError; end
|
12
|
-
|
13
|
-
def initialize(key, opts)
|
14
|
-
super do
|
15
|
-
@qs = {
|
16
|
-
:hostname => (opts[:hostname] ||= Socket.gethostname),
|
17
|
-
:ip => opts.key?(:ip) ? "&ip=#{opts[:ip]}" : "",
|
18
|
-
:mac => opts.key?(:mac) ? "&mac=#{opts[:mac]}" : "",
|
19
|
-
:app => (opts[:app] ||= "default"),
|
20
|
-
:level => (opts[:level] ||= "INFO"),
|
21
|
-
:env => (opts[:env]),
|
22
|
-
:meta => (opts[:meta])
|
23
|
-
}.reject { |k,v| k === :env && v.nil? }
|
24
|
-
|
25
|
-
begin
|
26
|
-
if (@qs[:hostname].size > Resources::MAX_INPUT_LENGTH || @qs[:app].size > Resources::MAX_INPUT_LENGTH )
|
27
|
-
raise MaxLengthExceeded.new
|
28
|
-
end
|
29
|
-
rescue MaxLengthExceeded => e
|
30
|
-
puts "Hostname or Appname is over #{Resources::MAX_INPUT_LENGTH} characters"
|
31
|
-
self[:value] = Resources::LOGGER_NOT_CREATED
|
32
|
-
return
|
33
|
-
end
|
34
|
-
|
35
|
-
@firstbuff = []
|
36
|
-
@secondbuff = []
|
37
|
-
@currentbytesize = 0
|
38
|
-
@secondbytesize = 0
|
39
|
-
@actual_flush_interval = opts[:flushtime] ||= Resources::FLUSH_INTERVAL
|
40
|
-
@actual_byte_limit = opts[:flushbyte] ||= Resources::FLUSH_BYTE_LIMIT
|
41
|
-
|
42
|
-
@url = "#{Resources::ENDPOINT}?hostname=#{@qs[:hostname]}#{@qs[:mac]}#{@qs[:ip]}"
|
43
|
-
@@semaphore = Mutex.new
|
44
|
-
begin
|
45
|
-
@uri = URI(@url)
|
46
|
-
rescue URI::ValidURIRequired => e
|
47
|
-
raise ValidURLRequired.new("Invalid URL Endpoint: #{@url}")
|
48
|
-
self[:value] = Resources::LOGGER_NOT_CREATED
|
49
|
-
return
|
50
|
-
end
|
51
|
-
|
52
|
-
@@request = Net::HTTP::Post.new(@uri, 'Content-Type' => 'application/json')
|
53
|
-
@@request.basic_auth 'username', key
|
54
|
-
self[:value] = Resources::LOGGER_CREATED
|
55
|
-
end
|
56
|
-
end
|
8
|
+
class Client
|
57
9
|
|
58
|
-
|
59
|
-
|
60
|
-
if level.is_a? Numeric
|
61
|
-
level = Resources::LOG_LEVELS[level]
|
62
|
-
end
|
63
|
-
@qs[:level] = level
|
64
|
-
end
|
65
|
-
if app
|
66
|
-
@qs[:app] = app
|
67
|
-
end
|
68
|
-
if env
|
69
|
-
@qs[:env] = env
|
70
|
-
end
|
71
|
-
if meta
|
72
|
-
@qs[:meta] = meta
|
73
|
-
end
|
74
|
-
end
|
10
|
+
def initialize(request, uri, opts)
|
11
|
+
@uri = uri
|
75
12
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
13
|
+
# NOTE: buffer is in memory
|
14
|
+
@buffer = StringIO.new
|
15
|
+
@messages = []
|
16
|
+
@buffer_over_limit = false
|
17
|
+
|
18
|
+
@side_buffer = StringIO.new
|
19
|
+
@side_messages = []
|
20
|
+
|
21
|
+
@lock = Mutex.new
|
22
|
+
@task = nil
|
23
|
+
|
24
|
+
# NOTE: the byte limit only affects the message, not the entire message_hash
|
25
|
+
@actual_byte_limit = opts[:flushbyte] ||= Resources::FLUSH_BYTE_LIMIT
|
26
|
+
@actual_flush_interval = opts[:flushtime] ||= Resources::FLUSH_INTERVAL
|
27
|
+
|
28
|
+
@@request = request
|
29
|
+
end
|
30
|
+
|
31
|
+
def encode_message(msg)
|
32
|
+
msg = msg.to_s unless msg.instance_of? String
|
82
33
|
|
83
|
-
|
84
|
-
|
34
|
+
begin
|
35
|
+
msg = msg.encode("UTF-8")
|
36
|
+
rescue Encoding::UndefinedConversionError => e
|
37
|
+
# NOTE: should this be raised or handled silently?
|
38
|
+
# raise e
|
39
|
+
end
|
40
|
+
msg
|
41
|
+
end
|
42
|
+
|
43
|
+
def message_hash(msg, opts={})
|
44
|
+
obj = {
|
45
|
+
line: msg,
|
46
|
+
app: opts[:app],
|
47
|
+
level: opts[:level],
|
48
|
+
env: opts[:env],
|
49
|
+
meta: opts[:meta],
|
50
|
+
timestamp: Time.now.to_i,
|
51
|
+
}
|
52
|
+
obj.delete(:meta) if obj[:meta].nil?
|
53
|
+
obj
|
54
|
+
end
|
55
|
+
|
56
|
+
def create_flush_task
|
57
|
+
return @task unless @task.nil? or !@task.running?
|
58
|
+
|
59
|
+
t = Concurrent::TimerTask.new(execution_interval: @actual_flush_interval, timeout_interval: Resources::TIMER_OUT) do |task|
|
60
|
+
if @messages.any?
|
61
|
+
# keep running if there are queued messages, but don't flush
|
62
|
+
# because the buffer is being flushed due to being over the limit
|
63
|
+
unless @buffer_over_limit
|
64
|
+
flush()
|
65
|
+
end
|
66
|
+
else
|
67
|
+
# no messages means we can kill the task
|
68
|
+
task.kill
|
85
69
|
end
|
70
|
+
end
|
71
|
+
t.execute
|
72
|
+
end
|
73
|
+
|
74
|
+
def check_side_buffer
|
75
|
+
return if @side_buffer.size == 0
|
76
|
+
|
77
|
+
@buffer.write(@side_buffer.string)
|
78
|
+
@side_buffer.truncate(0)
|
79
|
+
queued_side_messages = @side_messages
|
80
|
+
@side_messages = []
|
81
|
+
queued_side_messages.each { |message_hash_obj| @messages.push(message_hash_obj) }
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
# this should always be running synchronously within this thread
|
86
|
+
def buffer(msg, opts)
|
87
|
+
buffer_size = write_to_buffer(msg, opts)
|
88
|
+
unless buffer_size.nil?
|
89
|
+
process_buffer(buffer_size)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def write_to_buffer(msg, opts)
|
94
|
+
return if msg.nil?
|
95
|
+
msg = encode_message(msg)
|
96
|
+
|
97
|
+
if @lock.locked?
|
98
|
+
@side_buffer.write(msg)
|
99
|
+
@side_messages.push(message_hash(msg, opts))
|
100
|
+
return
|
101
|
+
end
|
102
|
+
|
103
|
+
check_side_buffer
|
104
|
+
buffer_size = @buffer.write(msg)
|
105
|
+
@messages.push(message_hash(msg, opts))
|
106
|
+
buffer_size
|
107
|
+
end
|
108
|
+
|
109
|
+
def queue_to_buffer(queue=@queue)
|
110
|
+
next_object = queue.shift
|
111
|
+
write_to_buffer(next_object[:msg], next_object[:opts])
|
112
|
+
end
|
86
113
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
raise e
|
107
|
-
end
|
108
|
-
unless @@semaphore.locked?
|
109
|
-
@currentbytesize += msg.bytesize
|
110
|
-
@firstbuff.push({
|
111
|
-
:line => msg,
|
112
|
-
:app => opts[:app] ||= @qs[:app],
|
113
|
-
:level => opts[:level] ||= @qs[:level],
|
114
|
-
:timestamp => Time.now.to_i,
|
115
|
-
:meta => (opts[:meta]) ? opts[:meta] : (@qs[:meta]) ? @qs[:meta] : nil,
|
116
|
-
:env => (opts[:env]) ? opts[:env] : (@qs[:env]) ? @qs[:env] : nil,
|
117
|
-
}.reject { |k,v| k === :meta && v.nil? })
|
118
|
-
else
|
119
|
-
@secondbytesize += msg.bytesize
|
120
|
-
@secondbuff.push({
|
121
|
-
:line => msg,
|
122
|
-
:app => opts[:app] ||= @qs[:app],
|
123
|
-
:level => opts[:level] ||= @qs[:level],
|
124
|
-
:timestamp => Time.now.to_i,
|
125
|
-
:meta => (opts[:meta]) ? opts[:meta] : (@qs[:meta]) ? @qs[:meta] : nil,
|
126
|
-
:env => (opts[:env]) ? opts[:env] : (@qs[:env]) ? @qs[:env] : nil,
|
127
|
-
}.reject { |k,v| k === :meta && v.nil? })
|
128
|
-
end
|
129
|
-
|
130
|
-
if @actual_byte_limit < @currentbytesize
|
131
|
-
flush()
|
132
|
-
end
|
133
|
-
end
|
114
|
+
def process_buffer(buffer_size)
|
115
|
+
if buffer_size > @actual_byte_limit
|
116
|
+
@buffer_over_limit = true
|
117
|
+
flush()
|
118
|
+
@buffer_over_limit = false
|
119
|
+
else
|
120
|
+
@task = create_flush_task
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
# this should be running synchronously if @buffer_over_limit i.e. called from self.buffer
|
125
|
+
# else asynchronously through @task
|
126
|
+
def flush()
|
127
|
+
if defined? @@request and !@@request.nil?
|
128
|
+
request_messages = []
|
129
|
+
@lock.synchronize do
|
130
|
+
request_messages = @messages
|
131
|
+
@buffer.truncate(0)
|
132
|
+
@messages = []
|
134
133
|
end
|
134
|
+
return if request_messages.empty?
|
135
|
+
|
136
|
+
real = {
|
137
|
+
e: 'ls',
|
138
|
+
ls: request_messages,
|
139
|
+
}.to_json
|
135
140
|
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
real = {:e => 'ls', :ls => @firstbuff }.to_json
|
140
|
-
@@request.body = real
|
141
|
-
@response = Net::HTTP.start(@uri.hostname, @uri.port, :use_ssl => @uri.scheme == 'https') do |http|
|
142
|
-
http.request(@@request)
|
143
|
-
end
|
144
|
-
unless @firstbuff.empty?
|
145
|
-
puts "Result: #{@response.body}"
|
146
|
-
end
|
147
|
-
@currentbytesize = @secondbytesize
|
148
|
-
@secondbytesize = 0
|
149
|
-
@firstbuff = []
|
150
|
-
@firstbuff = @firstbuff + @secondbuff
|
151
|
-
@secondbuff = []
|
152
|
-
unless @task.nil?
|
153
|
-
@task.shutdown
|
154
|
-
@task.kill
|
155
|
-
end
|
156
|
-
}
|
157
|
-
end
|
141
|
+
@@request.body = real
|
142
|
+
@response = Net::HTTP.start(@uri.hostname, @uri.port, use_ssl: @uri.scheme == 'https') do |http|
|
143
|
+
http.request(@@request)
|
158
144
|
end
|
159
145
|
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
146
|
+
puts "Result: #{@response.body}" unless request_messages.empty?
|
147
|
+
|
148
|
+
# don't kill @task if this was executed from self.buffer
|
149
|
+
# don't kill @task if there are queued messages
|
150
|
+
unless @buffer_over_limit || @messages.any? || @task.nil?
|
151
|
+
@task.shutdown
|
152
|
+
@task.kill
|
165
153
|
end
|
154
|
+
end
|
166
155
|
end
|
167
|
-
end
|
168
|
-
|
169
156
|
|
157
|
+
def exitout()
|
158
|
+
check_side_buffer
|
159
|
+
if @messages.any?
|
160
|
+
flush()
|
161
|
+
end
|
162
|
+
puts "Exiting LogDNA logger: Logging remaining messages"
|
163
|
+
return
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
data/lib/logdna/resources.rb
CHANGED
@@ -1,19 +1,15 @@
|
|
1
1
|
module Resources
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
IP_ADDR_CHECK = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
|
16
|
-
LOGGER_NOT_CREATED = "LOGGER_NOT_CREATED"
|
17
|
-
LOGGER_CREATED = "LOGGER_CREATED"
|
18
|
-
|
2
|
+
LOG_LEVELS = ['DEBUG', 'INFO', 'WARN', 'ERROR', 'FATAL', 'TRACE'].freeze
|
3
|
+
DEFAULT_REQUEST_HEADER = { 'Content-Type' => 'application/json; charset=UTF-8' }.freeze
|
4
|
+
DEFAULT_REQUEST_TIMEOUT = 180000
|
5
|
+
MS_IN_A_DAY = 86400000
|
6
|
+
MAX_REQUEST_TIMEOUT = 300000
|
7
|
+
MAX_LINE_LENGTH = 32000
|
8
|
+
MAX_INPUT_LENGTH = 80
|
9
|
+
FLUSH_INTERVAL = 0.25
|
10
|
+
TIMER_OUT = 15
|
11
|
+
FLUSH_BYTE_LIMIT = 500000
|
12
|
+
ENDPOINT = 'https://logs.logdna.com/logs/ingest'.freeze
|
13
|
+
MAC_ADDR_CHECK = /^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$/
|
14
|
+
IP_ADDR_CHECK = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
|
19
15
|
end
|
data/lib/logdna/version.rb
CHANGED
data/logdna.gemspec
CHANGED
@@ -6,8 +6,8 @@ require 'logdna/version'
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = 'logdna'
|
8
8
|
spec.version = LogDNA::VERSION
|
9
|
-
spec.authors = 'Gun Woo Choi'
|
10
|
-
spec.email = '
|
9
|
+
spec.authors = 'Gun Woo Choi, Derek Zhou'
|
10
|
+
spec.email = 'support@logdna.com'
|
11
11
|
|
12
12
|
spec.summary = 'LogDNA Ruby logger'
|
13
13
|
spec.homepage = 'https://github.com/logdna/ruby'
|
@@ -20,7 +20,9 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
21
|
spec.require_paths = ['lib']
|
22
22
|
|
23
|
+
|
23
24
|
spec.add_runtime_dependency 'concurrent-ruby', '~> 1.0'
|
25
|
+
spec.add_runtime_dependency 'require_all', '~> 1.4'
|
24
26
|
spec.add_runtime_dependency 'json', '~> 2.0'
|
25
27
|
|
26
28
|
spec.add_development_dependency 'bundler', '~> 1.13'
|
data/test.rb
CHANGED
@@ -2,10 +2,10 @@ require 'require_all'
|
|
2
2
|
require_all 'lib'
|
3
3
|
|
4
4
|
|
5
|
-
options = {hostname: "
|
5
|
+
options = {hostname: "new_ruby", meta:{:once => {:first => "nested1", :another => "nested2"}}}
|
6
6
|
|
7
7
|
|
8
|
-
logger1 = Logdna::Ruby.new('
|
8
|
+
logger1 = Logdna::Ruby.new('Your API KEY', options)
|
9
9
|
|
10
10
|
logger1.log('This is the start of test')
|
11
11
|
logger1.env = 'STAGING'
|
metadata
CHANGED
@@ -1,108 +1,122 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logdna
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
- Gun Woo Choi
|
7
|
+
- Gun Woo Choi, Derek Zhou
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-10-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: require_all
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.4'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.4'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: json
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
|
-
- -
|
45
|
+
- - ~>
|
32
46
|
- !ruby/object:Gem::Version
|
33
47
|
version: '2.0'
|
34
48
|
type: :runtime
|
35
49
|
prerelease: false
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
37
51
|
requirements:
|
38
|
-
- -
|
52
|
+
- - ~>
|
39
53
|
- !ruby/object:Gem::Version
|
40
54
|
version: '2.0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: bundler
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
|
-
- -
|
59
|
+
- - ~>
|
46
60
|
- !ruby/object:Gem::Version
|
47
61
|
version: '1.13'
|
48
62
|
type: :development
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
|
-
- -
|
66
|
+
- - ~>
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '1.13'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: rake
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
|
-
- -
|
73
|
+
- - ~>
|
60
74
|
- !ruby/object:Gem::Version
|
61
75
|
version: '10.5'
|
62
76
|
type: :development
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
|
-
- -
|
80
|
+
- - ~>
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: '10.5'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: rspec
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
|
-
- -
|
87
|
+
- - ~>
|
74
88
|
- !ruby/object:Gem::Version
|
75
89
|
version: '3.5'
|
76
90
|
type: :development
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
|
-
- -
|
94
|
+
- - ~>
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '3.5'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: webmock
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
86
100
|
requirements:
|
87
|
-
- -
|
101
|
+
- - ~>
|
88
102
|
- !ruby/object:Gem::Version
|
89
103
|
version: '2.3'
|
90
104
|
type: :development
|
91
105
|
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
94
|
-
- -
|
108
|
+
- - ~>
|
95
109
|
- !ruby/object:Gem::Version
|
96
110
|
version: '2.3'
|
97
111
|
description:
|
98
|
-
email:
|
112
|
+
email: support@logdna.com
|
99
113
|
executables: []
|
100
114
|
extensions: []
|
101
115
|
extra_rdoc_files: []
|
102
116
|
files:
|
103
|
-
-
|
104
|
-
-
|
105
|
-
-
|
117
|
+
- .gitignore
|
118
|
+
- .rspec
|
119
|
+
- .ruby-version
|
106
120
|
- Gemfile
|
107
121
|
- LICENSE.txt
|
108
122
|
- README.md
|
@@ -123,12 +137,12 @@ require_paths:
|
|
123
137
|
- lib
|
124
138
|
required_ruby_version: !ruby/object:Gem::Requirement
|
125
139
|
requirements:
|
126
|
-
- -
|
140
|
+
- - ! '>='
|
127
141
|
- !ruby/object:Gem::Version
|
128
142
|
version: '0'
|
129
143
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
130
144
|
requirements:
|
131
|
-
- -
|
145
|
+
- - ! '>='
|
132
146
|
- !ruby/object:Gem::Version
|
133
147
|
version: '0'
|
134
148
|
requirements: []
|