mixlib-log 2.0.4 → 3.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/mixlib/log.rb +18 -14
- data/lib/mixlib/log/child.rb +3 -3
- data/lib/mixlib/log/formatter.rb +2 -2
- data/lib/mixlib/log/logger.rb +6 -4
- data/lib/mixlib/log/logging.rb +2 -2
- data/lib/mixlib/log/version.rb +1 -1
- metadata +7 -91
- data/.gemtest +0 -0
- data/Gemfile +0 -8
- data/NOTICE +0 -28
- data/README.md +0 -55
- data/Rakefile +0 -43
- data/mixlib-log.gemspec +0 -22
- data/spec/mixlib/log/child_spec.rb +0 -99
- data/spec/mixlib/log/formatter_spec.rb +0 -64
- data/spec/mixlib/log_spec.rb +0 -234
- data/spec/spec_helper.rb +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 95493c0814c7d9168427a11a611f5e55eb9b104635267bb2f62fae5c29b5d005
|
4
|
+
data.tar.gz: 3a64b2405bbe57c2cb2bfb72b815c67c3470b38c47dd6835c2dba61d5195f18d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cde4bc246b2e9878fe2ce87026c6be03cf6c9d7d031f3fe29c73eb1d162076f8b30820ad8cccfa125f012787da33de5e681c25bc15f4ac1413e45b3dc8cd6b07
|
7
|
+
data.tar.gz: 6f88ebc29a7e9989f1d391d44a105c1583573e7b7f70a4c8cb6853202c52417614dece03a48b3bdb9210e9a2f1a9e42fc24540ce3ad921406c6d2041ba30fdbd
|
data/lib/mixlib/log.rb
CHANGED
@@ -17,26 +17,27 @@
|
|
17
17
|
# limitations under the License.
|
18
18
|
|
19
19
|
require "logger"
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
20
|
+
require_relative "log/version"
|
21
|
+
require_relative "log/formatter"
|
22
|
+
require_relative "log/child"
|
23
|
+
require_relative "log/logging"
|
24
|
+
require_relative "log/logger"
|
25
25
|
|
26
26
|
module Mixlib
|
27
27
|
module Log
|
28
28
|
|
29
29
|
include Logging
|
30
|
-
@logger, @loggers = nil
|
31
30
|
|
32
31
|
def reset!
|
32
|
+
@logger ||= nil
|
33
|
+
@loggers ||= []
|
33
34
|
close!
|
34
|
-
@logger
|
35
|
+
@logger = @loggers = nil
|
35
36
|
@metadata = {}
|
36
37
|
end
|
37
38
|
|
38
39
|
# An Array of log devices that will be logged to. Defaults to just the default
|
39
|
-
#
|
40
|
+
# \@logger log device, but you can push to this array to add more devices.
|
40
41
|
def loggers
|
41
42
|
@loggers ||= [logger]
|
42
43
|
end
|
@@ -46,7 +47,7 @@ module Mixlib
|
|
46
47
|
# and creates a new one if it doesn't yet exist
|
47
48
|
##
|
48
49
|
def logger
|
49
|
-
@logger
|
50
|
+
@logger ||= init
|
50
51
|
end
|
51
52
|
|
52
53
|
# Sets the log device to +new_log_device+. Any additional loggers
|
@@ -60,7 +61,7 @@ module Mixlib
|
|
60
61
|
if other.respond_to?(:loggers) && other.respond_to?(:logger)
|
61
62
|
@loggers = other.loggers
|
62
63
|
@logger = other.logger
|
63
|
-
elsif other.
|
64
|
+
elsif other.is_a?(Array)
|
64
65
|
@loggers = other
|
65
66
|
@logger = other.first
|
66
67
|
else
|
@@ -81,7 +82,7 @@ module Mixlib
|
|
81
82
|
def init(*opts)
|
82
83
|
reset!
|
83
84
|
@logger = logger_for(*opts)
|
84
|
-
@logger.formatter = Mixlib::Log::Formatter.new
|
85
|
+
@logger.formatter = Mixlib::Log::Formatter.new if @logger.respond_to?(:formatter=)
|
85
86
|
@logger.level = Logger::WARN
|
86
87
|
@configured = true
|
87
88
|
@parent = nil
|
@@ -109,6 +110,7 @@ module Mixlib
|
|
109
110
|
def level=(new_level)
|
110
111
|
level_int = LEVEL_NAMES.key?(new_level) ? new_level : LEVELS[new_level]
|
111
112
|
raise ArgumentError, "Log level must be one of :trace, :debug, :info, :warn, :error, or :fatal" if level_int.nil?
|
113
|
+
|
112
114
|
loggers.each { |l| l.level = level_int }
|
113
115
|
end
|
114
116
|
|
@@ -124,7 +126,7 @@ module Mixlib
|
|
124
126
|
# Note that we *only* query the default logger (@logger) and not any other
|
125
127
|
# loggers that may have been added, even though it is possible to configure
|
126
128
|
# two (or more) loggers at different log levels.
|
127
|
-
|
129
|
+
%i{trace? debug? info? warn? error? fatal?}.each do |method_name|
|
128
130
|
define_method(method_name) do
|
129
131
|
logger.send(method_name)
|
130
132
|
end
|
@@ -136,7 +138,7 @@ module Mixlib
|
|
136
138
|
|
137
139
|
def add(severity, message = nil, progname = nil, data: {}, &block)
|
138
140
|
message, progname, data = yield if block_given?
|
139
|
-
data = metadata.merge(data) if metadata.
|
141
|
+
data = metadata.merge(data) if metadata.is_a?(Hash) && data.is_a?(Hash)
|
140
142
|
loggers.each do |l|
|
141
143
|
# if we don't have any metadata, let's not do the potentially expensive
|
142
144
|
# merging and managing that this call requires
|
@@ -170,7 +172,7 @@ module Mixlib
|
|
170
172
|
|
171
173
|
def logger_for(*opts)
|
172
174
|
if opts.empty?
|
173
|
-
Mixlib::Log::Logger.new(
|
175
|
+
Mixlib::Log::Logger.new($stdout)
|
174
176
|
elsif LEVELS.keys.inject(true) { |quacks, level| quacks && opts.first.respond_to?(level) }
|
175
177
|
opts.first
|
176
178
|
else
|
@@ -190,7 +192,9 @@ module Mixlib
|
|
190
192
|
# via public API. In order to reduce amount of impact and
|
191
193
|
# handle only File type log devices I had to use this method
|
192
194
|
# to get access to it.
|
195
|
+
next unless logger.instance_variable_defined?(:"@logdev")
|
193
196
|
next unless (logdev = logger.instance_variable_get(:"@logdev"))
|
197
|
+
|
194
198
|
loggers_to_close << logger if logdev.filename
|
195
199
|
end
|
196
200
|
loggers_to_close
|
data/lib/mixlib/log/child.rb
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
# See the License for the specific language governing permissions and
|
15
15
|
# limitations under the License.
|
16
16
|
|
17
|
-
|
17
|
+
require_relative "logging"
|
18
18
|
|
19
19
|
module Mixlib
|
20
20
|
module Log
|
@@ -36,14 +36,14 @@ module Mixlib
|
|
36
36
|
# Note that we *only* query the default logger (@logger) and not any other
|
37
37
|
# loggers that may have been added, even though it is possible to configure
|
38
38
|
# two (or more) loggers at different log levels.
|
39
|
-
|
39
|
+
%i{trace? debug? info? warn? error? fatal?}.each do |method_name|
|
40
40
|
define_method(method_name) do
|
41
41
|
parent.send(method_name)
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
45
|
def add(severity, message = nil, progname = nil, data: {}, &block)
|
46
|
-
data = metadata.merge(data) if data.
|
46
|
+
data = metadata.merge(data) if data.is_a?(Hash)
|
47
47
|
parent.send(:pass, severity, message, progname, data: data, &block)
|
48
48
|
end
|
49
49
|
|
data/lib/mixlib/log/formatter.rb
CHANGED
@@ -16,7 +16,7 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
|
18
18
|
require "logger"
|
19
|
-
require "time"
|
19
|
+
require "time" unless defined?(Time.zone_offset)
|
20
20
|
|
21
21
|
module Mixlib
|
22
22
|
module Log
|
@@ -31,7 +31,7 @@ module Mixlib
|
|
31
31
|
# Otherwise, doesn't print the time.
|
32
32
|
def call(severity, time, progname, msg)
|
33
33
|
if @@show_time
|
34
|
-
sprintf("[%s] %s: %s\n", time.iso8601
|
34
|
+
sprintf("[%s] %s: %s\n", time.iso8601, severity, msg2str(msg))
|
35
35
|
else
|
36
36
|
sprintf("%s: %s\n", severity, msg2str(msg))
|
37
37
|
end
|
data/lib/mixlib/log/logger.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require "logger"
|
2
|
-
|
2
|
+
require_relative "logging"
|
3
3
|
|
4
4
|
# A subclass of Ruby's stdlib Logger with all the mutex and logrotation stuff
|
5
5
|
# ripped out, and metadata added in.
|
@@ -21,7 +21,7 @@ module Mixlib
|
|
21
21
|
#
|
22
22
|
# +logdev+::
|
23
23
|
# The log device. This is a filename (String) or IO object (typically
|
24
|
-
#
|
24
|
+
# +$stdout+, +$stderr+, or an open file).
|
25
25
|
# +shift_age+::
|
26
26
|
# Number of old log files to keep, *or* frequency of rotation (+daily+,
|
27
27
|
# +weekly+ or +monthly+).
|
@@ -45,14 +45,16 @@ module Mixlib
|
|
45
45
|
|
46
46
|
def add_data(severity, message, progname, data: {})
|
47
47
|
return true if @logdev.nil? || severity < @level
|
48
|
+
|
48
49
|
data ||= {}
|
49
|
-
if message.
|
50
|
+
if message.is_a?(::Exception)
|
50
51
|
data[:err] = message
|
51
52
|
else
|
52
53
|
data[:msg] = message
|
53
54
|
end
|
54
55
|
@logdev.write(
|
55
|
-
format_message(to_label(severity), Time.now, progname, data)
|
56
|
+
format_message(to_label(severity), Time.now, progname, data)
|
57
|
+
)
|
56
58
|
true
|
57
59
|
end
|
58
60
|
alias_method :add, :add_data
|
data/lib/mixlib/log/logging.rb
CHANGED
@@ -29,7 +29,7 @@ module Mixlib
|
|
29
29
|
SEV_LABEL[sev + 1] || -"ANY"
|
30
30
|
end
|
31
31
|
|
32
|
-
LEVELS = { :
|
32
|
+
LEVELS = { trace: TRACE, debug: DEBUG, info: INFO, warn: WARN, error: ERROR, fatal: FATAL }.freeze
|
33
33
|
LEVEL_NAMES = LEVELS.invert.freeze
|
34
34
|
|
35
35
|
attr_accessor :metadata
|
@@ -41,7 +41,7 @@ module Mixlib
|
|
41
41
|
|
42
42
|
# Define the standard logger methods on this class programmatically.
|
43
43
|
# No need to incur method_missing overhead on every log call.
|
44
|
-
|
44
|
+
%i{trace debug info warn error fatal}.each do |method_name|
|
45
45
|
level = LEVELS[method_name]
|
46
46
|
define_method(method_name) do |msg = nil, data: {}, &block|
|
47
47
|
pass(level, msg, data: data, &block)
|
data/lib/mixlib/log/version.rb
CHANGED
metadata
CHANGED
@@ -1,112 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mixlib-log
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chef Software, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: rake
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: rspec
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '3.7'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '3.7'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: chefstyle
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: cucumber
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: github_changelog_generator
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: 1.11.3
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: 1.11.3
|
11
|
+
date: 2020-08-21 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
83
13
|
description:
|
84
14
|
email: info@chef.io
|
85
15
|
executables: []
|
86
16
|
extensions: []
|
87
|
-
extra_rdoc_files:
|
88
|
-
- README.md
|
89
|
-
- LICENSE
|
90
|
-
- NOTICE
|
17
|
+
extra_rdoc_files: []
|
91
18
|
files:
|
92
|
-
- ".gemtest"
|
93
|
-
- Gemfile
|
94
19
|
- LICENSE
|
95
|
-
- NOTICE
|
96
|
-
- README.md
|
97
|
-
- Rakefile
|
98
20
|
- lib/mixlib/log.rb
|
99
21
|
- lib/mixlib/log/child.rb
|
100
22
|
- lib/mixlib/log/formatter.rb
|
101
23
|
- lib/mixlib/log/logger.rb
|
102
24
|
- lib/mixlib/log/logging.rb
|
103
25
|
- lib/mixlib/log/version.rb
|
104
|
-
|
105
|
-
- spec/mixlib/log/child_spec.rb
|
106
|
-
- spec/mixlib/log/formatter_spec.rb
|
107
|
-
- spec/mixlib/log_spec.rb
|
108
|
-
- spec/spec_helper.rb
|
109
|
-
homepage: https://www.chef.io
|
26
|
+
homepage: https://github.com/chef/mixlib-log
|
110
27
|
licenses:
|
111
28
|
- Apache-2.0
|
112
29
|
metadata: {}
|
@@ -118,15 +35,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
118
35
|
requirements:
|
119
36
|
- - ">="
|
120
37
|
- !ruby/object:Gem::Version
|
121
|
-
version: '2.
|
38
|
+
version: '2.3'
|
122
39
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
40
|
requirements:
|
124
41
|
- - ">="
|
125
42
|
- !ruby/object:Gem::Version
|
126
43
|
version: '0'
|
127
44
|
requirements: []
|
128
|
-
|
129
|
-
rubygems_version: 2.7.6
|
45
|
+
rubygems_version: 3.0.3
|
130
46
|
signing_key:
|
131
47
|
specification_version: 4
|
132
48
|
summary: A gem that provides a simple mixin for log functionality
|
data/.gemtest
DELETED
File without changes
|
data/Gemfile
DELETED
data/NOTICE
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
============
|
2
|
-
Mixin::Log Notices
|
3
|
-
============
|
4
|
-
|
5
|
-
Developed at Chef (http://www.chef.io).
|
6
|
-
|
7
|
-
|
8
|
-
* Copyright 2009-2016, Chef Software, Inc. <legal@chef.io>
|
9
|
-
|
10
|
-
Mixin::Log incorporates code from Chef. The Chef notice file follows:
|
11
|
-
|
12
|
-
============
|
13
|
-
Chef Notices
|
14
|
-
============
|
15
|
-
|
16
|
-
Developed at Chef (http://www.chef.io).
|
17
|
-
|
18
|
-
Contributors and Copyright holders:
|
19
|
-
|
20
|
-
* Copyright 2008, Adam Jacob <adam@chef.io>
|
21
|
-
* Copyright 2008, Arjuna Christensen <aj@hjksolutions.com>
|
22
|
-
* Copyright 2008, Bryan McLellan <btm@loftninjas.org>
|
23
|
-
* Copyright 2008, Ezra Zygmuntowicz <ezra@engineyard.com>
|
24
|
-
* Copyright 2009, Sean Cribbs <seancribbs@gmail.com>
|
25
|
-
* Copyright 2009, Christopher Brown <cb@chef.io>
|
26
|
-
* Copyright 2009, Thom May <thom@clearairturbulence.org>
|
27
|
-
|
28
|
-
Chef incorporates code modified from Open4 (http://www.codeforpeople.com/lib/ruby/open4/), which was written by Ara T. Howard.
|
data/README.md
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
# Mixlib::Log
|
2
|
-
|
3
|
-
[![Build Status Master](https://travis-ci.org/chef/mixlib-log.svg?branch=master)](https://travis-ci.org/chef/mixlib-log) [![Gem Version](https://badge.fury.io/rb/mixlib-log.svg)](https://badge.fury.io/rb/mixlib-log)
|
4
|
-
|
5
|
-
Mixlib::Log provides a mixin for enabling a class based logger object, a-la Merb, Chef, and Nanite. To use it:
|
6
|
-
|
7
|
-
```ruby
|
8
|
-
require 'mixlib/log'
|
9
|
-
|
10
|
-
class Log
|
11
|
-
extend Mixlib::Log
|
12
|
-
end
|
13
|
-
```
|
14
|
-
|
15
|
-
You can then do:
|
16
|
-
|
17
|
-
```ruby
|
18
|
-
Log.debug('foo')
|
19
|
-
Log.info('bar')
|
20
|
-
Log.warn('baz')
|
21
|
-
Log.error('baz')
|
22
|
-
Log.fatal('wewt')
|
23
|
-
```
|
24
|
-
|
25
|
-
By default, `Mixlib::Logger` logs to STDOUT. To alter this, you should call `Log.init`, passing any arguments to the standard Ruby Logger. For example:
|
26
|
-
|
27
|
-
```ruby
|
28
|
-
Log.init('/tmp/logfile') # log to /tmp/logfile
|
29
|
-
Log.init('/tmp/logfile', 7) # log to /tmp/logfile, rotate every day
|
30
|
-
```
|
31
|
-
|
32
|
-
Enjoy!
|
33
|
-
|
34
|
-
## Contributing
|
35
|
-
|
36
|
-
For information on contributing to this project see <https://github.com/chef/chef/blob/master/CONTRIBUTING.md>
|
37
|
-
|
38
|
-
## License
|
39
|
-
|
40
|
-
- Copyright:: Copyright (c) 2008-2016 Chef Software, Inc.
|
41
|
-
- License:: Apache License, Version 2.0
|
42
|
-
|
43
|
-
```text
|
44
|
-
Licensed under the Apache License, Version 2.0 (the "License");
|
45
|
-
you may not use this file except in compliance with the License.
|
46
|
-
You may obtain a copy of the License at
|
47
|
-
|
48
|
-
http://www.apache.org/licenses/LICENSE-2.0
|
49
|
-
|
50
|
-
Unless required by applicable law or agreed to in writing, software
|
51
|
-
distributed under the License is distributed on an "AS IS" BASIS,
|
52
|
-
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
53
|
-
See the License for the specific language governing permissions and
|
54
|
-
limitations under the License.
|
55
|
-
```
|
data/Rakefile
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
require "bundler/gem_tasks"
|
2
|
-
require "rdoc/task"
|
3
|
-
require "rspec/core/rake_task"
|
4
|
-
require "cucumber/rake/task"
|
5
|
-
|
6
|
-
RSpec::Core::RakeTask.new(:spec) do |spec|
|
7
|
-
spec.pattern = "spec/**/*_spec.rb"
|
8
|
-
end
|
9
|
-
|
10
|
-
task default: [:style, :spec, :features]
|
11
|
-
|
12
|
-
# For rubygems-test
|
13
|
-
task :test => :spec
|
14
|
-
|
15
|
-
RDoc::Task.new do |rdoc|
|
16
|
-
rdoc.rdoc_dir = "rdoc"
|
17
|
-
rdoc.title = "mixlib-log #{Mixlib::Log::VERSION}"
|
18
|
-
rdoc.rdoc_files.include("README*")
|
19
|
-
rdoc.rdoc_files.include("lib/**/*.rb")
|
20
|
-
end
|
21
|
-
|
22
|
-
Cucumber::Rake::Task.new(:features) do |t|
|
23
|
-
t.cucumber_opts = "--format pretty"
|
24
|
-
end
|
25
|
-
|
26
|
-
begin
|
27
|
-
require "chefstyle"
|
28
|
-
require "rubocop/rake_task"
|
29
|
-
RuboCop::RakeTask.new(:style) do |task|
|
30
|
-
task.options += ["--display-cop-names", "--no-color"]
|
31
|
-
end
|
32
|
-
rescue LoadError
|
33
|
-
puts "chefstyle/rubocop is not available. gem install chefstyle to do style checking."
|
34
|
-
end
|
35
|
-
|
36
|
-
require "github_changelog_generator/task"
|
37
|
-
|
38
|
-
GitHubChangelogGenerator::RakeTask.new :changelog do |config|
|
39
|
-
config.future_release = Mixlib::Log::VERSION
|
40
|
-
config.enhancement_labels = "enhancement,Enhancement,New Feature,Feature".split(",")
|
41
|
-
config.bug_labels = "bug,Bug,Improvement,Upstream Bug".split(",")
|
42
|
-
config.exclude_labels = "duplicate,question,invalid,wontfix,no_changelog,Exclude From Changelog,Question,Discussion".split(",")
|
43
|
-
end
|
data/mixlib-log.gemspec
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
$:.unshift File.expand_path("../lib", __FILE__)
|
2
|
-
require "mixlib/log/version"
|
3
|
-
|
4
|
-
Gem::Specification.new do |gem|
|
5
|
-
gem.name = "mixlib-log"
|
6
|
-
gem.version = Mixlib::Log::VERSION
|
7
|
-
gem.platform = Gem::Platform::RUBY
|
8
|
-
gem.summary = "A gem that provides a simple mixin for log functionality"
|
9
|
-
gem.email = "info@chef.io"
|
10
|
-
gem.homepage = "https://www.chef.io"
|
11
|
-
gem.license = "Apache-2.0"
|
12
|
-
gem.authors = ["Chef Software, Inc."]
|
13
|
-
gem.has_rdoc = true
|
14
|
-
gem.extra_rdoc_files = ["README.md", "LICENSE", "NOTICE"]
|
15
|
-
gem.files = Dir["lib/**/*"] + Dir["spec/**/*"] + ["Gemfile", "Rakefile", ".gemtest", "mixlib-log.gemspec"]
|
16
|
-
gem.required_ruby_version = ">= 2.2"
|
17
|
-
gem.add_development_dependency "rake"
|
18
|
-
gem.add_development_dependency "rspec", "~> 3.7"
|
19
|
-
gem.add_development_dependency "chefstyle"
|
20
|
-
gem.add_development_dependency "cucumber"
|
21
|
-
gem.add_development_dependency "github_changelog_generator", ">= 1.11.3"
|
22
|
-
end
|
@@ -1,99 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Copyright:: Copyright (c) 2018 Chef Software, Inc.
|
3
|
-
# License:: Apache License, Version 2.0
|
4
|
-
#
|
5
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
-
# you may not use this file except in compliance with the License.
|
7
|
-
# You may obtain a copy of the License at
|
8
|
-
#
|
9
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
-
#
|
11
|
-
# Unless required by applicable law or agreed to in writing, software
|
12
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
-
# See the License for the specific language governing permissions and
|
15
|
-
# limitations under the License.
|
16
|
-
#
|
17
|
-
|
18
|
-
require "tempfile"
|
19
|
-
require "stringio"
|
20
|
-
require "spec_helper"
|
21
|
-
|
22
|
-
RSpec.describe Mixlib::Log::Child do
|
23
|
-
before do
|
24
|
-
Logit.reset!
|
25
|
-
Logit.init(io)
|
26
|
-
Logit.level = :warn
|
27
|
-
end
|
28
|
-
|
29
|
-
let(:io) { StringIO.new }
|
30
|
-
|
31
|
-
let(:child) { Logit.with_child }
|
32
|
-
|
33
|
-
it "has a parent" do
|
34
|
-
expect(child.parent).to be(Logit)
|
35
|
-
end
|
36
|
-
|
37
|
-
it "accepts a message" do
|
38
|
-
Logit.with_child { |l| l.add(Logger::WARN, "a message") }
|
39
|
-
expect(io.string).to match(/a message$/)
|
40
|
-
end
|
41
|
-
|
42
|
-
context "with structured data" do
|
43
|
-
it "can be created with metadata" do
|
44
|
-
expect(Logit).to receive(:pass).with(Mixlib::Log::LEVELS[:warn], "a message", nil, data: { child: "true" })
|
45
|
-
Logit.with_child({ child: "true" }) { |l| l.warn("a message") }
|
46
|
-
end
|
47
|
-
|
48
|
-
it "a message can be logged" do
|
49
|
-
expect(Logit).to receive(:pass).with(Mixlib::Log::LEVELS[:warn], "a message", nil, data: { child: "true" })
|
50
|
-
Logit.with_child { |l| l.warn("a message", data: { child: "true" }) }
|
51
|
-
end
|
52
|
-
|
53
|
-
context "merges properly" do
|
54
|
-
it "in the simple case" do
|
55
|
-
expect(Logit).to receive(:pass).with(Mixlib::Log::LEVELS[:warn], "a message", nil, data: { child: "true", meta: "data" })
|
56
|
-
Logit.with_child(meta: "data") { |l| l.warn("a message", data: { child: "true" }) }
|
57
|
-
end
|
58
|
-
|
59
|
-
it "when overwriting" do
|
60
|
-
expect(Logit).to receive(:pass).with(Mixlib::Log::LEVELS[:warn], "a message", nil, data: { child: "true", meta: "overwritten" })
|
61
|
-
Logit.with_child(meta: "data") { |l| l.warn("a message", data: { child: "true", meta: "overwritten" }) }
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
context "when receiving a message from a child" do
|
66
|
-
it "passes data on" do
|
67
|
-
expect(Logit).to receive(:pass).with(Mixlib::Log::LEVELS[:warn], "a message", nil, data: { child: "true", parent: "first" })
|
68
|
-
child.metadata = { parent: "first" }
|
69
|
-
child.with_child { |l| l.warn("a message", data: { child: "true" }) }
|
70
|
-
end
|
71
|
-
|
72
|
-
it "merges its own data" do
|
73
|
-
expect(Logit).to receive(:pass).with(Mixlib::Log::LEVELS[:warn], "a message", nil, data: { child: "true", parent: "second" })
|
74
|
-
child.metadata = { parent: "first" }
|
75
|
-
child.with_child { |l| l.warn("a message", data: { child: "true", parent: "second" }) }
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
context "sends a message to the parent" do
|
81
|
-
%i{ debug info warn error fatal }.each do |level|
|
82
|
-
it "at #{level}" do
|
83
|
-
expect(Logit).to receive(:pass).with(Mixlib::Log::LEVELS[level], "a #{level} message", nil, data: {})
|
84
|
-
Logit.level = level
|
85
|
-
child.send(level, "a #{level} message")
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
context "can query the parent's level" do
|
91
|
-
%i{ debug info warn error fatal }.each do |level|
|
92
|
-
it "at #{level}" do
|
93
|
-
query = "#{level}?".to_sym
|
94
|
-
Logit.level = level
|
95
|
-
expect(child.send(query)).to be(true)
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
@@ -1,64 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: Adam Jacob (<adam@chef.io>)
|
3
|
-
# Copyright:: Copyright (c) 2008-2016 Chef Software, Inc.
|
4
|
-
# License:: Apache License, Version 2.0
|
5
|
-
#
|
6
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
-
# you may not use this file except in compliance with the License.
|
8
|
-
# You may obtain a copy of the License at
|
9
|
-
#
|
10
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
-
#
|
12
|
-
# Unless required by applicable law or agreed to in writing, software
|
13
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
-
# See the License for the specific language governing permissions and
|
16
|
-
# limitations under the License.
|
17
|
-
#
|
18
|
-
|
19
|
-
require "time"
|
20
|
-
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "spec_helper"))
|
21
|
-
|
22
|
-
RSpec.describe Mixlib::Log::Formatter do
|
23
|
-
before(:each) do
|
24
|
-
@formatter = Mixlib::Log::Formatter.new
|
25
|
-
end
|
26
|
-
|
27
|
-
it "should print raw strings with msg2str(string)" do
|
28
|
-
expect(@formatter.msg2str("nuthin new")).to eq("nuthin new")
|
29
|
-
end
|
30
|
-
|
31
|
-
it "should format exceptions properly with msg2str(e)" do
|
32
|
-
e = IOError.new("legendary roots crew")
|
33
|
-
expect(@formatter.msg2str(e)).to eq("legendary roots crew (IOError)\n")
|
34
|
-
end
|
35
|
-
|
36
|
-
it "should format random objects via inspect with msg2str(Object)" do
|
37
|
-
expect(@formatter.msg2str([ "black thought", "?uestlove" ])).to eq('["black thought", "?uestlove"]')
|
38
|
-
end
|
39
|
-
|
40
|
-
it "should return a formatted string with call" do
|
41
|
-
time = Time.new
|
42
|
-
Mixlib::Log::Formatter.show_time = true
|
43
|
-
expect(@formatter.call("monkey", time, "test", "mos def")).to eq("[#{time.iso8601}] monkey: mos def\n")
|
44
|
-
end
|
45
|
-
|
46
|
-
it "should allow you to turn the time on and off in the output" do
|
47
|
-
Mixlib::Log::Formatter.show_time = false
|
48
|
-
expect(@formatter.call("monkey", Time.new, "test", "mos def")).to eq("monkey: mos def\n")
|
49
|
-
end
|
50
|
-
|
51
|
-
context "with structured data" do
|
52
|
-
let(:data) { {} }
|
53
|
-
|
54
|
-
it "should format a message" do
|
55
|
-
data[:msg] = "nuthin new"
|
56
|
-
expect(@formatter.msg2str(data)).to eq("nuthin new")
|
57
|
-
end
|
58
|
-
|
59
|
-
it "should format an exception" do
|
60
|
-
data[:err] = IOError.new("legendary roots crew")
|
61
|
-
expect(@formatter.msg2str(data)).to eq("legendary roots crew (IOError)\n")
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
data/spec/mixlib/log_spec.rb
DELETED
@@ -1,234 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: Adam Jacob (<adam@chef.io>)
|
3
|
-
# Author:: Christopher Brown (<cb@chef.io>)
|
4
|
-
# Copyright:: Copyright (c) 2008-2016 Chef Software, Inc.
|
5
|
-
# License:: Apache License, Version 2.0
|
6
|
-
#
|
7
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
-
# you may not use this file except in compliance with the License.
|
9
|
-
# You may obtain a copy of the License at
|
10
|
-
#
|
11
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
-
#
|
13
|
-
# Unless required by applicable law or agreed to in writing, software
|
14
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
-
# See the License for the specific language governing permissions and
|
17
|
-
# limitations under the License.
|
18
|
-
#
|
19
|
-
|
20
|
-
require "tempfile"
|
21
|
-
require "stringio"
|
22
|
-
require "spec_helper"
|
23
|
-
|
24
|
-
class LoggerLike
|
25
|
-
attr_accessor :level
|
26
|
-
attr_reader :messages, :data
|
27
|
-
def initialize
|
28
|
-
@messages = ""
|
29
|
-
@data = []
|
30
|
-
end
|
31
|
-
|
32
|
-
def add_data(severity, message = nil, progname = nil, data: {})
|
33
|
-
@messages << message
|
34
|
-
@data << data
|
35
|
-
end
|
36
|
-
|
37
|
-
def add(severity, message = nil, progname = nil, data: {})
|
38
|
-
@messages << message
|
39
|
-
end
|
40
|
-
|
41
|
-
[:trace, :debug, :info, :warn, :error, :fatal].each do |method_name|
|
42
|
-
class_eval(<<-E)
|
43
|
-
def #{method_name}(message)
|
44
|
-
@messages << message
|
45
|
-
end
|
46
|
-
E
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
RSpec.describe Mixlib::Log do
|
51
|
-
|
52
|
-
# Since we are testing class behaviour for an instance variable
|
53
|
-
# that gets set once, we need to reset it prior to each example [cb]
|
54
|
-
before(:each) do
|
55
|
-
Logit.reset!
|
56
|
-
end
|
57
|
-
|
58
|
-
it "creates a logger using an IO object" do
|
59
|
-
io = StringIO.new
|
60
|
-
Logit.init(io)
|
61
|
-
Logit << "foo"
|
62
|
-
expect(io.string).to match(/foo/)
|
63
|
-
end
|
64
|
-
|
65
|
-
it "creates a logger with a file name" do
|
66
|
-
Tempfile.open("chef-test-log") do |tempfile|
|
67
|
-
Logit.init(tempfile.path)
|
68
|
-
Logit << "bar"
|
69
|
-
tempfile.rewind
|
70
|
-
expect(tempfile.read).to match(/bar/)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
it "uses the logger provided when initialized with a logger like object" do
|
75
|
-
logger = LoggerLike.new
|
76
|
-
Logit.init(logger)
|
77
|
-
Logit.level = :debug
|
78
|
-
Logit.debug "qux"
|
79
|
-
expect(logger.messages).to match(/qux/)
|
80
|
-
end
|
81
|
-
|
82
|
-
it "should re-initialize the logger if init is called again" do
|
83
|
-
first_logdev, second_logdev = StringIO.new, StringIO.new
|
84
|
-
Logit.init(first_logdev)
|
85
|
-
Logit.fatal "FIRST"
|
86
|
-
expect(first_logdev.string).to match(/FIRST/)
|
87
|
-
Logit.init(second_logdev)
|
88
|
-
Logit.fatal "SECOND"
|
89
|
-
expect(first_logdev.string).to_not match(/SECOND/)
|
90
|
-
expect(second_logdev.string).to match(/SECOND/)
|
91
|
-
end
|
92
|
-
|
93
|
-
it "knows that it's been configured" do
|
94
|
-
Logit.init
|
95
|
-
expect(Logit.configured?).to be true
|
96
|
-
end
|
97
|
-
|
98
|
-
it "should set the log level using the binding form, with :trace, :debug, :info, :warn, :error, or :fatal" do
|
99
|
-
levels = {
|
100
|
-
:trace => Mixlib::Log::TRACE,
|
101
|
-
:debug => Mixlib::Log::DEBUG,
|
102
|
-
:info => Mixlib::Log::INFO,
|
103
|
-
:warn => Mixlib::Log::WARN,
|
104
|
-
:error => Mixlib::Log::ERROR,
|
105
|
-
:fatal => Mixlib::Log::FATAL,
|
106
|
-
}
|
107
|
-
levels.each do |symbol, constant|
|
108
|
-
Logit.level = symbol
|
109
|
-
expect(Logit.logger.level).to eq(constant)
|
110
|
-
expect(Logit.level).to eq(symbol)
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
it "passes blocks to the underlying logger object" do
|
115
|
-
logdev = StringIO.new
|
116
|
-
Logit.init(logdev)
|
117
|
-
Logit.fatal { "the_message" }
|
118
|
-
expect(logdev.string).to match(/the_message/)
|
119
|
-
end
|
120
|
-
|
121
|
-
it "should set the log level using the method form, with :trace, :debug, :info, :warn, :error, or :fatal" do
|
122
|
-
levels = {
|
123
|
-
:trace => Mixlib::Log::TRACE,
|
124
|
-
:debug => Mixlib::Log::DEBUG,
|
125
|
-
:info => Mixlib::Log::INFO,
|
126
|
-
:warn => Mixlib::Log::WARN,
|
127
|
-
:error => Mixlib::Log::ERROR,
|
128
|
-
:fatal => Mixlib::Log::FATAL,
|
129
|
-
}
|
130
|
-
levels.each do |symbol, constant|
|
131
|
-
Logit.level(symbol)
|
132
|
-
expect(Logit.logger.level).to eq(constant)
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
it "should raise an ArgumentError if you try and set the level to something strange using the binding form" do
|
137
|
-
expect(lambda { Logit.level = :the_roots }).to raise_error(ArgumentError)
|
138
|
-
end
|
139
|
-
|
140
|
-
it "should raise an ArgumentError if you try and set the level to something strange using the method form" do
|
141
|
-
expect(lambda { Logit.level(:the_roots) }).to raise_error(ArgumentError)
|
142
|
-
end
|
143
|
-
|
144
|
-
it "should pass other method calls directly to logger" do
|
145
|
-
Logit.level = :debug
|
146
|
-
expect(Logit).to be_debug
|
147
|
-
expect(lambda { Logit.debug("Gimme some sugar!") }).to_not raise_error
|
148
|
-
end
|
149
|
-
|
150
|
-
it "should pass add method calls directly to logger" do
|
151
|
-
logdev = StringIO.new
|
152
|
-
Logit.init(logdev)
|
153
|
-
Logit.level = :debug
|
154
|
-
expect(Logit).to be_debug
|
155
|
-
expect(lambda { Logit.add(Logger::DEBUG, "Gimme some sugar!") }).to_not raise_error
|
156
|
-
expect(logdev.string).to match(/Gimme some sugar/)
|
157
|
-
end
|
158
|
-
|
159
|
-
it "should default to STDOUT if init is called with no arguments" do
|
160
|
-
logger_mock = Struct.new(:formatter, :level).new
|
161
|
-
expect(Logger).to receive(:new).with(STDOUT).and_return(logger_mock)
|
162
|
-
Logit.init
|
163
|
-
end
|
164
|
-
|
165
|
-
it "should have by default a base log level of warn" do
|
166
|
-
logger_mock = Struct.new(:formatter, :level).new
|
167
|
-
expect(Logger).to receive(:new).and_return(logger_mock)
|
168
|
-
Logit.init
|
169
|
-
expect(Logit.level).to eq(:warn)
|
170
|
-
end
|
171
|
-
|
172
|
-
it "should close File logger" do
|
173
|
-
opened_files_count_before = 0
|
174
|
-
ObjectSpace.each_object(File) do |f|
|
175
|
-
opened_files_count_before += 1 unless f.closed?
|
176
|
-
end
|
177
|
-
name = File.join(Dir.tmpdir, "logger.log")
|
178
|
-
Logit.init(name)
|
179
|
-
Logit.init(name)
|
180
|
-
Logit.init(name)
|
181
|
-
opened_files_count_after = 0
|
182
|
-
ObjectSpace.each_object(File) do |f|
|
183
|
-
opened_files_count_after += 1 unless f.closed?
|
184
|
-
end
|
185
|
-
expect(opened_files_count_after).to eq(opened_files_count_before + 1)
|
186
|
-
end
|
187
|
-
|
188
|
-
it "should not close IO logger" do
|
189
|
-
opened_files_count_before = 0
|
190
|
-
ObjectSpace.each_object(File) do |f|
|
191
|
-
opened_files_count_before += 1 unless f.closed?
|
192
|
-
end
|
193
|
-
Tempfile.open("chef-test-log") do |file|
|
194
|
-
Logit.init(file)
|
195
|
-
Logit.init(file)
|
196
|
-
Logit.init(file)
|
197
|
-
opened_files_count_after = 0
|
198
|
-
ObjectSpace.each_object(File) do |f|
|
199
|
-
opened_files_count_after += 1 unless f.closed?
|
200
|
-
end
|
201
|
-
expect(opened_files_count_after).to eq(opened_files_count_before + 1)
|
202
|
-
end
|
203
|
-
end
|
204
|
-
|
205
|
-
it "should return nil from its logging methods" do
|
206
|
-
expect(Logger).to receive(:new).with(STDOUT) { double("a-quiet-logger").as_null_object }
|
207
|
-
Logit.init
|
208
|
-
|
209
|
-
aggregate_failures "returns nil from logging method" do
|
210
|
-
expect(Logit.trace("hello")).to be_nil
|
211
|
-
expect(Logit.debug("hello")).to be_nil
|
212
|
-
expect(Logit.info("hello")).to be_nil
|
213
|
-
expect(Logit.warn("hello")).to be_nil
|
214
|
-
expect(Logit.error("hello")).to be_nil
|
215
|
-
expect(Logit.fatal("hello")).to be_nil
|
216
|
-
end
|
217
|
-
end
|
218
|
-
|
219
|
-
it "should set metadata correctly" do
|
220
|
-
Logit.metadata = { test: "data" }
|
221
|
-
expect(Logit.metadata).to eql({ test: "data" })
|
222
|
-
end
|
223
|
-
|
224
|
-
it "should format :trace level messages with TRACE: label" do
|
225
|
-
logdev = StringIO.new
|
226
|
-
Logit.init(logdev)
|
227
|
-
Logit.level = :trace
|
228
|
-
Logit.trace("this is a log message")
|
229
|
-
aggregate_failures do
|
230
|
-
expect(logdev.string).to_not match(/ANY:/)
|
231
|
-
expect(logdev.string).to match(/TRACE:/)
|
232
|
-
end
|
233
|
-
end
|
234
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: Adam Jacob (<adam@chef.io>)
|
3
|
-
# Author:: Christopher Brown (<cb@chef.io>)
|
4
|
-
# Copyright:: Copyright (c) 2008-2016 Chef Software, Inc.
|
5
|
-
# License:: Apache License, Version 2.0
|
6
|
-
#
|
7
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
-
# you may not use this file except in compliance with the License.
|
9
|
-
# You may obtain a copy of the License at
|
10
|
-
#
|
11
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
-
#
|
13
|
-
# Unless required by applicable law or agreed to in writing, software
|
14
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
-
# See the License for the specific language governing permissions and
|
17
|
-
# limitations under the License.
|
18
|
-
#
|
19
|
-
|
20
|
-
$TESTING = true
|
21
|
-
$:.push File.join(File.dirname(__FILE__), "..", "lib")
|
22
|
-
|
23
|
-
require "rspec"
|
24
|
-
require "mixlib/log"
|
25
|
-
require "mixlib/log/formatter"
|
26
|
-
|
27
|
-
RSpec.configure do |config|
|
28
|
-
config.disable_monkey_patching!
|
29
|
-
end
|
30
|
-
|
31
|
-
class Logit
|
32
|
-
extend Mixlib::Log
|
33
|
-
end
|