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 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