fluent-logger 0.4.6 → 0.4.7

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.
data/ChangeLog CHANGED
@@ -1,3 +1,8 @@
1
+ Release 0.4.7 - 2013/11/21
2
+
3
+ * Suppress log error message with :log_reconnect_error_threshold option
4
+ * Add FluentLogger#last_error method to get last exception in user code
5
+
1
6
  Release 0.4.6 - 2013/06/17
2
7
 
3
8
  * Raise an ArgumentError when passes invalid argument to post method
data/README.md ADDED
@@ -0,0 +1,63 @@
1
+ # Fluent logger
2
+ A structured event loger
3
+
4
+ ## Examples
5
+
6
+ ### Simple
7
+
8
+ ```ruby
9
+ require 'fluent-logger'
10
+
11
+ log = Fluent::Logger::FluentLogger.new(nil, :host=>'localhost', :port=>24224)
12
+ unless log.post("myapp.access", {"agent"=>"foo"})
13
+ p log.last_error # You can get last error object via last_error method
14
+ end
15
+
16
+ # output: myapp.access {"agent":"foo"}
17
+ ```
18
+
19
+ ### Singleton
20
+ ```ruby
21
+ require 'fluent-logger'
22
+
23
+ Fluent::Logger::FluentLogger.open(nil, :host=>'localhost', :port=>24224)
24
+ Fluent::Logger.post("myapp.access", {"agent"=>"foo"})
25
+
26
+ # output: myapp.access {"agent":"foo"}
27
+ ```
28
+
29
+ ### Tag prefix
30
+ ```ruby
31
+ require 'fluent-logger'
32
+
33
+ log = Fluent::Logger::FluentLogger.new('myapp', :host=>'localhost', :port=>24224)
34
+ log.post("access", {"agent"=>"foo"})
35
+
36
+ # output: myapp.access {"agent":"foo"}
37
+ ```
38
+
39
+ ## Loggers
40
+
41
+ ### Fluent
42
+ ```ruby
43
+ Fluent::Logger::FluentLogger.open('tag_prefix', :host=>'localhost', :port=24224)
44
+ ```
45
+
46
+ ### Console
47
+ ```ruby
48
+ Fluent::Logger::ConsoleLogger.open(io)
49
+ ```
50
+
51
+ ### Null
52
+ ```ruby
53
+ Fluent::Logger::NullLogger.open
54
+ ```
55
+
56
+ |name|description|
57
+ |---|---|
58
+ |Web site|http://fluent.github.com/|
59
+ |Documents|http://fluent.github.com/doc/|
60
+ |Source repository|https://github.com/fluent/fluent-logger-ruby|
61
+ |Author|Sadayuki Furuhashi|
62
+ |Copyright|(c) 2011 FURUHASHI Sadayuki|
63
+ |License|Apache License, Version 2.0|
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.6
1
+ 0.4.7
@@ -81,6 +81,7 @@ class FluentLogger < LoggerBase
81
81
  @connect_error_history = []
82
82
 
83
83
  @limit = options[:buffer_limit] || BUFFER_LIMIT
84
+ @log_reconnect_error_threshold = options[:log_reconnect_error_threshold] || RECONNECT_WAIT_MAX_COUNT
84
85
 
85
86
  if logger = options[:logger]
86
87
  @logger = logger
@@ -93,15 +94,23 @@ class FluentLogger < LoggerBase
93
94
  end
94
95
  end
95
96
 
97
+ @last_error = {}
98
+
96
99
  begin
97
100
  connect!
98
- rescue
101
+ rescue => e
102
+ set_last_error(e)
99
103
  @logger.error "Failed to connect fluentd: #{$!}"
100
104
  @logger.error "Connection will be retried."
101
105
  end
102
106
  end
103
107
 
104
- attr_accessor :limit, :logger
108
+ attr_accessor :limit, :logger, :log_reconnect_error_threshold
109
+ attr_reader :last_error
110
+
111
+ def last_error
112
+ @last_error[Thread.current.object_id]
113
+ end
105
114
 
106
115
  def post_with_time(tag, map, time)
107
116
  @logger.debug { "event: #{tag} #{map.to_json}" rescue nil }
@@ -114,7 +123,8 @@ class FluentLogger < LoggerBase
114
123
  if @pending
115
124
  begin
116
125
  send_data(@pending)
117
- rescue
126
+ rescue => e
127
+ set_last_error(e)
118
128
  @logger.error("FluentLogger: Can't send logs to #{@host}:#{@port}: #{$!}")
119
129
  end
120
130
  end
@@ -142,10 +152,19 @@ class FluentLogger < LoggerBase
142
152
  end
143
153
  end
144
154
 
155
+ def suppress_sec
156
+ if (sz = @connect_error_history.size) < RECONNECT_WAIT_MAX_COUNT
157
+ RECONNECT_WAIT * (RECONNECT_WAIT_INCR_RATE ** (sz - 1))
158
+ else
159
+ RECONNECT_WAIT_MAX
160
+ end
161
+ end
162
+
145
163
  def write(msg)
146
164
  begin
147
165
  data = to_msgpack(msg)
148
- rescue
166
+ rescue => e
167
+ set_last_error(e)
149
168
  @logger.error("FluentLogger: Can't convert to msgpack: #{msg.inspect}: #{$!}")
150
169
  return false
151
170
  end
@@ -159,11 +178,6 @@ class FluentLogger < LoggerBase
159
178
 
160
179
  # suppress reconnection burst
161
180
  if !@connect_error_history.empty? && @pending.bytesize <= @limit
162
- if (sz = @connect_error_history.size) < RECONNECT_WAIT_MAX_COUNT
163
- suppress_sec = RECONNECT_WAIT * (RECONNECT_WAIT_INCR_RATE ** (sz - 1))
164
- else
165
- suppress_sec = RECONNECT_WAIT_MAX
166
- end
167
181
  if Time.now.to_i - @connect_error_history.last < suppress_sec
168
182
  return false
169
183
  end
@@ -173,7 +187,8 @@ class FluentLogger < LoggerBase
173
187
  send_data(@pending)
174
188
  @pending = nil
175
189
  true
176
- rescue
190
+ rescue => e
191
+ set_last_error(e)
177
192
  if @pending.bytesize > @limit
178
193
  @logger.error("FluentLogger: Can't send logs to #{@host}:#{@port}: #{$!}")
179
194
  @pending = nil
@@ -210,12 +225,28 @@ class FluentLogger < LoggerBase
210
225
  @con = TCPSocket.new(@host, @port)
211
226
  @con.sync = true
212
227
  @connect_error_history.clear
213
- rescue
228
+ @logged_reconnect_error = false
229
+ rescue => e
214
230
  @connect_error_history << Time.now.to_i
215
231
  if @connect_error_history.size > RECONNECT_WAIT_MAX_COUNT
216
232
  @connect_error_history.shift
217
233
  end
218
- raise
234
+
235
+ if @connect_error_history.size >= @log_reconnect_error_threshold && !@logged_reconnect_error
236
+ log_reconnect_error
237
+ @logged_reconnect_error = true
238
+ end
239
+
240
+ raise e
241
+ end
242
+
243
+ def log_reconnect_error
244
+ @logger.error("FluentLogger: Can't connect to #{@host}:#{@port}(#{@connect_error_history.size} retried): #{$!}")
245
+ end
246
+
247
+ def set_last_error(e)
248
+ # TODO: Check non GVL env
249
+ @last_error[Thread.current.object_id] = e
219
250
  end
220
251
  end
221
252
 
@@ -1,7 +1,7 @@
1
1
  module Fluent
2
2
  module Logger
3
3
 
4
- VERSION = '0.4.6'
4
+ VERSION = '0.4.7'
5
5
 
6
6
  end
7
7
  end
@@ -225,6 +225,19 @@ EOF
225
225
  logger_io.rewind
226
226
  logger_io.read.should =~ /Can't send logs to/
227
227
  end
228
+
229
+ it ('log connect error once') do
230
+ logger.stub(:suppress_sec).and_return(-1)
231
+ logger.log_reconnect_error_threshold = 1
232
+ logger.should_receive(:log_reconnect_error).once.and_call_original
233
+
234
+ logger.post('tag', {'a' => 'b'})
235
+ wait_transfer # even if wait
236
+ logger.post('tag', {'a' => 'b'})
237
+ wait_transfer # even if wait
238
+ logger_io.rewind
239
+ logger_io.read.should =~ /Can't connect to/
240
+ end
228
241
  end
229
242
  end
230
243
 
metadata CHANGED
@@ -1,18 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-logger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.6
4
+ version: 0.4.7
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Sadayuki Furuhashi
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2013-06-17 00:00:00.000000000 Z
12
+ date: 2013-11-21 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: yajl-ruby
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
19
  - - ~>
18
20
  - !ruby/object:Gem::Version
@@ -20,6 +22,7 @@ dependencies:
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
27
  - - ~>
25
28
  - !ruby/object:Gem::Version
@@ -27,20 +30,21 @@ dependencies:
27
30
  - !ruby/object:Gem::Dependency
28
31
  name: msgpack
29
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
30
34
  requirements:
31
- - - '>='
35
+ - - ! '>='
32
36
  - !ruby/object:Gem::Version
33
37
  version: 0.4.4
34
- - - '!='
38
+ - - ! '!='
35
39
  - !ruby/object:Gem::Version
36
40
  version: 0.5.0
37
- - - '!='
41
+ - - ! '!='
38
42
  - !ruby/object:Gem::Version
39
43
  version: 0.5.1
40
- - - '!='
44
+ - - ! '!='
41
45
  - !ruby/object:Gem::Version
42
46
  version: 0.5.2
43
- - - '!='
47
+ - - ! '!='
44
48
  - !ruby/object:Gem::Version
45
49
  version: 0.5.3
46
50
  - - <
@@ -49,20 +53,21 @@ dependencies:
49
53
  type: :runtime
50
54
  prerelease: false
51
55
  version_requirements: !ruby/object:Gem::Requirement
56
+ none: false
52
57
  requirements:
53
- - - '>='
58
+ - - ! '>='
54
59
  - !ruby/object:Gem::Version
55
60
  version: 0.4.4
56
- - - '!='
61
+ - - ! '!='
57
62
  - !ruby/object:Gem::Version
58
63
  version: 0.5.0
59
- - - '!='
64
+ - - ! '!='
60
65
  - !ruby/object:Gem::Version
61
66
  version: 0.5.1
62
- - - '!='
67
+ - - ! '!='
63
68
  - !ruby/object:Gem::Version
64
69
  version: 0.5.2
65
- - - '!='
70
+ - - ! '!='
66
71
  - !ruby/object:Gem::Version
67
72
  version: 0.5.3
68
73
  - - <
@@ -71,57 +76,65 @@ dependencies:
71
76
  - !ruby/object:Gem::Dependency
72
77
  name: rake
73
78
  requirement: !ruby/object:Gem::Requirement
79
+ none: false
74
80
  requirements:
75
- - - '>='
81
+ - - ! '>='
76
82
  - !ruby/object:Gem::Version
77
83
  version: 0.9.2
78
84
  type: :development
79
85
  prerelease: false
80
86
  version_requirements: !ruby/object:Gem::Requirement
87
+ none: false
81
88
  requirements:
82
- - - '>='
89
+ - - ! '>='
83
90
  - !ruby/object:Gem::Version
84
91
  version: 0.9.2
85
92
  - !ruby/object:Gem::Dependency
86
93
  name: rspec
87
94
  requirement: !ruby/object:Gem::Requirement
95
+ none: false
88
96
  requirements:
89
- - - '>='
97
+ - - ! '>='
90
98
  - !ruby/object:Gem::Version
91
99
  version: 2.7.0
92
100
  type: :development
93
101
  prerelease: false
94
102
  version_requirements: !ruby/object:Gem::Requirement
103
+ none: false
95
104
  requirements:
96
- - - '>='
105
+ - - ! '>='
97
106
  - !ruby/object:Gem::Version
98
107
  version: 2.7.0
99
108
  - !ruby/object:Gem::Dependency
100
109
  name: simplecov
101
110
  requirement: !ruby/object:Gem::Requirement
111
+ none: false
102
112
  requirements:
103
- - - '>='
113
+ - - ! '>='
104
114
  - !ruby/object:Gem::Version
105
115
  version: 0.5.4
106
116
  type: :development
107
117
  prerelease: false
108
118
  version_requirements: !ruby/object:Gem::Requirement
119
+ none: false
109
120
  requirements:
110
- - - '>='
121
+ - - ! '>='
111
122
  - !ruby/object:Gem::Version
112
123
  version: 0.5.4
113
124
  - !ruby/object:Gem::Dependency
114
125
  name: timecop
115
126
  requirement: !ruby/object:Gem::Requirement
127
+ none: false
116
128
  requirements:
117
- - - '>='
129
+ - - ! '>='
118
130
  - !ruby/object:Gem::Version
119
131
  version: 0.3.0
120
132
  type: :development
121
133
  prerelease: false
122
134
  version_requirements: !ruby/object:Gem::Requirement
135
+ none: false
123
136
  requirements:
124
- - - '>='
137
+ - - ! '>='
125
138
  - !ruby/object:Gem::Version
126
139
  version: 0.3.0
127
140
  description: fluent logger for ruby
@@ -139,7 +152,7 @@ files:
139
152
  - COPYING
140
153
  - ChangeLog
141
154
  - Gemfile
142
- - README.rdoc
155
+ - README.md
143
156
  - Rakefile
144
157
  - VERSION
145
158
  - bin/fluent-post
@@ -164,26 +177,33 @@ files:
164
177
  - spec/test_logger_spec.rb
165
178
  homepage: https://github.com/fluent/fluent-logger-ruby
166
179
  licenses: []
167
- metadata: {}
168
180
  post_install_message:
169
181
  rdoc_options: []
170
182
  require_paths:
171
183
  - lib
172
184
  required_ruby_version: !ruby/object:Gem::Requirement
185
+ none: false
173
186
  requirements:
174
- - - '>='
187
+ - - ! '>='
175
188
  - !ruby/object:Gem::Version
176
189
  version: '0'
190
+ segments:
191
+ - 0
192
+ hash: 3553729463111660525
177
193
  required_rubygems_version: !ruby/object:Gem::Requirement
194
+ none: false
178
195
  requirements:
179
- - - '>='
196
+ - - ! '>='
180
197
  - !ruby/object:Gem::Version
181
198
  version: '0'
199
+ segments:
200
+ - 0
201
+ hash: 3553729463111660525
182
202
  requirements: []
183
203
  rubyforge_project:
184
- rubygems_version: 2.0.0
204
+ rubygems_version: 1.8.23
185
205
  signing_key:
186
- specification_version: 4
206
+ specification_version: 3
187
207
  summary: fluent logger for ruby
188
208
  test_files:
189
209
  - spec/console_logger_spec.rb
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: 646a1e0a022169db9fa2392e5e4e4077b98fe82d
4
- data.tar.gz: bc397f0a66e90d51e6c5d10912f2c735f8feab6c
5
- SHA512:
6
- metadata.gz: 4ab7cc6f13741664506d4ecb537effb9630efaf8cfc81f496dfc2d9d65ee944d9f835b21e95c45d8133c51e98e7992ffb5d5a512ce14e6a630f6aff714be94d7
7
- data.tar.gz: 762bd7f474ea59cd7e689eb20d99d3926f7acd821bd9121c49afddb0ce2da1e47cbdf6ed144c3f296ce56a952c5358c32123702d99938508ea6b77541bfdb146
data/README.rdoc DELETED
@@ -1,55 +0,0 @@
1
- = Fluent logger
2
-
3
- A structured event loger
4
-
5
- == Examples
6
-
7
- === Simple
8
-
9
- require 'fluent-logger'
10
-
11
- log = Fluent::Logger::FluentLogger.new(nil, :host=>'localhost', :port=>24224)
12
- log.post("myapp.access", {"agent"=>"foo"})
13
-
14
- # output: myapp.access {"agent":"foo"}
15
-
16
- === Singleton
17
-
18
- require 'fluent-logger'
19
-
20
- Fluent::Logger::FluentLogger.open(nil, :host=>'localhost', :port=>24224)
21
- Fluent::Logger.post("myapp.access", {"agent"=>"foo"})
22
-
23
- # output: myapp.access {"agent":"foo"}
24
-
25
- === Tag prefix
26
-
27
- require 'fluent-logger'
28
-
29
- log = Fluent::Logger::FluentLogger.new('myapp', :host=>'localhost', :port=>24224)
30
- log.post("access", {"agent"=>"foo"})
31
-
32
- # output: myapp.access {"agent":"foo"}
33
-
34
- == Loggers
35
-
36
- === Fluent
37
-
38
- Fluent::Logger::FluentLogger.open('tag_prefix', :host=>'localhost', :port=24224)
39
-
40
- === Console
41
-
42
- Fluent::Logger::ConsoleLogger.open(io)
43
-
44
- === Null
45
-
46
- Fluent::Logger::NullLogger.open
47
-
48
-
49
- Web site:: http://fluent.github.com/
50
- Documents:: http://fluent.github.com/doc/
51
- Source repository:: https://github.com/fluent/fluent-logger-ruby
52
- Author:: Sadayuki Furuhashi
53
- Copyright:: (c) 2011 FURUHASHI Sadayuki
54
- License:: Apache License, Version 2.0
55
-