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 +3 -2
- data/benchmark/singleton.rb +5 -4
- data/la_logger.gemspec +3 -3
- data/lib/la_logger/version.rb +1 -1
- data/lib/la_logger.rb +37 -8
- data/spec/helpers/mongo_helper.rb +4 -3
- data/spec/la_logger_spec.rb +31 -5
- metadata +20 -6
- data/spec/helpers/io_helper.rb +0 -30
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 `
|
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('
|
13
|
+
LaLogger.new('specific_tag', LaLogger::ERROR)
|
13
14
|
end
|
14
15
|
|
15
16
|
def logger_this
|
data/benchmark/singleton.rb
CHANGED
@@ -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:
|
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:
|
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
|
6
|
-
s.summary = 'Wrap fluent logger as a singleton object, silently fail-over to
|
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
|
-
|
data/lib/la_logger/version.rb
CHANGED
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_
|
24
|
-
port_ =
|
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,
|
47
|
-
|
48
|
-
define_method(met) do |message,
|
49
|
-
data[
|
50
|
-
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',
|
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:
|
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
|
data/spec/la_logger_spec.rb
CHANGED
@@ -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(:
|
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
|
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-
|
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
|
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
|
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
|
data/spec/helpers/io_helper.rb
DELETED
@@ -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
|