logdna 1.0.9 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 783a6b3016403a140faca9e0e097d5a3997b59b2
4
- data.tar.gz: 1d67f778ded84e82f7047e292256eca6ee51ca92
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ OTJiZmU0NGMxNmRjYTc0OWRhZTJkNTY4Mjc0ZTQ4Njg3ZGU1N2MxZA==
5
+ data.tar.gz: !binary |-
6
+ MjU4ZjYwZGJmY2I3NTcwMDkyMjJmNzc4N2QzNTgxYzdlYTExOGIxMA==
5
7
  SHA512:
6
- metadata.gz: 1e6653f54721fc2d7bc28df9dd546c9e7d34008b7dbb01080ef06da1e4b2c968c60ce4837e34c3f5f7ebb8a3937cc020dc8b0f3712d0378af22f9ff180a910fa
7
- data.tar.gz: ed2c73279b66651f8894b40eb9baa2abececab4a9d66197db5e39ec9112fbb4f9334cd324532744f28b69d4e7a0a64256f897f50b538faff039bed83f71765a9
8
+ metadata.gz: !binary |-
9
+ OGExMzVjOTMyY2NjNmUwMDY1YTkwNzdlNjkwNGIzMmYzNTQyNTdmMWY2ODEx
10
+ NzcyMjVkYWI0ZjRmN2EyNWU3OWVhMGFmZjgyY2I2Njc2YjQwYzdkOTg4YzFh
11
+ ZTI2MzQwYjQ4NzEzYzc5ODQxODgyYTRjMWI4NWNlNjAxNDkyYzg=
12
+ data.tar.gz: !binary |-
13
+ YmEyN2JiYmFkNGZkN2Y2NDg3ZmMwZTQ4ZDZiOGY1ZDg1NTZlMDBlMzVmMzAz
14
+ MDZhYjY2YmVkMDA4NzJhOWY5NGE3NDUwMzMzZjYxNzAwM2QyNTVjNmNlYjE1
15
+ YThmODJlMTU1YzJjODJkNmJhYWFiZWI4ZjFlYmMyNTllMTk5NTc=
@@ -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
- class Ruby < ::Logger
8
- Logger::TRACE = 5
9
- attr_accessor :level, :app, :env, :meta
10
- @level = nil
11
- @app = nil
12
- @env = nil
13
- @meta = nil
14
-
15
- def initialize(key, opts={})
16
- @@client = Logdna::Client.new(key, opts)
17
- sleep 0.01
18
-
19
- if @@client[:value] === Resources::LOGGER_NOT_CREATED
20
- @@client = nil
21
- puts "LogDNA logger not created"
22
- return
23
- end
24
- end
25
-
26
- def log(msg=nil, opts={})
27
- loggerExist?
28
- optionChanged?
29
- @response = @@client.tobuffer(msg, opts)
30
- 'Saved'
31
- end
32
-
33
- def trace(msg=nil, opts={})
34
- opts[:level] = "TRACE"
35
- loggerExist?
36
- optionChanged?
37
- @response = @@client.tobuffer(msg, opts)
38
- 'Saved'
39
- end
40
-
41
- def debug(msg=nil, opts={})
42
- opts[:level] = "DEBUG"
43
- loggerExist?
44
- optionChanged?
45
- @response = @@client.tobuffer(msg, opts)
46
- 'Saved'
47
- end
48
-
49
- def info(msg=nil, opts={})
50
- opts[:level] = "INFO"
51
- loggerExist?
52
- optionChanged?
53
- @response = @@client.tobuffer(msg, opts)
54
- 'Saved'
55
- end
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
- def trace?
82
- loggerExist?
83
- unless @level
84
- return 'TRACE' == @@client.getLevel
85
- end
86
- logLevel('TRACE')
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
- def debug?
90
- loggerExist?
91
- unless @level
92
- return 'DEBUG' == @@client.getLevel
93
- end
94
- logLevel('DEBUG')
95
- end
66
+ def default_opts
67
+ {
68
+ app: @app,
69
+ level: @level,
70
+ env: @env,
71
+ meta: @meta,
72
+ }
73
+ end
96
74
 
97
- def info?
98
- loggerExist?
99
- unless @level
100
- return 'INFO' == @@client.getLevel
101
- end
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
- def warn?
106
- loggerExist?
107
- unless @level
108
- return 'WARN' == @@client.getLevel
109
- end
110
- logLevel('WARN')
111
- end
81
+ @level = value
82
+ end
112
83
 
113
- def error?
114
- loggerExist?
115
- unless @level
116
- return 'ERROR' == @@client.getLevel
117
- end
118
- logLevel('ERROR')
119
- end
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
- def fatal?
122
- loggerExist?
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
- def clear
130
- loggerExist?
131
- @@client.clear()
132
- @level = nil
133
- @app = nil
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
- def loggerExist?
140
- if @@client.nil?
141
- puts "Logger Not Initialized Yet"
142
- close
143
- end
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
- def optionChanged?
147
- if @level || @app || @env || @meta
148
- @@client.change(@level, @app, @env, @meta)
149
- @level = nil
150
- @app = nil
151
- @env = nil
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
- def logLevel(comparedTo)
157
- if @level.is_a? Numeric
158
- @level = Resources::LOG_LEVELS[@level]
159
- end
160
- return comparedTo == @level.upcase
161
- end
114
+ def loggerExist?
115
+ if @@client.nil?
116
+ puts "Logger Not Initialized Yet"
117
+ close
118
+ end
119
+ end
162
120
 
163
- def <<(msg=nil, opts={})
164
- opts[:level] = ""
165
- loggerExist?
166
- optionChanged?
167
- @response = @@client.tobuffer(msg, opts)
168
- 'Saved'
169
- end
121
+ def <<(msg=nil, opts={})
122
+ self.log(msg, opts.merge({
123
+ level: '',
124
+ }))
125
+ end
170
126
 
171
- def add(*arg)
172
- puts "add not supported in LogDNA logger"
173
- return false
174
- end
127
+ def add(*arg)
128
+ puts "add not supported in LogDNA logger"
129
+ return false
130
+ end
175
131
 
176
- def unknown(msg=nil, opts={})
177
- opts[:level] = "UNKNOWN"
178
- loggerExist?
179
- optionChanged?
180
- @response = @@client.tobuffer(msg, opts)
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
- def datetime_format(*arg)
185
- puts "datetime_format not supported in LogDNA logger"
186
- return false
187
- end
138
+ def datetime_format(*arg)
139
+ puts "datetime_format not supported in LogDNA logger"
140
+ return false
141
+ end
188
142
 
189
143
 
190
- def close
191
- if defined? @@client
192
- @@client.exitout()
193
- end
194
- exit!
195
- end
144
+ def close
145
+ if defined? @@client and !@@client.nil?
146
+ @@client.exitout()
147
+ end
148
+ exit!
149
+ end
196
150
 
197
- at_exit do
198
- if defined? @@client
199
- @@client.exitout()
200
- end
201
- exit!
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
-
@@ -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
- class Client < Thread
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
- def change(level, app, env, meta)
59
- if level
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
- def clear()
77
- @qs[:level] = "INFO"
78
- @qs[:app] = "default"
79
- @qs[:env] = nil
80
- @qs[:meta] = nil
81
- end
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
- def getLevel
84
- @qs[:level].upcase
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
- def tobuffer(msg, opts)
88
- unless msg.nil?
89
- if @task
90
- unless @task.running?
91
- @task = Concurrent::TimerTask.new(execution_interval: @actual_flush_interval, timeout_interval: Resources::TIMER_OUT){ flush() }
92
- @task.execute
93
- end
94
- else
95
- @task = Concurrent::TimerTask.new(execution_interval: @actual_flush_interval, timeout_interval: Resources::TIMER_OUT){ flush() }
96
- @task.execute
97
- end
98
-
99
- unless msg.instance_of? String
100
- msg = msg.to_s
101
- end
102
-
103
- begin
104
- msg = msg.encode("UTF-8")
105
- rescue Encoding::UndefinedConversionError => e
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
- def flush()
137
- if defined? @@request
138
- @@semaphore.synchronize {
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
- def exitout()
161
- flush()
162
- join
163
- puts "Exiting LogDNA logger: Logging remaining messages"
164
- return
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
@@ -1,19 +1,15 @@
1
1
  module Resources
2
-
3
- LOG_LEVELS = ['DEBUG', 'INFO', 'WARN', 'ERROR', 'FATAL', 'TRACE'].freeze
4
- DEFAULT_REQUEST_HEADER = { 'Content-Type': 'application/json; charset=UTF-8' }.freeze
5
- DEFAULT_REQUEST_TIMEOUT = 180000
6
- MS_IN_A_DAY = 86400000
7
- MAX_REQUEST_TIMEOUT = 300000
8
- MAX_LINE_LENGTH = 32000
9
- MAX_INPUT_LENGTH = 80
10
- FLUSH_INTERVAL = 0.25
11
- TIMER_OUT = 15
12
- FLUSH_BYTE_LIMIT = 500000
13
- ENDPOINT = 'https://logs.logdna.com/logs/ingest'.freeze
14
- MAC_ADDR_CHECK = /^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$/
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
@@ -1,3 +1,3 @@
1
1
  module LogDNA
2
- VERSION = '1.0.9'.freeze
2
+ VERSION = '1.1.0'.freeze
3
3
  end
@@ -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 = 'matt.choi@logdna.com'
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: "new", meta:{:once => {:first => "nested1", :another => "nested2"}}}
5
+ options = {hostname: "new_ruby", meta:{:once => {:first => "nested1", :another => "nested2"}}}
6
6
 
7
7
 
8
- logger1 = Logdna::Ruby.new('You API KEY', options)
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.9
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-08-16 00:00:00.000000000 Z
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: matt.choi@logdna.com
112
+ email: support@logdna.com
99
113
  executables: []
100
114
  extensions: []
101
115
  extra_rdoc_files: []
102
116
  files:
103
- - ".gitignore"
104
- - ".rspec"
105
- - ".ruby-version"
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: []