la_logger 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -4,12 +4,13 @@ Require: ruby 1.9.x, fluent-logger (not working on JRuby without modification).
4
4
 
5
5
  ## Concepts
6
6
 
7
- - Initialize a logger object with `label` and log level:
7
+ - Initialize a logger object with `tag` (which becomings collection name for `tag_mapped`
8
+ setting in `fluent.conf`) and log level:
8
9
 
9
10
  class LoggerUser
10
11
  def logger
11
12
  # initialize tag and log level, default level is 'WARN'
12
- LaLogger.new('la.logger.tag', LaLogger::ERROR)
13
+ LaLogger.new('specific_tag', LaLogger::ERROR)
13
14
  end
14
15
 
15
16
  def logger_this
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  require 'benchmark'
2
3
 
3
4
  require 'fluent-logger'
@@ -11,17 +12,17 @@ Benchmark.bm do |x|
11
12
  x.report('FluentLogger.new') do
12
13
  n.times do
13
14
  Fluent::Logger::FluentLogger.new(
14
- nil, host: 'localhost', port: 24224
15
- ).post('la.logger1', {error: 'test message'})
15
+ nil, host: 'localhost', port: 24_224
16
+ ).post('la.logger1', { error: 'test message' })
16
17
  end
17
18
  end
18
19
 
19
20
  x.report('FluentLogger preload') do
20
21
  logger = Fluent::Logger::FluentLogger.new(
21
- nil, host: 'localhost', port: 24224
22
+ nil, host: 'localhost', port: 24_224
22
23
  )
23
24
  n.times do
24
- logger.post('la.logger1', {error: 'test message'})
25
+ logger.post('la.logger1', { error: 'test message' })
25
26
  end
26
27
  end
27
28
 
data/la_logger.gemspec CHANGED
@@ -2,8 +2,8 @@ $LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
2
2
  require 'la_logger/version'
3
3
 
4
4
  Gem::Specification.new 'la_logger', LaLogger::VERSION do |s|
5
- s.description = 'A singleton wrapper for fluent logger object.'
6
- s.summary = 'Wrap fluent logger as a singleton object, silently fail-over to STDOUT if fluentd service not defined.'
5
+ s.description = 'A singleton wrapper for fluent logger.'
6
+ s.summary = 'Wrap fluent logger as a singleton object, silently fail-over to STDERR if fluentd service not defined.'
7
7
  s.authors = ['Huang Wei']
8
8
  s.email = 'huangw@7lime.com'
9
9
  s.homepage = 'https://github.com/7lime/la_logger-gem'
@@ -12,9 +12,9 @@ Gem::Specification.new 'la_logger', LaLogger::VERSION do |s|
12
12
  s.test_files = Dir.glob('{spec,test}/**/*.rb')
13
13
 
14
14
  s.add_dependency 'fluent-logger'
15
+ s.add_dependency 'activesupport', '~> 3.2'
15
16
  s.add_development_dependency 'rspec', '~> 2.5'
16
17
  s.add_development_dependency 'mongo'
17
18
  s.add_development_dependency 'bson_ext'
18
19
  s.add_development_dependency 'simplecov', '~> 2.5'
19
20
  end
20
-
@@ -2,5 +2,5 @@
2
2
 
3
3
  # Define version of the module
4
4
  module LaLogger
5
- VERSION = '0.0.2'
5
+ VERSION = '0.1.0'
6
6
  end
data/lib/la_logger.rb CHANGED
@@ -4,6 +4,8 @@ require 'forwardable'
4
4
  require 'singleton'
5
5
  require 'fluent-logger'
6
6
  require 'logger'
7
+ require 'active_support/backtrace_cleaner'
8
+ require 'active_support/inflector' # :underscore
7
9
 
8
10
  # LaLogger: wraper for fluent-logger
9
11
  class LaLogger
@@ -20,8 +22,8 @@ class LaLogger
20
22
  def initialize
21
23
  if ENV['FLUENTD']
22
24
  host_, port_, tag_ = ENV['FLUENTD'].split ':'
23
- host_ = 'localhost' unless host_ and host_.size > 0
24
- port_ = 24224 unless port_ and port_.size > 0
25
+ host_ = 'localhost' unless host_ && host_.size > 0
26
+ port_ = 24_224 unless port_ && port_.size > 0
25
27
  @logger = Fluent::Logger::FluentLogger.new(
26
28
  tag_, host: host_.to_s, port: port_.to_i
27
29
  )
@@ -43,15 +45,42 @@ class LaLogger
43
45
  end
44
46
 
45
47
  # define 6 log methods
46
- [:debug, :info, :warn, :error,
47
- :fatal, :unknown].each_with_index do |met, lvl|
48
- define_method(met) do |message, tag = nil, data = {}|
49
- data[met] = message || ''
50
- tag ||= @tag
51
- logger.post(tag, data) if @level <= lvl
48
+ [:debug, :info, :warn,
49
+ :error, :fatal, :unknown].each_with_index do |met, lvl|
50
+ define_method(met) do |message, data = {}|
51
+ tag = data['tag'] || @tag
52
+ logger.post(tag, get_data(met, message, data)) if @level <= lvl
52
53
  end
53
54
  end
54
55
 
55
56
  # use LaLogger.new.post() directly.
56
57
  def_delegator :logger, :post
58
+
59
+ private
60
+
61
+ # initialize a default error message back trace cleaner
62
+ def bc
63
+ unless @bc
64
+ @bc = ActiveSupport::BacktraceCleaner.new
65
+ if ENV['APP_ROOT']
66
+ @bc.add_filter { |line| line.gsub(ENV['APP_ROOT'], '') }
67
+ end
68
+ @bc.add_silencer { |line| line =~ /ruby|gems/ }
69
+ end
70
+ @bc
71
+ end
72
+
73
+ # set up data hash to feed the fluent-logger object
74
+ def get_data(met, message, data)
75
+ # message also can be omitted:
76
+ data = message if message.is_a?(Hash) && data.keys.size == 0
77
+ data[met] = message if message.is_a?(String)
78
+ data[met] = message.class.name.underscore if message.is_a?(Exception)
79
+
80
+ # handle exception object
81
+ data['message'] ||= message.message if message.respond_to?(:message)
82
+ data['backtrace'] ||=
83
+ bc.clean(message.backtrace) if message.respond_to?(:backtrace)
84
+ data
85
+ end
57
86
  end
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  require 'mongo'
2
3
  include Mongo
3
4
 
@@ -5,11 +6,11 @@ include Mongo
5
6
 
6
7
  module MongoHelper
7
8
  def db
8
- MongoClient.new('localhost', 27017).db('lalogger_test')
9
+ MongoClient.new('localhost', 27_017).db('lalogger_test')
9
10
  end
10
11
 
11
- def get_last_logs(col)
12
- db.collection(col).find({}, { limit: 5 }).sort(time: :desc).to_a
12
+ def get_last_logs(col, size = 5)
13
+ db.collection(col).find({}, { limit: size }).sort(time: :desc).to_a
13
14
  end
14
15
 
15
16
  def cleanup
@@ -1,11 +1,7 @@
1
1
  # encoding: utf-8
2
- ENV['FLUENTD'] = 'localhost'
3
2
  require 'spec_helper'
4
3
  require 'la_logger'
5
4
 
6
- #require 'helpers/io_helper'
7
- #include IOHelper
8
-
9
5
  require 'helpers/mongo_helper'
10
6
  include MongoHelper
11
7
 
@@ -39,6 +35,13 @@ class UserB
39
35
  end
40
36
  end
41
37
 
38
+ # mix-in la-logger, expose private methods
39
+ class LaLogger
40
+ def expose_data(message, data = {})
41
+ get_data('error', message, data)
42
+ end
43
+ end
44
+
42
45
  describe LaLogger do
43
46
  describe 'singleton' do
44
47
  it 'same logger globally' do
@@ -48,6 +51,29 @@ describe LaLogger do
48
51
  end
49
52
  end
50
53
 
54
+ describe 'adjust message data' do
55
+ it 'can omitt message' do
56
+ data = LaLogger.new.expose_data('message' => 'info')
57
+ data['message'].should eq('info')
58
+ end
59
+
60
+ it 'handles error object' do
61
+ class SomeExceptionClass < RuntimeError; end
62
+ begin
63
+ fail SomeExceptionClass, 'raise me!'
64
+ rescue SomeExceptionClass => e
65
+ data = LaLogger.new.expose_data(e)
66
+ data['error'].should eq('some_exception_class')
67
+ data['message'].should eq('raise me!')
68
+ end
69
+ end
70
+
71
+ it 'handle string message' do
72
+ data = LaLogger.new.expose_data('send out message')
73
+ data['error'].should eq('send out message')
74
+ end
75
+ end
76
+
51
77
  describe 'default level' do
52
78
  it 'log error messages' do
53
79
  LaLogger.new('global').error('error message from global')
@@ -71,5 +97,5 @@ describe LaLogger do
71
97
  end
72
98
  end
73
99
 
74
- after(:all) { cleanup }
100
+ after(:each) { cleanup }
75
101
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: la_logger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-09-08 00:00:00.000000000 Z
12
+ date: 2013-09-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fluent-logger
@@ -27,6 +27,22 @@ dependencies:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: activesupport
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '3.2'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '3.2'
30
46
  - !ruby/object:Gem::Dependency
31
47
  name: rspec
32
48
  requirement: !ruby/object:Gem::Requirement
@@ -91,7 +107,7 @@ dependencies:
91
107
  - - ~>
92
108
  - !ruby/object:Gem::Version
93
109
  version: '2.5'
94
- description: A singleton wrapper for fluent logger object.
110
+ description: A singleton wrapper for fluent logger.
95
111
  email: huangw@7lime.com
96
112
  executables: []
97
113
  extensions: []
@@ -107,7 +123,6 @@ files:
107
123
  - la_logger.gemspec
108
124
  - lib/la_logger.rb
109
125
  - lib/la_logger/version.rb
110
- - spec/helpers/io_helper.rb
111
126
  - spec/helpers/mongo_helper.rb
112
127
  - spec/la_logger_spec.rb
113
128
  - spec/spec_helper.rb
@@ -135,10 +150,9 @@ rubyforge_project:
135
150
  rubygems_version: 1.8.23
136
151
  signing_key:
137
152
  specification_version: 3
138
- summary: Wrap fluent logger as a singleton object, silently fail-over to STDOUT if
153
+ summary: Wrap fluent logger as a singleton object, silently fail-over to STDERR if
139
154
  fluentd service not defined.
140
155
  test_files:
141
- - spec/helpers/io_helper.rb
142
156
  - spec/helpers/mongo_helper.rb
143
157
  - spec/la_logger_spec.rb
144
158
  - spec/spec_helper.rb
@@ -1,30 +0,0 @@
1
- # encoding: utf-8
2
-
3
- # record stdout and stderr output as strings for testing against expectation
4
- module IOHelper
5
- def capture_stdout(&block)
6
- original_stdout = $stdout
7
- $stdout = fake = StringIO.new
8
- begin
9
- yield
10
- rescue SystemExit
11
- $stdout = original_stdout # fake rubocop
12
- ensure
13
- $stdout = original_stdout
14
- end
15
- fake.string
16
- end
17
-
18
- def capture_stderr(&block)
19
- original_stdout = $stderr
20
- $stderr = fake = StringIO.new
21
- begin
22
- yield
23
- rescue SystemExit
24
- $stdout = original_stdout # fake rubocop
25
- ensure
26
- $stderr = original_stdout
27
- end
28
- fake.string
29
- end
30
- end