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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d656c1e99eace807d86b10c69f030cdbbbf7228a02bfa533fdc95ae3f481d849
4
- data.tar.gz: 15ad4c1024bd1e0bbac497339123005e1823344d85d3addc928ec3baa5394a3e
3
+ metadata.gz: 50ac1681070fa355494e0e49c9b2cc73ec24a6c989627b12be37aa4f5c27d968
4
+ data.tar.gz: 59aaf06f6816b43c6dc8f795ac358ad0197b92cfe8dabbeb822b158e6a5f661a
5
5
  SHA512:
6
- metadata.gz: 8471d55b78112605cbdd040f55a7f5d3f3e90d400caa84adfdda63926b3c4512b64a951f656e436b28d6ef7c6cc3377736606d767f3e891ddeafd8ad598b5dc5
7
- data.tar.gz: 391cc5a5ec92bd2d249493cae0364c8750d2b6ed1cff8eea2a64acdb32d0b53576a77c26161a2ef2f5f3a47d9425d3fc9fb27c5eb9763069fc526470427fdf3f
6
+ metadata.gz: 075a32e06eeadc591c323b8df912b5e872d179cae608af7b7bf3d6229b4e5dfb6f37c0a46c0bc3b6a01e899e540aac612a9591c1bc5a5050087ef372d7c3f186
7
+ data.tar.gz: 412807005a9587d8ab6bc234ea8bf99d9bbfa3303aaafe32eb164c086a62d43409727259202cc5696bc7749c9943bcfec87c4872b02e1dc18dc7086e559c0c50
@@ -11,7 +11,7 @@ AllCops:
11
11
  # ************************
12
12
 
13
13
  Layout/LineLength:
14
- Max: 130
14
+ Enabled: false
15
15
 
16
16
  # ************************
17
17
  # METRICS
@@ -1,7 +1,19 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2020-04-26 23:35:43 +0300 using RuboCop version 0.82.0.
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
@@ -9,3 +9,4 @@ gem 'rake', '~> 12.0'
9
9
  gem 'rspec', '~> 3.0'
10
10
  gem 'rubocop', '~> 0.81', require: false
11
11
  gem 'rubocop-rspec', '~> 1.38', require: false
12
+ gem 'syslog_protocol', require: false
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- active_logger (0.6.1)
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.
@@ -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
- parameters = []
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.formatter = formatter
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__ = ActiveLogger::Formatters::Default.new
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[:formatter] if options[:formatter]
19
- self.level = options[:level] if options[:level]
20
- self.progname = options[:progname] if options[:progname]
21
- self.name = options[:name] if options[:name]
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)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveLogger
4
- VERSION = '0.6.1'
4
+ VERSION = '0.7.0'
5
5
  end
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.6.1
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-27 00:00:00.000000000 Z
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