logfoo 0.1.5 → 0.2.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,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d0187181bc8229a48109f4619d41604c388c3850
4
- data.tar.gz: 823f317b5f1b427f7ccd9cd5630932460898f5c1
3
+ metadata.gz: 090c89addea5e5f294a83fc7118fc5f05eb7fcc2
4
+ data.tar.gz: e98d25ed50c2f2d443b3493b923924316b485620
5
5
  SHA512:
6
- metadata.gz: acb902d5d0e238e22cbd1a0b3daf3fe4fb7b067b691f0515f96bcb14d0885b6f91ade64d2575647a83854b150f53f11ee82b4c517e4b1918e53298f11d8a4cd8
7
- data.tar.gz: e36b75465178fd50d51123671b1c51124fe156356f35e672739c4f76603317067e0bbe3ae5b649c65db8e351c50b1a4aadfb9dc6aba1957710baf611fe743775
6
+ metadata.gz: b25cfaf625776d1424efdb87e0da631657633bd56d228dac97648b3466498bebff63cb8e1b26e6b3e2d89fc7119ba14df08444ebc66b6bdb55745fddb0958e3f
7
+ data.tar.gz: 2eb571f9dc9be891d7aaaaf972f4a2e5447c457a5c1787c0ca8989a196df17a5ef2c71789196d1930a56596e68758c30f606a3a9bbdb25b6c87a714462825d33
data/lib/logfoo/app.rb CHANGED
@@ -37,8 +37,8 @@ module Logfoo
37
37
  end
38
38
  end
39
39
 
40
- def append(entry)
41
- @queue.push(entry) if @thread
40
+ def append(line)
41
+ @queue.push(line) if @thread
42
42
  end
43
43
 
44
44
  private
@@ -46,21 +46,21 @@ module Logfoo
46
46
  def main_loop ; Thread.new do
47
47
  begin
48
48
  loop do
49
- entry = @queue.pop
50
- case entry
49
+ line = @queue.pop
50
+ case line
51
51
  when :shutdown
52
52
  break
53
53
  when :boom
54
54
  raise IGNORE_ME_ERROR
55
- when ExceptionEntry
56
- App._handle_exception(entry)
55
+ when ErrLine
56
+ App._handle_exception(line)
57
57
  else
58
- App._append(entry)
58
+ App._append(line)
59
59
  end
60
60
  end
61
61
  rescue Exception => ex
62
- entry = ExceptionEntry.build(self.class, ex)
63
- App._handle_exception(entry)
62
+ line = ErrLine.build(logger_name: self.class, exception: ex)
63
+ App._handle_exception(line)
64
64
  retry
65
65
  end
66
66
  end ; end
@@ -1,23 +1,21 @@
1
- module Logfoo
2
- class IoAppender
3
- def initialize(io = nil, formatter = nil)
4
- @io = io || STDOUT
1
+ module Logfoo ; class IoAppender
2
+ def initialize(io = nil, formatter = nil)
3
+ @io = io || STDOUT
5
4
 
6
- if @io.respond_to?(:sync=)
7
- @io.sync = true
8
- end
9
-
10
- is_tty = @io.respond_to?(:tty?) && @io.tty?
11
- @formatter = formatter || (is_tty ? SimpleFormatter.new : LogfmtFormatter.new)
5
+ if @io.respond_to?(:sync=)
6
+ @io.sync = true
12
7
  end
13
8
 
14
- def call(entry)
15
- write @formatter.call(entry)
16
- end
9
+ is_tty = @io.respond_to?(:tty?) && @io.tty?
10
+ @formatter = formatter || (is_tty ? SimpleFormatter.new : LogfmtFormatter.new)
11
+ end
17
12
 
18
- def write(body)
19
- @io.write body
20
- @io.flush
21
- end
13
+ def call(entry)
14
+ write @formatter.call(entry)
15
+ end
16
+
17
+ def write(body)
18
+ @io.write body
19
+ @io.flush
22
20
  end
23
- end
21
+ end ; end
@@ -1,100 +1,108 @@
1
- module Logfoo
2
- class Context
1
+ module Logfoo ; class Context
3
2
 
4
- attr_reader :level, :name, :thread_id
3
+ attr_reader :level, :name, :thread_id, :measure
5
4
 
6
- THREAD_CONTEXT = :"logfoo_context"
5
+ THREAD_CONTEXT = :"logfoo_context"
7
6
 
8
- def initialize(app, name, context = nil)
9
- @app = app
10
- @name = name
11
- @level = Logfoo::DEBUG
12
- @context = context || {}
13
- end
7
+ def initialize(app, name, context = nil)
8
+ @app = app
9
+ @name = name
10
+ @level = Logfoo::DEBUG
11
+ @context = context || {}
12
+ @measure = Measure.new(self)
13
+ end
14
14
 
15
- def level=(level)
16
- @level = level.to_i
17
- end
15
+ def level=(level)
16
+ @level = level.to_i
17
+ end
18
18
 
19
- def []=(k,v)
20
- if v == nil
21
- @context.delete(k)
22
- else
23
- @context[k] = v
24
- end
19
+ def []=(k,v)
20
+ if v == nil
21
+ @context.delete(k)
22
+ else
23
+ @context[k] = v
25
24
  end
25
+ end
26
26
 
27
- def context(keys = nil)
28
- if block_given?
29
- keys ||= {}
30
- begin
31
- Thread.current[THREAD_CONTEXT] ||= []
32
- Thread.current[THREAD_CONTEXT].push(keys)
33
- yield
34
- ensure
35
- Thread.current[THREAD_CONTEXT].pop
36
- if Thread.current[THREAD_CONTEXT] == []
37
- Thread.current[THREAD_CONTEXT] = nil
38
- end
27
+ def context(keys = nil)
28
+ if block_given?
29
+ keys ||= {}
30
+ begin
31
+ Thread.current[THREAD_CONTEXT] ||= []
32
+ Thread.current[THREAD_CONTEXT].push(keys)
33
+ yield
34
+ ensure
35
+ Thread.current[THREAD_CONTEXT].pop
36
+ if Thread.current[THREAD_CONTEXT] == []
37
+ Thread.current[THREAD_CONTEXT] = nil
39
38
  end
40
- else
41
- keys = (Thread.current[THREAD_CONTEXT] || []).inject({}) do |memo, kvs|
42
- kvs.each do |(k,v)|
43
- memo.merge!(k => v)
44
- end
45
- memo
39
+ end
40
+ else
41
+ keys = (Thread.current[THREAD_CONTEXT] || []).inject({}) do |memo, kvs|
42
+ kvs.each do |(k,v)|
43
+ memo.merge!(k => v)
46
44
  end
47
- @context.merge(keys)
45
+ memo
48
46
  end
47
+ @context.merge(keys)
49
48
  end
49
+ end
50
50
 
51
- def measure(message, payload = {})
52
- tm = Time.now.to_f
53
- re = nil
54
- re = yield if block_given?
55
- tm = Time.now.to_f - tm
56
- payload[:duration] = tm
57
- self.info message, payload
58
- re
51
+ def add(level, message, progname, &block)
52
+ lv = Logfoo::LEVELS[level]
53
+ if lv
54
+ public_send(lv.downcase, message, &block)
59
55
  end
56
+ end
60
57
 
61
- def add(level, message, progname, &block)
62
- lv = Logfoo::LEVELS[level]
63
- if lv
64
- public_send(lv.downcase, message, &block)
65
- end
58
+ Logfoo::LEVELS.each_with_index do |lv, idx|
59
+ define_method :"#{lv.downcase}?" do
60
+ idx >= level
66
61
  end
62
+ end
63
+
64
+ Logfoo::LEVELS.each_with_index do |lv, idx|
65
+ level_id = lv.downcase.to_sym
67
66
 
68
- Logfoo::LEVELS.each_with_index do |lv, idx|
69
- define_method :"#{lv.downcase}?" do
70
- idx >= level
67
+ define_method level_id do |message = nil, payload = nil, &block|
68
+ if idx >= level
69
+ payload = context.merge(payload || {})
70
+ message = block ? _call_log_fn(block, payload) : message
71
+ line = build_line(level_id, message, payload)
72
+ @app.append(line)
71
73
  end
72
74
  end
75
+ end
73
76
 
74
- Logfoo::LEVELS.each_with_index do |lv, idx|
75
- level_id = lv.downcase.to_sym
77
+ def _call_log_fn(fn, payload)
78
+ case fn.arity
79
+ when 0
80
+ fn.call
81
+ when 1
82
+ fn.call(payload)
83
+ else
84
+ raise RuntimeError, "invalid lambda arity, must be 0 or 1, was #{fn.arity}"
85
+ end
86
+ end
76
87
 
77
- define_method level_id do |message = nil, payload = nil, &block|
78
- if idx >= level
79
- message = block ? block.call : message
80
- payload = context.merge(payload || {})
88
+ private
81
89
 
82
- entry =
83
- if message.is_a?(Exception)
84
- ExceptionEntry.build(@name, message, payload, level: level_id)
85
- else
86
- Entry.new(
87
- level_id,
88
- Time.now,
89
- @name,
90
- message,
91
- payload,
92
- Thread.current.object_id
93
- )
94
- end
95
- @app.append(entry)
96
- end
97
- end
90
+ def build_line(level_id, message, payload)
91
+ if message.is_a?(Exception)
92
+ ErrLine.build(
93
+ logger_name: @name,
94
+ exception: message,
95
+ payload: payload,
96
+ level: level_id
97
+ )
98
+ else
99
+ LogLine.build(
100
+ logger_name: @name,
101
+ message: message,
102
+ payload: payload,
103
+ level: level_id
104
+ )
98
105
  end
99
106
  end
100
- end
107
+
108
+ end ; end
@@ -0,0 +1,59 @@
1
+ module Logfoo
2
+ LogLine = Struct.new(:level, :time, :logger_name, :message, :payload, :thread) do
3
+ class << self
4
+ def build(logger_name:, message:, payload: nil, level: nil)
5
+ self.new(
6
+ level || :info,
7
+ Time.now.utc,
8
+ logger_name,
9
+ message,
10
+ payload || {},
11
+ Thread.current.object_id
12
+ )
13
+ end
14
+ end
15
+
16
+ def to_h
17
+ {
18
+ level: level,
19
+ time: time,
20
+ msg: message,
21
+ logger: logger_name,
22
+ }.merge!(
23
+ payload
24
+ ).merge!(
25
+ thread: thread
26
+ )
27
+ end
28
+ end
29
+
30
+ ErrLine = Struct.new(:level, :time, :logger_name, :exception, :payload, :thread) do
31
+ class << self
32
+ def build(logger_name:, exception:, payload: nil, level: nil)
33
+ self.new(
34
+ level || :error,
35
+ Time.now.utc,
36
+ logger_name,
37
+ exception,
38
+ payload || {},
39
+ Thread.current.object_id
40
+ )
41
+ end
42
+ end
43
+
44
+ def to_h
45
+ {
46
+ level: level,
47
+ time: time,
48
+ msg: exception.message,
49
+ logger: logger_name,
50
+ err: exception.class.to_s,
51
+ }.merge!(
52
+ payload
53
+ ).merge!(
54
+ thread: thread,
55
+ stacktrace: exception.backtrace,
56
+ )
57
+ end
58
+ end
59
+ end
@@ -1,13 +1,9 @@
1
- module Logfoo
2
-
3
- class StderrExceptionHanlder
4
- def initialize(appender = nil)
5
- @appender = appender || IoAppender.new(STDERR)
6
- end
7
-
8
- def call(entry)
9
- @appender.call entry
10
- end
1
+ module Logfoo ; class StderrExceptionHanlder
2
+ def initialize(appender = nil)
3
+ @appender = appender || IoAppender.new(STDERR)
11
4
  end
12
5
 
13
- end
6
+ def call(entry)
7
+ @appender.call entry
8
+ end
9
+ end ; end
@@ -1,85 +1,83 @@
1
1
  require 'time'
2
2
 
3
- module Logfoo
4
- class LogfmtFormatter
3
+ module Logfoo ; class LogfmtFormatter
5
4
 
6
- UNESCAPED_STRING = /\A[\w\.\-\+\%\,\:\;\/]*\z/i.freeze
7
- STACKTRACE_RE = /^(.+?):(\d+):in `(.+)'$/.freeze
8
- IGNORED_KEYS = [:time]
9
- FLOAT_FORMAT = '%0.4f'.freeze
5
+ UNESCAPED_STRING = /\A[\w\.\-\+\%\,\:\;\/]*\z/i.freeze
6
+ STACKTRACE_RE = /^(.+?):(\d+):in `(.+)'$/.freeze
7
+ IGNORED_KEYS = [:time]
8
+ FLOAT_FORMAT = '%0.4f'.freeze
10
9
 
11
- def call(entry)
12
- case entry
13
- when ExceptionEntry, Entry
14
- format_entry(entry)
15
- else
16
- "#{remove_nl entry.to_s}\n"
17
- end
10
+ def call(line)
11
+ case line
12
+ when ErrLine, LogLine
13
+ format_line(line)
14
+ else
15
+ "#{remove_nl entry.to_s}\n"
18
16
  end
17
+ end
19
18
 
20
- private
19
+ private
21
20
 
22
- def remove_nl(s)
23
- s.tr("\n", ' ')
24
- end
21
+ def remove_nl(s)
22
+ s.tr("\n", ' ')
23
+ end
25
24
 
26
- def format_entry(entry)
27
- "#{remove_nl format_hash(entry.to_h)}\n"
28
- end
25
+ def format_line(line)
26
+ "#{remove_nl format_hash(line.to_h)}\n"
27
+ end
29
28
 
30
- def format_hash(attrs)
31
- attrs.inject([]) do |ac, (k,v)|
32
- if !IGNORED_KEYS.include?(k) && !(v == nil || v == "")
33
- new_value = sanitize(k, v)
34
- ac << "#{k}=#{new_value}"
35
- end
36
- ac
37
- end.join(" ")
29
+ def format_hash(attrs)
30
+ attrs.inject([]) do |ac, (k,v)|
31
+ if !IGNORED_KEYS.include?(k) && !(v == nil || v == "")
32
+ new_value = sanitize(k, v)
33
+ ac << "#{k}=#{new_value}"
38
34
  end
35
+ ac
36
+ end.join(" ")
37
+ end
39
38
 
40
- def format_stacktrace(stack)
41
- stack =
42
- stack.inject([]) do |ac, line|
43
- if line.match(STACKTRACE_RE)
44
- ac.push "[#{$1}:#{$2}:#{$3}]"
45
- end
46
- ac
47
- end
48
- if stack.any?
49
- "\"#{stack.join("")}\""
39
+ def format_stacktrace(stack)
40
+ stack =
41
+ stack.inject([]) do |ac, line|
42
+ if line.match(STACKTRACE_RE)
43
+ ac.push "[#{$1}:#{$2}:#{$3}]"
50
44
  end
45
+ ac
51
46
  end
47
+ if stack.any?
48
+ "\"#{stack.join("")}\""
49
+ end
50
+ end
52
51
 
53
- def sanitize(k, v)
54
- case v
55
- when ::Array
56
- if k == :stacktrace
57
- format_stacktrace(v)
58
- #quote v.map{|i| i.to_s }.join(",")
59
- else
60
- may_quote v.map{|i| i.to_s }.join(",")
61
- end
62
- when ::Integer, ::Symbol
63
- v.to_s
64
- when ::Float
65
- FLOAT_FORMAT % v
66
- when ::TrueClass
67
- :t
68
- when ::FalseClass
69
- :f
70
- when ::Time
71
- v.utc.iso8601
72
- else
73
- may_quote v.to_s
74
- end
52
+ def sanitize(k, v)
53
+ case v
54
+ when ::Array
55
+ if k == :stacktrace
56
+ format_stacktrace(v)
57
+ else
58
+ maybe_quote v.map{|i| i.to_s }.join(",")
75
59
  end
60
+ when ::Integer, ::Symbol
61
+ v.to_s
62
+ when ::Float
63
+ FLOAT_FORMAT % v
64
+ when ::TrueClass
65
+ :t
66
+ when ::FalseClass
67
+ :f
68
+ when ::Time
69
+ v.utc.iso8601
70
+ else
71
+ maybe_quote v.to_s
72
+ end
73
+ end
76
74
 
77
- def quote(s)
78
- s.inspect
79
- end
75
+ def quote(s)
76
+ s.inspect
77
+ end
80
78
 
81
- def may_quote(s)
82
- s =~ UNESCAPED_STRING ? s : quote(s)
83
- end
79
+ def maybe_quote(s)
80
+ s =~ UNESCAPED_STRING ? s : quote(s)
84
81
  end
85
- end
82
+
83
+ end ; end
@@ -1,45 +1,43 @@
1
- module Logfoo
2
- class SimpleFormatter < LogfmtFormatter
1
+ module Logfoo ; class SimpleFormatter < LogfmtFormatter
3
2
 
4
- FORMAT = "[%5s]: %s -%s%s".freeze
5
- BACKTRACE_LINE = "\t%s\n".freeze
6
- EXCEPTION_LINE = "%s: %s\n".freeze
3
+ FORMAT = "[%5s]: %s -%s%s".freeze
4
+ BACKTRACE_LINE = "\t%s\n".freeze
5
+ EXCEPTION_LINE = "%s: %s\n".freeze
7
6
 
8
- private
7
+ private
9
8
 
10
- def format_entry(entry)
11
- attrs = entry.to_h
12
- attrs.delete(:backtrace)
13
- str = []
14
- str << "#{remove_nl format_hash(entry.to_h)}\n"
15
- if entry.is_a?(ExceptionEntry)
16
- str << format_exception(entry)
17
- end
18
- str.join("")
19
- end
9
+ def format_line(line)
10
+ attrs = line.to_h
11
+ attrs.delete(:backtrace)
12
+ str = []
13
+ str << "#{remove_nl format_hash(line.to_h)}\n"
14
+ if entry.is_a?(ErrLine)
15
+ str << format_exception(line)
16
+ end
17
+ str.join("")
18
+ end
20
19
 
21
- def format_exception(entry)
22
- values = []
23
- values << (EXCEPTION_LINE % [entry.exception.class, entry.exception.message])
24
- if entry.exception.backtrace.is_a?(Array)
25
- values << entry.exception.backtrace.map{|l| BACKTRACE_LINE % l }.join
26
- end
27
- values.join
28
- end
20
+ def format_exception(line)
21
+ values = []
22
+ values << (EXCEPTION_LINE % [line.exception.class, line.exception.message])
23
+ if line.exception.backtrace.is_a?(Array)
24
+ values << line.exception.backtrace.map{|l| BACKTRACE_LINE % l }.join
25
+ end
26
+ values.join
27
+ end
29
28
 
30
- def format_hash(attrs)
31
- level = attrs.delete(:level)
32
- message = attrs.delete(:msg)
33
- logger = attrs.delete(:logger)
29
+ def format_hash(attrs)
30
+ level = attrs.delete(:level)
31
+ message = attrs.delete(:msg)
32
+ logger = attrs.delete(:logger)
34
33
 
35
- IGNORED_KEYS.each do |f|
36
- attrs.delete(f)
37
- end
34
+ IGNORED_KEYS.each do |f|
35
+ attrs.delete(f)
36
+ end
38
37
 
39
- payload = super(attrs)
40
- payload = payload.empty? ? "" : " [#{payload}]"
41
- message = message.to_s.empty? ? "" : " #{message}"
42
- FORMAT % [level.upcase, logger, message, payload]
43
- end
38
+ payload = super(attrs)
39
+ payload = payload.empty? ? "" : " [#{payload}]"
40
+ message = message.to_s.empty? ? "" : " #{message}"
41
+ FORMAT % [level.upcase, logger, message, payload]
44
42
  end
45
- end
43
+ end ; end
@@ -1,33 +1,32 @@
1
1
  require 'hutch'
2
2
 
3
- module Logfoo ; module Hutch
4
- class ErrorHandler
5
- attr_reader :bunny_log, :hutch_log
3
+ module Logfoo ; module Hutch ; class ErrorHandler
4
+ attr_reader :bunny_log, :hutch_log
6
5
 
7
- class << self
8
- attr_accessor :handler
9
- end
6
+ class << self
7
+ attr_accessor :handler
8
+ end
10
9
 
11
- ID = 'Hutch'.freeze
10
+ ID = 'Hutch'.freeze
12
11
 
13
- def initialize
14
- @hutch_log = Logfoo.get_logger(ID)
15
- @bunny_log = Logfoo.get_logger('Bunny')
16
- @bunny_log.level = Logfoo::WARN
17
- end
12
+ def initialize
13
+ @hutch_log = Logfoo.get_logger(ID)
14
+ @bunny_log = Logfoo.get_logger('Bunny')
15
+ @bunny_log.level = Logfoo::WARN
16
+ end
18
17
 
19
- def handle(message_id, payload, consumer, ex)
20
- entry = ExceptionEntry.build(
21
- ID,
22
- ex,
23
- payload: payload,
24
- consumer: consumer,
25
- message_id: message_id
18
+ def handle(message_id, payload, consumer, ex)
19
+ line = ErrLine.build(
20
+ logger_name: ID,
21
+ exception: ex,
22
+ payload: (payload || {}).merge!(
23
+ consumer: consumer,
24
+ message_id: message_id
26
25
  )
27
- App.instance.append(entry)
28
- end
26
+ )
27
+ App.instance.append(line)
29
28
  end
30
- end ; end
29
+ end ; end ; end
31
30
 
32
31
  Logfoo::Hutch::ErrorHandler.handler = Logfoo::Hutch::ErrorHandler.new
33
32
 
@@ -1,66 +1,67 @@
1
- module Logfoo::Rack
1
+ module Logfoo ; module Rack ; class Err
2
2
 
3
- class Err
3
+ TEXT_PLAIN = 'text/plain'.freeze
4
+ CLEAN_RE = /\A(rack|puma|grape)\./.freeze
4
5
 
5
- TEXT_PLAIN = 'text/plain'.freeze
6
- CLEAN_RE = /\A(rack|puma|grape)\./.freeze
6
+ FRAMEWORK_ERRORS = %w{ action_dispatch.exception sinatra.error }.freeze
7
7
 
8
- FRAMEWORK_ERRORS = %w{ action_dispatch.exception sinatra.error }.freeze
8
+ INTERNAL_SERVER_ERROR = [
9
+ 500,
10
+ {
11
+ R::CONTENT_TYPE => TEXT_PLAIN,
12
+ R::CONTENT_LENGTH => R::Utils::HTTP_STATUS_CODES[500].bytesize
13
+ },
14
+ [R::Utils::HTTP_STATUS_CODES[500]],
15
+ ].freeze
9
16
 
10
- INTERNAL_SERVER_ERROR = [
11
- 500,
12
- {
13
- R::CONTENT_TYPE => TEXT_PLAIN,
14
- R::CONTENT_LENGTH => Rack::Utils::HTTP_STATUS_CODES[500].bytesize
15
- },
16
- [Rack::Utils::HTTP_STATUS_CODES[500]],
17
- ].freeze
17
+ def initialize(app, log = nil)
18
+ @app = app
19
+ end
18
20
 
19
- def initialize(app, log = nil)
20
- @app = app
21
- end
21
+ def call(env)
22
+ response = @app.call(env)
22
23
 
23
- def call(env)
24
- response = @app.call(env)
24
+ if framework_error = FRAMEWORK_ERRORS.find { |k| env[k] }
25
+ append(framework_error, env)
26
+ end
25
27
 
26
- if framework_error = FRAMEWORK_ERRORS.find { |k| env[k] }
27
- append(framework_error, env)
28
- end
28
+ response
29
+ rescue Exception => e
30
+ append(e, env)
31
+ INTERNAL_SERVER_ERROR
32
+ end
29
33
 
30
- response
31
- rescue Exception => e
32
- append(e, env)
33
- INTERNAL_SERVER_ERROR
34
- end
34
+ private
35
35
 
36
- private
36
+ def append(e, env)
37
+ env = clean_env(env)
38
+ env = prefix_env(env)
39
+ line = Logfoo::ErrLine.build(
40
+ logger_name: LOGGER_NAME,
41
+ exception: e,
42
+ payload: env
43
+ )
44
+ Logfoo::App.instance.append(line)
45
+ end
37
46
 
38
- def append(e, env)
39
- env = clean_env(env)
40
- env = prefix_env(env)
41
- entry = Logfoo::ExceptionEntry.build(LOGGER_NAME, e, env)
42
- Logfoo::App.instance.append(entry)
47
+ def prefix_env(env)
48
+ env.inject({}) do |ac, (key, value)|
49
+ ac.merge!("env.#{key}" => value)
50
+ ac
43
51
  end
52
+ end
44
53
 
45
- def prefix_env(env)
46
- env.inject({}) do |ac, (key, value)|
47
- ac.merge!("env.#{key}" => value)
54
+ def clean_env(env)
55
+ env.inject({}) do |ac, (key, value) |
56
+ case
57
+ when key =~ CLEAN_RE
48
58
  ac
59
+ else
60
+ ac.merge!(key => value)
49
61
  end
50
62
  end
51
-
52
- def clean_env(env)
53
- env.inject({}) do |ac, (key, value) |
54
- case
55
- when key =~ CLEAN_RE
56
- ac
57
- else
58
- ac.merge!(key => value)
59
- end
60
- end
61
- end
62
-
63
63
  end
64
- end
64
+
65
+ end ; end ; end
65
66
 
66
67
 
@@ -1,52 +1,48 @@
1
- module Logfoo::Rack
2
-
3
- class Log
4
-
5
- IGNORED = %w{ /health /_ping }.freeze
6
- HTTP_X_FORWARDED_FOR = 'HTTP_X_FORWARDED_FOR'.freeze
7
- REMOTE_ADDR = 'REMOTE_ADDR'.freeze
8
-
9
- def initialize(app, log = nil)
10
- @log = log || Logfoo.get_logger(LOGGER_NAME)
11
- @app = app
12
- end
13
-
14
- def call(env)
15
- began_at = Time.now
16
- status, header, body = @app.call(env)
17
- header = R::Utils::HeaderHash.new(header)
18
- body = R::BodyProxy.new(body) { log(env, status, header, began_at, body) }
19
- [status, header, body]
20
- end
21
-
22
- private
23
-
24
- def log(env, status, header, began_at, body)
25
- return if ignored?(status, env)
26
-
27
- now = Time.now
28
- addr = (env[HTTP_X_FORWARDED_FOR] || env[REMOTE_ADDR]).to_s.split(", ").first
29
- method = env[R::REQUEST_METHOD]
30
- path = env[R::PATH_INFO]
31
-
32
- payload = {
33
- method: method,
34
- path: path,
35
- query: env[R::QUERY_STRING],
36
- status: status.to_s[0..3],
37
- len: header[R::CONTENT_LENGTH] || 0,
38
- addr: addr,
39
- duration: now - began_at
40
- }
41
-
42
- @log.info [method, path].join(" "), payload
43
- end
44
-
45
- def ignored?(status, env)
46
- status > 199 && status < 299 && IGNORED.include?(env[R::PATH_INFO])
47
- end
1
+ module Logfoo ; module Rack ; class Log
48
2
 
3
+ IGNORED = %w{ /health /_ping }.freeze
4
+ HTTP_X_FORWARDED_FOR = 'HTTP_X_FORWARDED_FOR'.freeze
5
+ REMOTE_ADDR = 'REMOTE_ADDR'.freeze
6
+
7
+ def initialize(app, log = nil)
8
+ @log = log || Logfoo.get_logger(LOGGER_NAME)
9
+ @app = app
10
+ end
11
+
12
+ def call(env)
13
+ began_at = Time.now
14
+ status, header, body = @app.call(env)
15
+ header = R::Utils::HeaderHash.new(header)
16
+ body = R::BodyProxy.new(body) { log(env, status, header, began_at, body) }
17
+ [status, header, body]
18
+ end
19
+
20
+ private
21
+
22
+ def log(env, status, header, began_at, body)
23
+ return if ignored?(status, env)
24
+
25
+ now = Time.now
26
+ addr = (env[HTTP_X_FORWARDED_FOR] || env[REMOTE_ADDR]).to_s.split(", ").first
27
+ method = env[R::REQUEST_METHOD]
28
+ path = env[R::PATH_INFO]
29
+
30
+ payload = {
31
+ method: method,
32
+ path: path,
33
+ query: env[R::QUERY_STRING],
34
+ status: status.to_s[0..3],
35
+ len: header[R::CONTENT_LENGTH] || 0,
36
+ addr: addr,
37
+ duration: now - began_at
38
+ }
39
+
40
+ @log.info [method, path].join(" "), payload
41
+ end
42
+
43
+ def ignored?(status, env)
44
+ status > 199 && status < 299 && IGNORED.include?(env[R::PATH_INFO])
49
45
  end
50
- end
51
46
 
47
+ end ; end ; end
52
48
 
@@ -0,0 +1,19 @@
1
+ module Logfoo ; Measure = Struct.new(:source) do
2
+ def benchmark(level, message, payload, block)
3
+ payload ||= {}
4
+ time_start = Time.now.to_f
5
+ reply = source._call_log_fn(block, payload)
6
+
7
+ payload.merge!(duration: Time.now.to_f - time_start)
8
+ source.public_send(level, message, payload)
9
+ reply
10
+ end
11
+
12
+ Logfoo::LEVELS.each do |lv|
13
+ level_id = lv.downcase.to_sym
14
+
15
+ define_method level_id do |message, payload = nil, &block|
16
+ benchmark(level_id, message, payload || {}, block)
17
+ end
18
+ end
19
+ end ; end
data/lib/logfoo/mixin.rb CHANGED
@@ -1,16 +1,14 @@
1
- module Logfoo
2
- module Mixin
3
- def self.included(base)
4
- base.extend ClassMethods
5
- base.log = Logfoo.get_logger(base.name)
6
- end
1
+ module Logfoo ; module Mixin
2
+ def self.included(base)
3
+ base.extend ClassMethods
4
+ base.log = Logfoo.get_logger(base.name)
5
+ end
7
6
 
8
- module ClassMethods
9
- attr_accessor :log
10
- end
7
+ module ClassMethods
8
+ attr_accessor :log
9
+ end
11
10
 
12
- def log
13
- self.class.log
14
- end
11
+ def log
12
+ self.class.log
15
13
  end
16
- end
14
+ end ; end
@@ -1,3 +1,3 @@
1
1
  module Logfoo
2
- VERSION = '0.1.5'
2
+ VERSION = '0.2.0'
3
3
  end
data/lib/logfoo.rb CHANGED
@@ -26,11 +26,12 @@ module Logfoo
26
26
  end
27
27
 
28
28
  %w{
29
- entry
29
+ entries
30
30
  formatters/logfmt_formatter
31
31
  formatters/simple_formatter
32
32
  appenders/io_appender
33
33
  exception_handlers/stderr_exception_handler
34
+ measure
34
35
  app
35
36
  context
36
37
  mixin
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logfoo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitry Galinsky
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-05-11 00:00:00.000000000 Z
11
+ date: 2016-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -99,7 +99,7 @@ files:
99
99
  - lib/logfoo/app.rb
100
100
  - lib/logfoo/appenders/io_appender.rb
101
101
  - lib/logfoo/context.rb
102
- - lib/logfoo/entry.rb
102
+ - lib/logfoo/entries.rb
103
103
  - lib/logfoo/exception_handlers/stderr_exception_handler.rb
104
104
  - lib/logfoo/formatters/logfmt_formatter.rb
105
105
  - lib/logfoo/formatters/simple_formatter.rb
@@ -107,6 +107,7 @@ files:
107
107
  - lib/logfoo/integrations/rack.rb
108
108
  - lib/logfoo/integrations/rack/err.rb
109
109
  - lib/logfoo/integrations/rack/log.rb
110
+ - lib/logfoo/measure.rb
110
111
  - lib/logfoo/mixin.rb
111
112
  - lib/logfoo/version.rb
112
113
  - logfoo.gemspec
data/lib/logfoo/entry.rb DELETED
@@ -1,46 +0,0 @@
1
- module Logfoo
2
- Entry = Struct.new(:level, :time, :logger_name, :message, :payload, :thread) do
3
- def to_h
4
- {
5
- level: level || :info,
6
- time: time || Time.now,
7
- msg: message,
8
- logger: logger_name,
9
- }.merge!(
10
- payload || {}
11
- ).merge!(
12
- thread: thread
13
- )
14
- end
15
- end
16
-
17
- ExceptionEntry = Struct.new(:level, :time, :logger_name, :exception, :payload, :thread) do
18
- class << self
19
- def build(logger_name, ex, payload = nil, options = {})
20
- self.new(
21
- options[:level],
22
- Time.now,
23
- logger_name,
24
- ex,
25
- payload,
26
- Thread.current.object_id
27
- )
28
- end
29
- end
30
-
31
- def to_h
32
- {
33
- level: level || :error,
34
- time: time || Time.now,
35
- msg: exception.message,
36
- logger: logger_name,
37
- err: exception.class.to_s,
38
- }.merge!(
39
- payload || {}
40
- ).merge!(
41
- thread: thread,
42
- stacktrace: exception.backtrace,
43
- )
44
- end
45
- end
46
- end