active_logger 0.6.1 → 0.7.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 +1 -1
- data/.rubocop_todo.yml +13 -1
- data/Gemfile +1 -0
- data/Gemfile.lock +3 -1
- data/README.md +15 -4
- data/lib/active_logger.rb +13 -0
- data/lib/active_logger/appenders.rb +26 -0
- data/lib/active_logger/appenders/base.rb +14 -0
- data/lib/active_logger/appenders/file.rb +17 -0
- data/lib/active_logger/appenders/streams.rb +21 -0
- data/lib/active_logger/appenders/syslog.rb +56 -0
- data/lib/active_logger/formatters/syslog.rb +60 -0
- data/lib/active_logger/helpers/appender.rb +3 -22
- data/lib/active_logger/helpers/formatter.rb +2 -1
- data/lib/active_logger/logging.rb +4 -4
- data/lib/active_logger/version.rb +1 -1
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 50ac1681070fa355494e0e49c9b2cc73ec24a6c989627b12be37aa4f5c27d968
|
4
|
+
data.tar.gz: 59aaf06f6816b43c6dc8f795ac358ad0197b92cfe8dabbeb822b158e6a5f661a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 075a32e06eeadc591c323b8df912b5e872d179cae608af7b7bf3d6229b4e5dfb6f37c0a46c0bc3b6a01e899e540aac612a9591c1bc5a5050087ef372d7c3f186
|
7
|
+
data.tar.gz: 412807005a9587d8ab6bc234ea8bf99d9bbfa3303aaafe32eb164c086a62d43409727259202cc5696bc7749c9943bcfec87c4872b02e1dc18dc7086e559c0c50
|
data/.rubocop.yml
CHANGED
data/.rubocop_todo.yml
CHANGED
@@ -1,7 +1,19 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on 2020-
|
3
|
+
# on 2020-05-03 18:09:41 +0300 using RuboCop version 0.82.0.
|
4
4
|
# The point is for the user to remove these configuration records
|
5
5
|
# one by one as the offenses are removed from the code base.
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
7
7
|
# versions of RuboCop, may require this file to be generated again.
|
8
|
+
|
9
|
+
# Offense count: 1
|
10
|
+
# Cop supports --auto-correct.
|
11
|
+
# Configuration parameters: AllowUnusedKeywordArguments, IgnoreEmptyMethods, IgnoreNotImplementedMethods.
|
12
|
+
Lint/UnusedMethodArgument:
|
13
|
+
Exclude:
|
14
|
+
- 'lib/active_logger/formatters/syslog.rb'
|
15
|
+
|
16
|
+
# Offense count: 1
|
17
|
+
# Configuration parameters: CountKeywordArgs.
|
18
|
+
Metrics/ParameterLists:
|
19
|
+
Max: 7
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
active_logger (0.
|
4
|
+
active_logger (0.7.0)
|
5
5
|
activesupport (>= 5.0.0)
|
6
6
|
|
7
7
|
GEM
|
@@ -50,6 +50,7 @@ GEM
|
|
50
50
|
rubocop-rspec (1.38.1)
|
51
51
|
rubocop (>= 0.68.1)
|
52
52
|
ruby-progressbar (1.10.1)
|
53
|
+
syslog_protocol (0.9.2)
|
53
54
|
thread_safe (0.3.6)
|
54
55
|
tzinfo (1.2.6)
|
55
56
|
thread_safe (~> 0.1)
|
@@ -65,6 +66,7 @@ DEPENDENCIES
|
|
65
66
|
rspec (~> 3.0)
|
66
67
|
rubocop (~> 0.81)
|
67
68
|
rubocop-rspec (~> 1.38)
|
69
|
+
syslog_protocol
|
68
70
|
|
69
71
|
BUNDLED WITH
|
70
72
|
2.1.2
|
data/README.md
CHANGED
@@ -57,10 +57,6 @@ Available standard options:
|
|
57
57
|
```ruby
|
58
58
|
logger = ActiveLogger.new :file, filename: 'log/development.log', keep: 30, size: 10
|
59
59
|
logger.info 'test'
|
60
|
-
|
61
|
-
# Alternative
|
62
|
-
logger = ActiveLogger.new 'log/development.log', keep: 30, size: 10
|
63
|
-
logger.info 'test'
|
64
60
|
```
|
65
61
|
|
66
62
|
where:
|
@@ -120,6 +116,21 @@ end
|
|
120
116
|
ActiveLogger.new STDOUT, formatter: Formatter
|
121
117
|
```
|
122
118
|
|
119
|
+
### Example: Syslog
|
120
|
+
|
121
|
+
You can use syslog (support only UDP protocol):
|
122
|
+
|
123
|
+
```ruby
|
124
|
+
logger = ActiveLogger.new :syslog, url: 'udp://sysloghost.com:514', facility: 'local3', maxsize: 1024
|
125
|
+
logger.info 'test' # => <13>May 3 19:09:23 localhost console: test
|
126
|
+
```
|
127
|
+
|
128
|
+
Available options:
|
129
|
+
|
130
|
+
* `url` - full url to syslog
|
131
|
+
* `facility` - syslog facility (Example: 'user', 'local3', etc)
|
132
|
+
* `maxsize` - maximum message size
|
133
|
+
|
123
134
|
## Development
|
124
135
|
|
125
136
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/lib/active_logger.rb
CHANGED
@@ -19,10 +19,17 @@ module ActiveLogger # :nodoc:
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
+
# Appenders
|
23
|
+
require File.dirname(__FILE__) + '/active_logger/appenders/base'
|
24
|
+
require File.dirname(__FILE__) + '/active_logger/appenders/file'
|
25
|
+
require File.dirname(__FILE__) + '/active_logger/appenders/streams'
|
26
|
+
require File.dirname(__FILE__) + '/active_logger/appenders/syslog'
|
27
|
+
|
22
28
|
# Formatters
|
23
29
|
require File.dirname(__FILE__) + '/active_logger/formatters/base'
|
24
30
|
require File.dirname(__FILE__) + '/active_logger/formatters/default'
|
25
31
|
require File.dirname(__FILE__) + '/active_logger/formatters/json'
|
32
|
+
require File.dirname(__FILE__) + '/active_logger/formatters/syslog'
|
26
33
|
|
27
34
|
# Helpers
|
28
35
|
require File.dirname(__FILE__) + '/active_logger/helpers/base'
|
@@ -34,3 +41,9 @@ require File.dirname(__FILE__) + '/active_logger/tagged_logging'
|
|
34
41
|
require File.dirname(__FILE__) + '/active_logger/logging'
|
35
42
|
require File.dirname(__FILE__) + '/active_logger/logger'
|
36
43
|
require File.dirname(__FILE__) + '/active_logger/repository'
|
44
|
+
require File.dirname(__FILE__) + '/active_logger/appenders'
|
45
|
+
|
46
|
+
ActiveLogger::Appenders.register(:stdout, ActiveLogger::Appenders::Stdout)
|
47
|
+
ActiveLogger::Appenders.register(:stderr, ActiveLogger::Appenders::Stderr)
|
48
|
+
ActiveLogger::Appenders.register(:file, ActiveLogger::Appenders::File)
|
49
|
+
ActiveLogger::Appenders.register(:syslog, ActiveLogger::Appenders::Syslog)
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveLogger
|
4
|
+
module Appenders # :nodoc:
|
5
|
+
class NotFound < StandardError; end
|
6
|
+
|
7
|
+
@appenders = {}
|
8
|
+
|
9
|
+
def self.register(name, klass)
|
10
|
+
@appenders[name.to_sym] = klass
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.new(type, options)
|
14
|
+
appender =
|
15
|
+
case type
|
16
|
+
when STDOUT then @appenders[:stdout]
|
17
|
+
when STDERR then @appenders[:stderr]
|
18
|
+
else @appenders[type]
|
19
|
+
end
|
20
|
+
|
21
|
+
raise NotFound, type if appender.nil?
|
22
|
+
|
23
|
+
appender.new(options)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_support/core_ext/module/delegation'
|
4
|
+
require 'active_support/core_ext/object/blank'
|
5
|
+
|
6
|
+
module ActiveLogger
|
7
|
+
module Appenders
|
8
|
+
module Base # :nodoc:
|
9
|
+
def default_formatter
|
10
|
+
ActiveLogger::Formatters::Default.new
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveLogger
|
4
|
+
module Appenders
|
5
|
+
class File < ActiveSupport::Logger # :nodoc:
|
6
|
+
include ActiveLogger::Appenders::Base
|
7
|
+
|
8
|
+
class FilenameNotSpecified < StandardError; end
|
9
|
+
|
10
|
+
def initialize(options)
|
11
|
+
raise FilenameNotSpecified if options[:filename].nil?
|
12
|
+
|
13
|
+
super(options[:filename], options[:keep], options[:size])
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveLogger
|
4
|
+
module Appenders
|
5
|
+
class Stdout < ActiveSupport::Logger # :nodoc:
|
6
|
+
include ActiveLogger::Appenders::Base
|
7
|
+
|
8
|
+
def initialize(options)
|
9
|
+
super(STDOUT, *options)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class Stderr < ActiveSupport::Logger # :nodoc:
|
14
|
+
include ActiveLogger::Appenders::Base
|
15
|
+
|
16
|
+
def initialize(options)
|
17
|
+
super(STDERR, *options)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'logger'
|
4
|
+
require 'uri'
|
5
|
+
require 'socket'
|
6
|
+
require 'English'
|
7
|
+
|
8
|
+
module ActiveLogger
|
9
|
+
module Appenders
|
10
|
+
class Syslog < ActiveSupport::Logger # :nodoc:
|
11
|
+
include ActiveLogger::Appenders::Base
|
12
|
+
|
13
|
+
class UrlNotKnown < StandardError; end
|
14
|
+
|
15
|
+
class UdpDevice # :nodoc:
|
16
|
+
def initialize(host:, port: 514)
|
17
|
+
@host = host
|
18
|
+
@port = port
|
19
|
+
@socket = UDPSocket.new
|
20
|
+
end
|
21
|
+
|
22
|
+
def write(message)
|
23
|
+
@socket.send(message, 0, @host, @port)
|
24
|
+
rescue StandardError => e
|
25
|
+
warn "#{self.class} error: #{$ERROR_INFO.class}: #{$ERROR_INFO}\nOriginal message: #{message} #{e.backtrace.join("\n")}"
|
26
|
+
raise e
|
27
|
+
end
|
28
|
+
|
29
|
+
def close
|
30
|
+
@socket.close
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def initialize(options)
|
35
|
+
url = options.delete(:url)
|
36
|
+
uri = URI(url)
|
37
|
+
host = uri.host || 'localhost'
|
38
|
+
protocol = (uri.scheme || :syslog).to_sym
|
39
|
+
port = uri.port || 514
|
40
|
+
@maxsize = options.delete(:maxsize) || 1024
|
41
|
+
@facility = options.delete(:facility) || 'user'
|
42
|
+
|
43
|
+
case protocol
|
44
|
+
when :udp
|
45
|
+
super(UdpDevice.new(host: host, port: port))
|
46
|
+
else
|
47
|
+
raise UrlNotKnown, protocol
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def default_formatter
|
52
|
+
ActiveLogger::Formatters::Syslog.new(maxsize: @maxsize, facility: @facility)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'syslog'
|
4
|
+
require 'syslog_protocol'
|
5
|
+
|
6
|
+
module ActiveLogger
|
7
|
+
module Formatters
|
8
|
+
class Syslog < Base # :nodoc:
|
9
|
+
attr_accessor :facility, :hostname, :maxsize
|
10
|
+
|
11
|
+
class LevelMap # :nodoc:
|
12
|
+
attr_accessor :trace, :debug, :info, :warn, :error, :fatal
|
13
|
+
|
14
|
+
def initialize(debug: ::Syslog::LOG_DEBUG, info: ::Syslog::LOG_INFO, warn: ::Syslog::LOG_WARNING, error: ::Syslog::LOG_ERR, fatal: ::Syslog::LOG_CRIT)
|
15
|
+
@debug = debug
|
16
|
+
@info = info
|
17
|
+
@warn = warn
|
18
|
+
@error = error
|
19
|
+
@fatal = fatal
|
20
|
+
end
|
21
|
+
|
22
|
+
def [](level)
|
23
|
+
public_send(level.to_s.downcase)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def initialize(hostname: nil, facility: nil, maxsize: nil)
|
28
|
+
@hostname = hostname
|
29
|
+
@facility = facility
|
30
|
+
@maxsize = maxsize
|
31
|
+
end
|
32
|
+
|
33
|
+
def call(severity, timestamp, progname, msg)
|
34
|
+
message = "#{tags_text}#{msg}"
|
35
|
+
program = progname || default_progname
|
36
|
+
|
37
|
+
syslog_packet(
|
38
|
+
tag: program.delete(' '),
|
39
|
+
content: message,
|
40
|
+
time: timestamp,
|
41
|
+
severity: LevelMap.new[severity],
|
42
|
+
facility: @facility,
|
43
|
+
maxsize: @maxsize || 1024,
|
44
|
+
host: @hostname
|
45
|
+
)
|
46
|
+
end
|
47
|
+
|
48
|
+
def syslog_packet(tag:, content:, facility: nil, time: nil, severity: nil, host: nil, maxsize: nil)
|
49
|
+
packet = SyslogProtocol::Packet.new
|
50
|
+
packet.hostname = host || `hostname`.chomp
|
51
|
+
packet.facility = facility || 'user'
|
52
|
+
packet.tag = tag
|
53
|
+
packet.content = content
|
54
|
+
packet.time = time
|
55
|
+
packet.severity = severity || 'notice'
|
56
|
+
maxsize ? packet.assemble(maxsize) : packet.assemble
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -5,9 +5,6 @@ module ActiveLogger #:nodoc:
|
|
5
5
|
module Appender #:nodoc:
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
|
8
|
-
class AppenderNotFound < StandardError; end
|
9
|
-
class FilenameNotSpecified < StandardError; end
|
10
|
-
|
11
8
|
class_methods do
|
12
9
|
def appender(type, options = {})
|
13
10
|
appenders << loggable(type, options)
|
@@ -18,26 +15,10 @@ module ActiveLogger #:nodoc:
|
|
18
15
|
end
|
19
16
|
|
20
17
|
def loggable(type, options = {})
|
21
|
-
|
22
|
-
|
23
|
-
case type
|
24
|
-
when :stdout, STDOUT
|
25
|
-
parameters << STDOUT
|
26
|
-
when :stderr, STDERR
|
27
|
-
parameters << STDERR
|
28
|
-
when String, Pathname
|
29
|
-
parameters = [type.to_s, options[:keep], options[:size]]
|
30
|
-
when :file
|
31
|
-
raise FilenameNotSpecified if options[:filename].nil?
|
32
|
-
|
33
|
-
parameters = [options[:filename], options[:keep], options[:size]]
|
34
|
-
else
|
35
|
-
raise AppenderNotFound
|
36
|
-
end
|
37
|
-
|
38
|
-
logger = ActiveLogger::Logger.new(*parameters)
|
18
|
+
logger = ActiveLogger::Appenders.new(type, options)
|
39
19
|
logger.level = level
|
40
|
-
logger.
|
20
|
+
default_formatter = logger.respond_to?(:default_formatter) ? logger.default_formatter : ActiveLogger::Formatters::Default.new
|
21
|
+
logger.formatter = formatter || default_formatter
|
41
22
|
logger.progname = progname
|
42
23
|
logger
|
43
24
|
end
|
@@ -13,6 +13,7 @@ module ActiveLogger #:nodoc:
|
|
13
13
|
case formatter
|
14
14
|
when :default then ActiveLogger::Formatters::Default.new
|
15
15
|
when :json then ActiveLogger::Formatters::Json.new
|
16
|
+
when :syslog then ActiveLogger::Formatters::Syslog.new
|
16
17
|
else
|
17
18
|
raise FormatterNotFound unless formatter.class.ancestors.include?(ActiveLogger::Formatters::Base)
|
18
19
|
|
@@ -27,7 +28,7 @@ module ActiveLogger #:nodoc:
|
|
27
28
|
private
|
28
29
|
|
29
30
|
def reset!
|
30
|
-
@__formatter__ =
|
31
|
+
@__formatter__ = nil
|
31
32
|
|
32
33
|
super if defined?(super)
|
33
34
|
end
|
@@ -15,10 +15,10 @@ module ActiveLogger
|
|
15
15
|
|
16
16
|
reset!
|
17
17
|
|
18
|
-
self.formatter = options
|
19
|
-
self.level = options
|
20
|
-
self.progname = options
|
21
|
-
self.name = options
|
18
|
+
self.formatter = options.delete(:formatter) if options[:formatter]
|
19
|
+
self.level = options.delete(:level) if options[:level]
|
20
|
+
self.progname = options.delete(:progname) if options[:progname]
|
21
|
+
self.name = options.delete(:name) if options[:name]
|
22
22
|
|
23
23
|
if block_given?
|
24
24
|
block.arity.positive? ? block.call(self) : instance_eval(&block)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yury Snegirev
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-04
|
11
|
+
date: 2020-05-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -46,9 +46,15 @@ files:
|
|
46
46
|
- bin/console
|
47
47
|
- bin/setup
|
48
48
|
- lib/active_logger.rb
|
49
|
+
- lib/active_logger/appenders.rb
|
50
|
+
- lib/active_logger/appenders/base.rb
|
51
|
+
- lib/active_logger/appenders/file.rb
|
52
|
+
- lib/active_logger/appenders/streams.rb
|
53
|
+
- lib/active_logger/appenders/syslog.rb
|
49
54
|
- lib/active_logger/formatters/base.rb
|
50
55
|
- lib/active_logger/formatters/default.rb
|
51
56
|
- lib/active_logger/formatters/json.rb
|
57
|
+
- lib/active_logger/formatters/syslog.rb
|
52
58
|
- lib/active_logger/helpers/appender.rb
|
53
59
|
- lib/active_logger/helpers/base.rb
|
54
60
|
- lib/active_logger/helpers/formatter.rb
|