journald-logger 0.0.2 → 1.0.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
  SHA1:
3
- metadata.gz: 8729c7c1ba62b774a54972c7d3a0b23d4d5b3998
4
- data.tar.gz: 40fe1b977ba36e122aa05c60732c654b7044b3dd
3
+ metadata.gz: facbc1ed0842610f785cefd1744337d8f76c282f
4
+ data.tar.gz: 3f90384e426a5009ba0dab5dfd412572e1407946
5
5
  SHA512:
6
- metadata.gz: 5e83926ed316069259f4278b20434bcbb7e90ae81b570499b6453b2cbedc5f82df18e8e444de3d9c25924be7ea8109d38ca177bd2da993dacf38bbecb415db7a
7
- data.tar.gz: 937543adba69ae300afb6036a7e579523d031e3b7261f444f2eb640570c24bf2ebb05fbaece13a476a5d850b545685c2a924c3f52a9d2549d17caca4a580d2f8
6
+ metadata.gz: f269abff54386cb0cfadbbadffec2125e782c8d91e9093850c546fa369b59273ff3a694d1925651c7f72bc961c8944eb5046e59084a92b9f8c8dd856defe58ca
7
+ data.tar.gz: 4d41970f8f8bb429ef8d1067ab65b6c0112c4572caf02daa6414ff4a00cc55911109a2268b2e7a32edc0d0f3ac68384375ec6dc20592cf65872fe13972f45fb9
data/README.md ADDED
@@ -0,0 +1,82 @@
1
+ # journald-logger
2
+
3
+ A Logger drop-in replacement that logs directly to systemd-journal with some additional features
4
+
5
+ ## Usage
6
+
7
+ ```ruby
8
+ require 'journald/logger'
9
+
10
+ logger = Journald::Logger.new('gandalf') # simple logger, sets SYSLOG_IDENTIFIER to 'gandalf'
11
+ logger = Journald::TracerLogger.new('gandalf') # tracing logger, logs caller's file, line number and function name
12
+ ```
13
+
14
+ ## Logger replacement
15
+
16
+ This gem is designed to be accurate drop-in Logger replacement
17
+
18
+ ```ruby
19
+ logger.warn "you shall not pass!" # works
20
+ logger.info("gollum") { "my preciousss" } # also works!
21
+ logger.progname = "saruman" # sets value for SYSLOG_IDENTIFIER to 'saruman'
22
+ logger.formatter = SomeFormatter.new # does nothing, journald-logger does not require a formatter
23
+ logger.close # does nothing, nothing to close
24
+ ```
25
+
26
+ We map Ruby severity to Syslog priority by this map
27
+
28
+ ```ruby
29
+ LEVEL_MAP = {
30
+ ::Logger::UNKNOWN => LOG_ALERT,
31
+ ::Logger::FATAL => LOG_CRIT,
32
+ ::Logger::ERROR => LOG_ERR,
33
+ ::Logger::WARN => LOG_WARNING,
34
+ ::Logger::INFO => LOG_INFO,
35
+ ::Logger::DEBUG => LOG_DEBUG,
36
+ }
37
+ ```
38
+
39
+ You may notice it's somewhat different from the one from Syslog::Logger
40
+
41
+ ## Tags
42
+
43
+ Tags are used to add systemd-journal fields to all subsequent log calls until removed
44
+
45
+ ```ruby
46
+ logger = Journald::Logger.new('gandalf', world: 'arda') # set world tag in costructor
47
+ logger.tag :location, 'moria' # add/replace location
48
+ logger.tag(:object, 'balrog') do # use object field in the block
49
+ # log as 'MESSAGE=you shall not pass!', 'PRIORITY=4', 'LOCATION=moria', 'OBJECT=balrog', 'WORLD=arda'
50
+ logger.warn 'you shall not pass!'
51
+ end
52
+ logger.untag :location # remove location
53
+ ```
54
+
55
+ Tag names must follow systemd-journal fields naming convention:
56
+ letters, numbers, underscores, cannot begin with underscore. Library upcases all letters automatically
57
+
58
+ ## systemd-journal style
59
+
60
+ Two methods which look similarly to native systemd-journal api
61
+
62
+ ```ruby
63
+ logger.send({
64
+ message: 'hi!',
65
+ priority: Journald::LOG_NOTICE,
66
+ any_field: 'any_value',
67
+ }) # tags will be added here
68
+ logger.print Journald::LOG_NOTICE, 'hi!' # and here
69
+ ```
70
+
71
+ ## Syslog style
72
+
73
+ Just to add some more confusion you may use methods with syslog severity names prefixed with ```log_```
74
+
75
+ ```ruby
76
+ logger.log_err 'Error'
77
+ logger.log_debug 'Debug'
78
+ ```
79
+
80
+ ## License
81
+
82
+ MIT, see LICENSE.txt
@@ -1,4 +1,3 @@
1
- # coding: utf-8
2
1
  lib = File.expand_path('../lib', __FILE__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
  require 'journald/logger/version'
@@ -17,7 +16,7 @@ Gem::Specification.new do |spec|
17
16
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
17
  spec.require_paths = ['lib']
19
18
 
20
- spec.required_ruby_version = '>= 1.9.2'
19
+ spec.required_ruby_version = '>= 2.0.0'
21
20
 
22
21
  spec.add_runtime_dependency 'journald-native', '~> 1.0'
23
22
 
@@ -0,0 +1,35 @@
1
+ module Journald
2
+ class Logger
3
+ module Exceptionable
4
+ def exception(e, priority: nil, severity: nil)
5
+ priority ||= severity_to_priority(severity) || Journald::LOG_CRIT
6
+ real_exception(e, priority, false)
7
+ end
8
+
9
+ private
10
+
11
+ def real_exception(e, priority, is_cause)
12
+ # for Ruby 2.1 get cause if present
13
+ cause = if e.respond_to? :cause; e.cause; end
14
+ # for Ruby 2.1 get backtrace if present
15
+ bt = e.respond_to?(:backtrace_locations) && e.backtrace_locations.length > 0
16
+
17
+ tag_trace_location(e.backtrace_locations[0]) if bt
18
+
19
+ send({
20
+ priority: priority,
21
+ message: "Exception #{e.inspect}",
22
+ gem_logger_message_type: is_cause ? 'ExceptionCause' : 'Exception',
23
+ exception_class: e.class.name,
24
+ exception_message: e.message,
25
+ backtrace: e.backtrace.join("\n"),
26
+ cause: cause ? cause.inspect : nil,
27
+ })
28
+
29
+ untag_trace_location if bt
30
+
31
+ real_exception(cause, priority, true) if cause
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,85 @@
1
+ module Journald
2
+ class Logger
3
+ module Loggable
4
+ # ruby Logger style
5
+
6
+ # our map differs from Syslog::Logger
7
+ LEVEL_MAP = {
8
+ ::Logger::UNKNOWN => LOG_ALERT,
9
+ ::Logger::FATAL => LOG_CRIT,
10
+ ::Logger::ERROR => LOG_ERR,
11
+ ::Logger::WARN => LOG_WARNING,
12
+ ::Logger::INFO => LOG_INFO,
13
+ ::Logger::DEBUG => LOG_DEBUG,
14
+ }
15
+
16
+ def add(severity, message = nil, progname = nil, &block)
17
+ priority = severity_to_priority(severity) || LEVEL_MAP[::Logger::UNKNOWN]
18
+
19
+ # some black magic from Logger O__o
20
+ progname ||= self.progname
21
+ if message.nil?
22
+ if block_given?
23
+ message = block.call
24
+ else
25
+ message = progname
26
+ progname = self.progname
27
+ end
28
+ end
29
+
30
+ send({
31
+ priority: priority,
32
+ message: message,
33
+ syslog_identifier: progname,
34
+ })
35
+ end
36
+
37
+ alias_method :log, :add
38
+
39
+ # add methods a la Logger.warn or Logger.error
40
+ ::Logger::Severity::constants.each do |severity|
41
+ severity_key = severity.downcase
42
+ severity_value = ::Logger::Severity.const_get(severity)
43
+
44
+ define_method(severity_key) do |progname = nil, &block|
45
+ add(severity_value, nil, progname, &block)
46
+ end
47
+
48
+ define_method("#{severity_key}?".to_sym) do
49
+ true # journald always logs everything
50
+ end
51
+ end
52
+
53
+ def <<(value)
54
+ debug(value)
55
+ end
56
+
57
+ # Logger accessors
58
+
59
+ # journald always logs everything
60
+ def level
61
+ ::Logger::DEBUG
62
+ end
63
+
64
+ def sev_threshold
65
+ ::Logger::DEBUG
66
+ end
67
+
68
+ def level=(_); end
69
+ def sev_threshold=(_); end
70
+
71
+ # journald does not require formatter or formatting
72
+ def formatter; end
73
+ def formatter=(_); end
74
+ def datetime_format; end
75
+ def datetime_format=(_); end
76
+
77
+ def close; end
78
+
79
+ private
80
+ def severity_to_priority(severity)
81
+ LEVEL_MAP[severity]
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,13 @@
1
+ module Journald
2
+ class Logger
3
+ module Sysloggable
4
+ # methods with syslog priorities like logger.log_err, logger.log_warning
5
+ [:LOG_EMERG, :LOG_ALERT, :LOG_CRIT, :LOG_ERR, :LOG_WARNING, :LOG_NOTICE, :LOG_INFO, :LOG_DEBUG].each do |level|
6
+ define_method(level.downcase) do |message = nil, &block|
7
+ message ||= block.call
8
+ print(Journald.const_get(level), message)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,5 +1,5 @@
1
1
  module Journald
2
- module Logger
3
- VERSION = '0.0.2'
2
+ class Logger
3
+ VERSION = '1.0.0'
4
4
  end
5
5
  end
@@ -1,6 +1,102 @@
1
- require 'journald/logger/version'
1
+ require 'logger'
2
+ require 'journald/native'
3
+
4
+ require_relative 'logger/version'
5
+ require_relative 'logger/exceptionable'
6
+ require_relative 'logger/loggable'
7
+ require_relative 'logger/sysloggable'
8
+
9
+ require_relative 'tracer_logger'
2
10
 
3
11
  module Journald
4
- module Logger
12
+ class Logger
13
+ include Exceptionable
14
+ include Loggable
15
+ include Sysloggable
16
+
17
+ def initialize(progname = nil, tags = {})
18
+ @tags = tags
19
+ @logger = Native
20
+ self.progname = progname
21
+ end
22
+
23
+ def progname
24
+ tag_value(:syslog_identifier)
25
+ end
26
+
27
+ def progname=(value)
28
+ tag(:syslog_identifier, value)
29
+ end
30
+
31
+ # systemd-journal style
32
+
33
+ # send systemd-journal message
34
+ def send(hash)
35
+ hash_to_send = @tags.merge(hash)
36
+ real_send(hash_to_send)
37
+ end
38
+
39
+ def print(priority, message)
40
+ send({
41
+ priority: priority,
42
+ message: message,
43
+ })
44
+ end
45
+
46
+ # add tags
47
+
48
+ # add tag to all log messages
49
+ def tag(key, value)
50
+ @tags[key] = value
51
+
52
+ if block_given?
53
+ yield
54
+ untag(key)
55
+ end
56
+ end
57
+
58
+ # get tag value
59
+ def tag_value(key)
60
+ @tags[key]
61
+ end
62
+
63
+ # stop adding the tag
64
+ def untag(key)
65
+ @tags.delete(key)
66
+ end
67
+
68
+ protected
69
+
70
+ def tag_trace_location(location)
71
+ tag :code_file, location.path
72
+ tag :code_line, location.lineno
73
+ tag :code_func, location.label
74
+
75
+ if block_given?
76
+ yield
77
+ untag_trace_location
78
+ end
79
+ end
80
+
81
+ def untag_trace_location
82
+ untag :code_file
83
+ untag :code_line
84
+ untag :code_func
85
+ end
86
+
87
+ private
88
+
89
+ def real_send(hash)
90
+ hash = hash.delete_if { |_, v| v.nil? }
91
+
92
+ array_to_send = hash.map do |k,v|
93
+ key = k.to_s.upcase
94
+ value = v.to_s
95
+
96
+ "#{key}=#{value}"
97
+ end
98
+
99
+ @logger.send(*array_to_send)
100
+ end
5
101
  end
6
102
  end
@@ -0,0 +1,18 @@
1
+ module Journald
2
+ class TracerLogger
3
+ def initialize(progname = nil, tags = {})
4
+ @wrapped_logger = Logger.new(progname, tags)
5
+ end
6
+
7
+ def method_missing(meth, *args, &block)
8
+ super unless @wrapped_logger.respond_to? meth
9
+
10
+ @wrapped_logger.__send__(:tag_trace_location, caller_locations[0])
11
+ @wrapped_logger.__send__(meth, *args, &block)
12
+ end
13
+
14
+ def respond_to_missing?(method_name, include_private = false)
15
+ @wrapped_logger.respond_to?(method_name, include_private)
16
+ end
17
+ end
18
+ end
metadata CHANGED
@@ -1,55 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: journald-logger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anton Smirnov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-01 00:00:00.000000000 Z
11
+ date: 2014-11-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: journald-native
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '1.6'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.6'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  description:
@@ -59,14 +59,18 @@ executables: []
59
59
  extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
- - .gitignore
62
+ - ".gitignore"
63
63
  - Gemfile
64
64
  - LICENSE.txt
65
- - README.rdoc
65
+ - README.md
66
66
  - Rakefile
67
67
  - journald-logger.gemspec
68
68
  - lib/journald/logger.rb
69
+ - lib/journald/logger/exceptionable.rb
70
+ - lib/journald/logger/loggable.rb
71
+ - lib/journald/logger/sysloggable.rb
69
72
  - lib/journald/logger/version.rb
73
+ - lib/journald/tracer_logger.rb
70
74
  homepage: https://github.com/sandfox-im/journald-logger
71
75
  licenses:
72
76
  - MIT
@@ -77,19 +81,18 @@ require_paths:
77
81
  - lib
78
82
  required_ruby_version: !ruby/object:Gem::Requirement
79
83
  requirements:
80
- - - '>='
84
+ - - ">="
81
85
  - !ruby/object:Gem::Version
82
- version: 1.9.2
86
+ version: 2.0.0
83
87
  required_rubygems_version: !ruby/object:Gem::Requirement
84
88
  requirements:
85
- - - '>='
89
+ - - ">="
86
90
  - !ruby/object:Gem::Version
87
91
  version: '0'
88
92
  requirements: []
89
93
  rubyforge_project:
90
- rubygems_version: 2.1.11
94
+ rubygems_version: 2.4.4
91
95
  signing_key:
92
96
  specification_version: 4
93
97
  summary: systemd-journal native logger
94
98
  test_files: []
95
- has_rdoc:
data/README.rdoc DELETED
@@ -1,5 +0,0 @@
1
- = journald-logger
2
-
3
- Logger that logs directly to systemd-journal
4
-
5
- Work in progress, still not usable