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 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: []