active_logger 0.6.1 → 0.7.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 +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
|