loglevel 0.4.6 → 1.0.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 +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
|