loglevel 0.4.6 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +63 -49
- data/README.md +4 -6
- data/lib/loglevel.rb +14 -119
- data/lib/loglevel/constants.rb +11 -0
- data/lib/loglevel/exception.rb +12 -2
- data/lib/loglevel/loggable_class.rb +62 -0
- data/lib/loglevel/loggable_class/level.rb +44 -0
- data/lib/loglevel/loggable_class/smart_logger.rb +45 -0
- data/lib/loglevel/loggable_classes.rb +33 -0
- data/lib/loglevel/settings.rb +35 -0
- data/lib/loglevel/version.rb +2 -2
- metadata +8 -7
- data/lib/loglevel/active_record.rb +0 -24
- data/lib/loglevel/classes.rb +0 -29
- data/lib/loglevel/help.rb +0 -43
- data/lib/loglevel/http_logger.rb +0 -35
- data/lib/loglevel/logger_analyzer.rb +0 -40
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2f7aa16f419c37f168c98409956cfa25b9cee845
|
4
|
+
data.tar.gz: 0ada2cc16ef1b3fa9527c438e26858d4dae83cea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dab91b3da3a07b99134fe9bec53ac2a2020d9edf37b7dcc1c94f0b254c90a4221aea2ea065545e19a4ec74b0b5e70775ff6071a090112d40358a418dfb941454
|
7
|
+
data.tar.gz: 0eff2e99f03b5d23abb3f65382996f5681fed4c53e5bad3e8514bcbc4bc0598eb1e29a996f7ab71f8a3f71580b96fde0c9be0c4cd9f68779d206bf9126517440
|
data/.rubocop.yml
CHANGED
@@ -1,49 +1,63 @@
|
|
1
|
-
---
|
2
|
-
AllCops:
|
3
|
-
TargetRubyVersion: 2.0
|
4
|
-
DisplayCopNames: true
|
5
|
-
Exclude:
|
6
|
-
- 'tmp/**/*'
|
7
|
-
|
8
|
-
Style/MixinGrouping:
|
9
|
-
Exclude:
|
10
|
-
- 'spec/**/*.rb'
|
11
|
-
|
12
|
-
Metrics/BlockLength:
|
13
|
-
CountComments: false # count full line comments?
|
14
|
-
Exclude:
|
15
|
-
- '**/*_spec.rb'
|
16
|
-
|
17
|
-
StringLiterals:
|
18
|
-
EnforcedStyle: single_quotes
|
19
|
-
Enabled: true
|
20
|
-
|
21
|
-
DotPosition:
|
22
|
-
Description: 'Checks the position of the dot in multi-line method calls.'
|
23
|
-
EnforcedStyle: leading
|
24
|
-
Enabled: true
|
25
|
-
|
26
|
-
ClassAndModuleChildren:
|
27
|
-
Description: 'Checks style of children classes and modules.'
|
28
|
-
EnforcedStyle: nested
|
29
|
-
Enabled: true
|
30
|
-
|
31
|
-
Documentation:
|
32
|
-
Description: 'Document classes and non-namespace modules.'
|
33
|
-
Enabled: false
|
34
|
-
|
35
|
-
FileName:
|
36
|
-
Description: 'Use snake_case for source file names.'
|
37
|
-
Enabled: true
|
38
|
-
|
39
|
-
LineLength:
|
40
|
-
Max: 120
|
41
|
-
Enabled: true
|
42
|
-
|
43
|
-
Style/ExtraSpacing:
|
44
|
-
Description: 'Do not use unnecessary spacing.'
|
45
|
-
Enabled: true
|
46
|
-
|
47
|
-
Lint/LiteralInInterpolation:
|
48
|
-
Description: 'Avoid interpolating literals in strings'
|
49
|
-
AutoCorrect: true
|
1
|
+
---
|
2
|
+
AllCops:
|
3
|
+
TargetRubyVersion: 2.0
|
4
|
+
DisplayCopNames: true
|
5
|
+
Exclude:
|
6
|
+
- 'tmp/**/*'
|
7
|
+
|
8
|
+
Style/MixinGrouping:
|
9
|
+
Exclude:
|
10
|
+
- 'spec/**/*.rb'
|
11
|
+
|
12
|
+
Metrics/BlockLength:
|
13
|
+
CountComments: false # count full line comments?
|
14
|
+
Exclude:
|
15
|
+
- '**/*_spec.rb'
|
16
|
+
|
17
|
+
StringLiterals:
|
18
|
+
EnforcedStyle: single_quotes
|
19
|
+
Enabled: true
|
20
|
+
|
21
|
+
DotPosition:
|
22
|
+
Description: 'Checks the position of the dot in multi-line method calls.'
|
23
|
+
EnforcedStyle: leading
|
24
|
+
Enabled: true
|
25
|
+
|
26
|
+
ClassAndModuleChildren:
|
27
|
+
Description: 'Checks style of children classes and modules.'
|
28
|
+
EnforcedStyle: nested
|
29
|
+
Enabled: true
|
30
|
+
|
31
|
+
Documentation:
|
32
|
+
Description: 'Document classes and non-namespace modules.'
|
33
|
+
Enabled: false
|
34
|
+
|
35
|
+
FileName:
|
36
|
+
Description: 'Use snake_case for source file names.'
|
37
|
+
Enabled: true
|
38
|
+
|
39
|
+
LineLength:
|
40
|
+
Max: 120
|
41
|
+
Enabled: true
|
42
|
+
|
43
|
+
Style/ExtraSpacing:
|
44
|
+
Description: 'Do not use unnecessary spacing.'
|
45
|
+
Enabled: true
|
46
|
+
|
47
|
+
Lint/LiteralInInterpolation:
|
48
|
+
Description: 'Avoid interpolating literals in strings'
|
49
|
+
AutoCorrect: true
|
50
|
+
|
51
|
+
Style/ModuleFunction:
|
52
|
+
EnforcedStyle: extend_self # Allows us to have private methods too
|
53
|
+
|
54
|
+
Style/PercentLiteralDelimiters:
|
55
|
+
# Hound and CodeClimate are currently using an old version of Rubocop with
|
56
|
+
# different defaults, so we set them explicitly here.
|
57
|
+
PreferredDelimiters:
|
58
|
+
default: ()
|
59
|
+
'%i': '[]'
|
60
|
+
'%I': '[]'
|
61
|
+
'%r': '{}'
|
62
|
+
'%w': '[]'
|
63
|
+
'%W': '[]'
|
data/README.md
CHANGED
@@ -16,6 +16,10 @@ Usage:
|
|
16
16
|
LOGLEVEL=WARN rails server
|
17
17
|
```
|
18
18
|
|
19
|
+
Loglevel will direct your logging to `STDOUT` (as suggested in
|
20
|
+
[the 12-factor app](https://12factor.net/logs)). See the Log Device section
|
21
|
+
below for how to control where your logging goes.
|
22
|
+
|
19
23
|
### Features
|
20
24
|
|
21
25
|
Control which components create visible log entries by simply setting an
|
@@ -28,12 +32,6 @@ LOGLEVEL=DEBUG,NOAR,NOHTTP rails server
|
|
28
32
|
would set the Rails logger level to `:debug` but would suppress messages from
|
29
33
|
the ActiveRecord logger and the HttpLogger gem.
|
30
34
|
|
31
|
-
The features are itemized if you use the `HELP` option:
|
32
|
-
|
33
|
-
```sh
|
34
|
-
LOGLEVEL=HELP rails console
|
35
|
-
```
|
36
|
-
|
37
35
|
Here are the available settings:
|
38
36
|
|
39
37
|
| Option | Description |
|
data/lib/loglevel.rb
CHANGED
@@ -1,134 +1,29 @@
|
|
1
1
|
require 'loglevel/exception'
|
2
|
-
require 'loglevel/
|
3
|
-
require 'loglevel/
|
4
|
-
require 'loglevel/http_logger'
|
5
|
-
require 'loglevel/help'
|
6
|
-
require 'loglevel/logger_analyzer'
|
2
|
+
require 'loglevel/constants'
|
3
|
+
require 'loglevel/loggable_classes'
|
7
4
|
|
8
|
-
|
9
|
-
|
10
|
-
ENV_VAR_LOGGER = 'LOGLEVEL_LOGGER'.freeze
|
11
|
-
ENV_VAR_DEVICE = 'LOGLEVEL_DEVICE'.freeze
|
12
|
-
ENV_VAR_CLASSES = 'LOGLEVEL_CLASSES'.freeze
|
13
|
-
LOGLEVELS = %w[DEBUG INFO WARN ERROR FATAL UNKNOWN].freeze
|
14
|
-
|
15
|
-
LOGLEVELS.each_with_index { |k, v| const_set(k, v) }
|
16
|
-
|
17
|
-
class << self
|
18
|
-
def setup
|
19
|
-
new.setup
|
20
|
-
end
|
21
|
-
|
22
|
-
def inspect
|
23
|
-
new.inspect
|
24
|
-
end
|
25
|
-
|
26
|
-
def debug
|
27
|
-
new.debug
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
attr_reader :classes
|
32
|
-
attr_writer :logger
|
33
|
-
|
34
|
-
def logger
|
35
|
-
@logger ||= use_default_logger? ? default_logger : logger_class.new(device)
|
36
|
-
end
|
37
|
-
|
38
|
-
def level
|
39
|
-
@level ||= self.class.const_get level_name
|
40
|
-
end
|
5
|
+
module Loglevel
|
6
|
+
extend self
|
41
7
|
|
42
8
|
def setup
|
43
|
-
|
44
|
-
|
45
|
-
@settings = nil
|
46
|
-
@logger = nil
|
47
|
-
@level = nil
|
48
|
-
|
49
|
-
setup_classes
|
50
|
-
announce
|
51
|
-
self
|
52
|
-
end
|
53
|
-
|
54
|
-
private
|
55
|
-
|
56
|
-
def initialize
|
57
|
-
@classes = Loglevel::Classes.new.classes
|
58
|
-
end
|
59
|
-
|
60
|
-
def setup_classes
|
61
|
-
@classes_to_setup = @classes.dup
|
62
|
-
setup_active_record
|
63
|
-
setup_http_logger
|
64
|
-
setup_remaining_classes
|
65
|
-
end
|
66
|
-
|
67
|
-
# Setup any other classes (e.g. Rails)
|
68
|
-
def setup_remaining_classes
|
69
|
-
@classes_to_setup.each do |klass|
|
70
|
-
klass.logger = logger
|
71
|
-
klass.logger.level = level
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def announce
|
76
|
-
help if help?
|
77
|
-
puts inspect if level_name == 'DEBUG'
|
78
|
-
puts debug if lookup('__DEBUG')
|
79
|
-
end
|
80
|
-
|
81
|
-
def level_name
|
82
|
-
(LOGLEVELS & settings).first || 'WARN'
|
83
|
-
end
|
84
|
-
|
85
|
-
def logger_class
|
86
|
-
use_default_logger? ? default_logger.class : Object.const_get(logger_class_name)
|
87
|
-
rescue NameError
|
88
|
-
raise Loglevel::Exception::BadLoggerClass, "Can't find logger class #{logger_class_name} - have you required it?"
|
89
|
-
end
|
90
|
-
|
91
|
-
def logger_class_name
|
92
|
-
@logger_class_name ||= ENV.fetch(ENV_VAR_LOGGER, logger_class_name_default)
|
9
|
+
loggable_classes.each(&:setup)
|
93
10
|
end
|
94
11
|
|
95
|
-
def
|
96
|
-
|
97
|
-
'Logger'
|
98
|
-
else
|
99
|
-
default_logger.class.name
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
def default_logger_not_instantiatable?
|
104
|
-
defined?(ActiveSupport::TaggedLogging) && default_logger.is_a?(ActiveSupport::TaggedLogging)
|
105
|
-
end
|
106
|
-
|
107
|
-
def use_default_logger?
|
108
|
-
!ENV[ENV_VAR_LOGGER] && !ENV[ENV_VAR_DEVICE] && !default_logger.nil?
|
109
|
-
end
|
110
|
-
|
111
|
-
def default_logger
|
112
|
-
@default_logger ||= ::Rails.logger if defined?(::Rails)
|
12
|
+
def debug
|
13
|
+
loggable_classes.map { |c| { name: c.class_name, logger: c.logger.class, level: c.level.level_name } }
|
113
14
|
end
|
114
15
|
|
115
16
|
def device
|
116
|
-
|
117
|
-
end
|
118
|
-
|
119
|
-
def device_name
|
120
|
-
ENV.fetch(ENV_VAR_DEVICE, 'STDOUT')
|
17
|
+
@device ||= ENV.fetch Loglevel::ENV_VAR_DEVICE, STDOUT
|
121
18
|
end
|
122
19
|
|
123
|
-
def
|
124
|
-
|
20
|
+
def loggable_classes
|
21
|
+
@loggable_classes ||= LoggableClasses.clone # More testable
|
125
22
|
end
|
126
23
|
|
127
|
-
def
|
128
|
-
|
24
|
+
def name_to_class(class_name, exception_class)
|
25
|
+
Object.const_get(class_name)
|
26
|
+
rescue NameError => exception
|
27
|
+
Loglevel::Exception.handle_bad_class(class_name, exception, exception_class)
|
129
28
|
end
|
130
|
-
|
131
|
-
include Loglevel::ActiveRecord
|
132
|
-
include Loglevel::HttpLogger
|
133
|
-
include Loglevel::Help
|
134
29
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Loglevel
|
2
|
+
LOGLEVELS = %w[DEBUG INFO WARN ERROR FATAL UNKNOWN].freeze
|
3
|
+
LOGLEVELS.each_with_index { |k, v| const_set(k, v) }
|
4
|
+
|
5
|
+
ENV_VAR_LEVEL = 'LOGLEVEL'.freeze
|
6
|
+
ENV_VAR_LOGGER = 'LOGGER'.freeze
|
7
|
+
ENV_VAR_DEVICE = 'LOGDEVICE'.freeze
|
8
|
+
ENV_VAR_CLASSES = 'LOGCLASSES'.freeze
|
9
|
+
|
10
|
+
SCOPE_RESOLUTION_OPERATOR = SRO = '::'.freeze
|
11
|
+
end
|
data/lib/loglevel/exception.rb
CHANGED
@@ -1,6 +1,16 @@
|
|
1
|
-
|
1
|
+
module Loglevel
|
2
2
|
# Local exception classes to make handling exceptions easier
|
3
3
|
class Exception < RuntimeError
|
4
|
-
|
4
|
+
UnknownLoggableClass = Class.new(self)
|
5
|
+
UnknownLoggerClass = Class.new(self)
|
6
|
+
ClassNotLoggable = Class.new(self)
|
7
|
+
|
8
|
+
def self.handle_bad_class(class_name, exception, exception_class)
|
9
|
+
raise exception unless exception.class == NameError &&
|
10
|
+
class_name.respond_to?(:split) &&
|
11
|
+
exception.message =~ /.+constant.+#{class_name.split(Loglevel::SRO).first}/
|
12
|
+
|
13
|
+
raise exception_class, class_name
|
14
|
+
end
|
5
15
|
end
|
6
16
|
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'loglevel/loggable_class/level'
|
2
|
+
require 'loglevel/loggable_class/smart_logger'
|
3
|
+
|
4
|
+
module Loglevel
|
5
|
+
class LoggableClass
|
6
|
+
attr_reader :class_name, :logger
|
7
|
+
alias to_s class_name
|
8
|
+
|
9
|
+
def setup
|
10
|
+
self.logger = smart_logger.create
|
11
|
+
logger.level = level.value
|
12
|
+
klass.logger = logger
|
13
|
+
additional_http_setup
|
14
|
+
end
|
15
|
+
|
16
|
+
def level
|
17
|
+
@level ||= Level.new(self)
|
18
|
+
end
|
19
|
+
|
20
|
+
def active_record?
|
21
|
+
@active_record ||= canonical_name == '::ActiveRecord::Base'
|
22
|
+
end
|
23
|
+
|
24
|
+
def http?
|
25
|
+
@http ||= canonical_name == '::HttpLogger'
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
attr_writer :logger
|
31
|
+
|
32
|
+
def initialize(class_name)
|
33
|
+
@class_name = class_name
|
34
|
+
raise Loglevel::Exception::ClassNotLoggable, class_name unless klass.respond_to?(:logger=)
|
35
|
+
end
|
36
|
+
|
37
|
+
def additional_http_setup
|
38
|
+
return unless http?
|
39
|
+
|
40
|
+
klass.level = level.level_name.downcase.to_sym
|
41
|
+
klass.log_response_body = settings.response_body?
|
42
|
+
klass.log_headers = settings.request_headers?
|
43
|
+
klass.ignore = [/9200/, /7474/] # ignore Elasticsearch & Neo4J
|
44
|
+
end
|
45
|
+
|
46
|
+
def klass
|
47
|
+
@klass ||= Loglevel.name_to_class(canonical_name, Loglevel::Exception::UnknownLoggableClass)
|
48
|
+
end
|
49
|
+
|
50
|
+
def canonical_name
|
51
|
+
@canonical_name ||= class_name[0, 2] == Loglevel::SRO ? class_name : "#{Loglevel::SRO}#{class_name}"
|
52
|
+
end
|
53
|
+
|
54
|
+
def settings
|
55
|
+
@settings ||= Loglevel::Settings.clone # More testable
|
56
|
+
end
|
57
|
+
|
58
|
+
def smart_logger
|
59
|
+
@smart_logger ||= SmartLogger.clone # More testable
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'loglevel/settings'
|
2
|
+
|
3
|
+
module Loglevel
|
4
|
+
class LoggableClass
|
5
|
+
class Level
|
6
|
+
def value
|
7
|
+
@value ||= Loglevel.const_get level_name
|
8
|
+
end
|
9
|
+
|
10
|
+
def level_name
|
11
|
+
@level_name ||= http_level_name || active_record_level_name || environment_level_name
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
extend Forwardable
|
17
|
+
|
18
|
+
def_delegators :loggable_class, :active_record?, :http?
|
19
|
+
|
20
|
+
attr_reader :loggable_class
|
21
|
+
|
22
|
+
def initialize(loggable_class, settings = nil)
|
23
|
+
@loggable_class = loggable_class
|
24
|
+
@settings = settings
|
25
|
+
end
|
26
|
+
|
27
|
+
def http_level_name
|
28
|
+
@http_level_name ||= 'FATAL' if loggable_class.http? && !settings.http?
|
29
|
+
end
|
30
|
+
|
31
|
+
def active_record_level_name
|
32
|
+
@active_record_level_name ||= 'FATAL' if loggable_class.active_record? && !settings.active_record?
|
33
|
+
end
|
34
|
+
|
35
|
+
def environment_level_name
|
36
|
+
@environment_level_name ||= settings.level
|
37
|
+
end
|
38
|
+
|
39
|
+
def settings
|
40
|
+
@settings ||= Loglevel::Settings.clone # More testable
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Loglevel
|
2
|
+
class LoggableClass
|
3
|
+
class SmartLogger
|
4
|
+
class << self
|
5
|
+
def create
|
6
|
+
enhanced_logger || simple_logger
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def simple_logger
|
12
|
+
logger_class.new device
|
13
|
+
end
|
14
|
+
|
15
|
+
def enhanced_logger
|
16
|
+
ActiveSupport::TaggedLogging.new(simple_logger) if defined?(ActiveSupport::TaggedLogging)
|
17
|
+
end
|
18
|
+
|
19
|
+
def logger_class
|
20
|
+
@logger_class ||= loglevel.name_to_class(class_name, Loglevel::Exception::UnknownLoggerClass)
|
21
|
+
end
|
22
|
+
|
23
|
+
def class_name
|
24
|
+
@class_name ||= environment_class_name || rails_class_name || 'Logger'
|
25
|
+
end
|
26
|
+
|
27
|
+
def environment_class_name
|
28
|
+
@environment_class_name ||= ENV[Loglevel::ENV_VAR_LOGGER]
|
29
|
+
end
|
30
|
+
|
31
|
+
def rails_class_name
|
32
|
+
'ActiveSupport::Logger' if defined?(ActiveSupport::Logger)
|
33
|
+
end
|
34
|
+
|
35
|
+
def device
|
36
|
+
@device ||= loglevel.device
|
37
|
+
end
|
38
|
+
|
39
|
+
def loglevel
|
40
|
+
@loglevel ||= Loglevel.clone # More testable
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'loglevel/loggable_class'
|
2
|
+
|
3
|
+
module Loglevel
|
4
|
+
module LoggableClasses
|
5
|
+
class << self
|
6
|
+
extend Forwardable
|
7
|
+
|
8
|
+
def_delegators :classes, :each, :map, :length
|
9
|
+
|
10
|
+
def classes
|
11
|
+
@classes ||= class_names.map { |class_name| class_from_name(class_name) }.compact
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
RAILS_LOGGABLE_CLASSES = %w[Rails ActiveRecord::Base HttpLogger].freeze
|
17
|
+
|
18
|
+
def class_names
|
19
|
+
@class_names ||= environment_class_names | RAILS_LOGGABLE_CLASSES
|
20
|
+
end
|
21
|
+
|
22
|
+
def environment_class_names
|
23
|
+
@environment_class_names ||= ENV.fetch(Loglevel::ENV_VAR_CLASSES, '').gsub(/[[:space:]]/, '').split(',')
|
24
|
+
end
|
25
|
+
|
26
|
+
def class_from_name(class_name)
|
27
|
+
LoggableClass.new class_name
|
28
|
+
rescue Loglevel::Exception
|
29
|
+
nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Loglevel
|
2
|
+
module Settings
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def level
|
6
|
+
@level ||= (Loglevel::LOGLEVELS & settings).first || 'WARN'
|
7
|
+
end
|
8
|
+
|
9
|
+
def http?
|
10
|
+
!lookup('NOHTTP')
|
11
|
+
end
|
12
|
+
|
13
|
+
def active_record?
|
14
|
+
!lookup('NOAR')
|
15
|
+
end
|
16
|
+
|
17
|
+
def response_body?
|
18
|
+
!lookup('NOBODY')
|
19
|
+
end
|
20
|
+
|
21
|
+
def request_headers?
|
22
|
+
!lookup('NOHEADERS')
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def lookup(setting)
|
28
|
+
settings.include?(setting)
|
29
|
+
end
|
30
|
+
|
31
|
+
def settings
|
32
|
+
@settings ||= ENV.fetch(ENV_VAR_LEVEL, '').upcase.split(',')
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/loglevel/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: loglevel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dominic Sayers
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-04-
|
11
|
+
date: 2017-04-12 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A simple gem to control logging at runtime with an environment variable
|
14
14
|
email:
|
@@ -32,12 +32,13 @@ files:
|
|
32
32
|
- Rakefile
|
33
33
|
- circle.yml
|
34
34
|
- lib/loglevel.rb
|
35
|
-
- lib/loglevel/
|
36
|
-
- lib/loglevel/classes.rb
|
35
|
+
- lib/loglevel/constants.rb
|
37
36
|
- lib/loglevel/exception.rb
|
38
|
-
- lib/loglevel/
|
39
|
-
- lib/loglevel/
|
40
|
-
- lib/loglevel/
|
37
|
+
- lib/loglevel/loggable_class.rb
|
38
|
+
- lib/loglevel/loggable_class/level.rb
|
39
|
+
- lib/loglevel/loggable_class/smart_logger.rb
|
40
|
+
- lib/loglevel/loggable_classes.rb
|
41
|
+
- lib/loglevel/settings.rb
|
41
42
|
- lib/loglevel/version.rb
|
42
43
|
- loglevel.gemspec
|
43
44
|
- script/console
|
@@ -1,24 +0,0 @@
|
|
1
|
-
# ActiveRecord-specific settings
|
2
|
-
class Loglevel
|
3
|
-
module ActiveRecord
|
4
|
-
private
|
5
|
-
|
6
|
-
def active_record?
|
7
|
-
!lookup('NOAR')
|
8
|
-
end
|
9
|
-
|
10
|
-
def setup_active_record
|
11
|
-
return unless defined?(::ActiveRecord::Base) && @classes_to_setup.delete(::ActiveRecord::Base)
|
12
|
-
active_record? ? setup_active_record_logger_to_log : setup_active_record_logger_not_to_log
|
13
|
-
end
|
14
|
-
|
15
|
-
def setup_active_record_logger_to_log
|
16
|
-
::ActiveRecord::Base.logger = logger
|
17
|
-
::ActiveRecord::Base.logger.level = level
|
18
|
-
end
|
19
|
-
|
20
|
-
def setup_active_record_logger_not_to_log
|
21
|
-
::ActiveRecord::Base.logger.level = Loglevel::FATAL
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
data/lib/loglevel/classes.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
class Loglevel
|
2
|
-
class Classes
|
3
|
-
attr_reader :classes
|
4
|
-
|
5
|
-
def stringify
|
6
|
-
@stringify ||= classes.map(&:name)
|
7
|
-
end
|
8
|
-
|
9
|
-
private
|
10
|
-
|
11
|
-
def initialize
|
12
|
-
@classes = class_names.map do |class_name|
|
13
|
-
begin
|
14
|
-
Object.const_get("::#{class_name}")
|
15
|
-
rescue NameError # Uninitialized constant
|
16
|
-
nil
|
17
|
-
end
|
18
|
-
end.compact
|
19
|
-
end
|
20
|
-
|
21
|
-
def class_names
|
22
|
-
@class_names ||= passed_class_names | %w[Rails ActiveRecord::Base HttpLogger]
|
23
|
-
end
|
24
|
-
|
25
|
-
def passed_class_names
|
26
|
-
@passed_class_names ||= ENV.fetch(Loglevel::ENV_VAR_CLASSES, '').gsub(/[[:space:]]/, '').split(',')
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
data/lib/loglevel/help.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
# Help
|
2
|
-
class Loglevel
|
3
|
-
module Help
|
4
|
-
def help
|
5
|
-
logger.info <<-HELP.gsub(' ', '')
|
6
|
-
Usage: LOGLEVEL=SETTING,SETTING,SETTING rails server
|
7
|
-
|
8
|
-
Available settings are as follows:
|
9
|
-
HELP Show these options
|
10
|
-
FATAL Equivalent to config.log_level = :fatal
|
11
|
-
ERROR Equivalent to config.log_level = :error
|
12
|
-
WARN Equivalent to config.log_level = :warn
|
13
|
-
INFO Equivalent to config.log_level = :info
|
14
|
-
DEBUG Equivalent to config.log_level = :debug
|
15
|
-
NOAR Do not show ActiveRecord messages
|
16
|
-
NOHTTP Do not show HTTP messages
|
17
|
-
NOHEADERS Do not include response headers in HTTP log
|
18
|
-
NOBODY Do not include response body in HTTP log
|
19
|
-
|
20
|
-
HTTP messages will only be shown if http_logger gem is present
|
21
|
-
HELP
|
22
|
-
end
|
23
|
-
|
24
|
-
def inspect
|
25
|
-
"#<#{self.class}: logger=#{logger_class}, device=#{device_name}, level=#{level_name}, settings=#{settings}>"
|
26
|
-
end
|
27
|
-
|
28
|
-
def debug
|
29
|
-
debug = classes.map do |klass|
|
30
|
-
l = Loglevel::LoggerAnalyzer.new(klass)
|
31
|
-
"#{klass}: logger=#{l.logger_class}, device=#{l.device_name}, level=#{l.level_name}"
|
32
|
-
end
|
33
|
-
|
34
|
-
debug.join("\n")
|
35
|
-
end
|
36
|
-
|
37
|
-
private
|
38
|
-
|
39
|
-
def help?
|
40
|
-
lookup('HELP') || settings == ['TRUE']
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
data/lib/loglevel/http_logger.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
# HttpLogger-specific settings
|
2
|
-
class Loglevel
|
3
|
-
module HttpLogger
|
4
|
-
private
|
5
|
-
|
6
|
-
def http?
|
7
|
-
!lookup('NOHTTP')
|
8
|
-
end
|
9
|
-
|
10
|
-
def response_body?
|
11
|
-
!lookup('NOBODY')
|
12
|
-
end
|
13
|
-
|
14
|
-
def request_headers?
|
15
|
-
!lookup('NOHEADERS')
|
16
|
-
end
|
17
|
-
|
18
|
-
def setup_http_logger
|
19
|
-
return unless defined?(::HttpLogger) && @classes_to_setup.delete(::HttpLogger)
|
20
|
-
http? ? setup_http_logger_to_log : setup_http_logger_not_to_log
|
21
|
-
end
|
22
|
-
|
23
|
-
def setup_http_logger_to_log
|
24
|
-
::HttpLogger.logger = logger
|
25
|
-
::HttpLogger.level = level_name.downcase.to_sym
|
26
|
-
::HttpLogger.log_response_body = response_body?
|
27
|
-
::HttpLogger.log_headers = request_headers?
|
28
|
-
::HttpLogger.ignore = [/9200/, /7474/] # ignore Elasticsearch & Neo4J
|
29
|
-
end
|
30
|
-
|
31
|
-
def setup_http_logger_not_to_log
|
32
|
-
::HttpLogger.level = :fatal
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
# Analyses the logger method of a class
|
2
|
-
class Loglevel
|
3
|
-
class LoggerAnalyzer
|
4
|
-
def level_name
|
5
|
-
@level_name ||= Loglevel::LOGLEVELS[level]
|
6
|
-
end
|
7
|
-
|
8
|
-
def level
|
9
|
-
@level ||= logger_level.is_a?(0.class) ? logger_level : 5
|
10
|
-
end
|
11
|
-
|
12
|
-
def logger_level
|
13
|
-
@logger_level ||= logger.level
|
14
|
-
end
|
15
|
-
|
16
|
-
def device_name
|
17
|
-
@device_name ||= logdev.filename || logdev.dev.inspect || 'nil'
|
18
|
-
end
|
19
|
-
|
20
|
-
def logdev
|
21
|
-
@logdev ||= logger.instance_variable_get('@logdev') || Struct.new(:filename, :dev).new
|
22
|
-
end
|
23
|
-
|
24
|
-
def logger_class
|
25
|
-
@logger_class ||= logger.class
|
26
|
-
end
|
27
|
-
|
28
|
-
def logger
|
29
|
-
@logger ||= klass.logger || Struct.new(:level).new(0)
|
30
|
-
end
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
attr_reader :klass
|
35
|
-
|
36
|
-
def initialize(klass)
|
37
|
-
@klass = klass
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|