logging-journald 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ad48095f0f3c6a845ce0d02b237d930fa6cf7f7e
4
+ data.tar.gz: 5c0e263ef33b5ef0f1424ca188ac37af33ff7323
5
+ SHA512:
6
+ metadata.gz: f677953b81185870ca3ca2559a49eb12227f4e6f769baf6bc4aa212b0188bf1117cbbd8ebf45eb744703b282a452b682bd6db922900411558801a337b32c5100
7
+ data.tar.gz: 67c8a31e1470e1987dba165b9deafecc29b2f797f6d1e3fb90c0e41646677097f8f8da3be38d7d864b4ead4d8cd4dd86f1ad9e7154e3097a3b25d6c02eb87a39
data/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+ coverage/
2
+ doc/
3
+ pkg/
4
+ tmp/
5
+ vendor/
6
+ .rbx
7
+ .rvmrc
data/.rubocop.yml ADDED
@@ -0,0 +1,6 @@
1
+ ---
2
+ Metrics:
3
+ Enabled: false
4
+
5
+ Style/StringLiterals:
6
+ Enabled: false
data/.travis.yml ADDED
@@ -0,0 +1,11 @@
1
+ language: ruby
2
+ before_install:
3
+ - sudo apt-get install -y libsystemd-journal-dev
4
+ install: "bundle install"
5
+ script: "bundle exec rake"
6
+ rvm:
7
+ - 2.1.0
8
+ - 2.2.0
9
+ - 2.3.0
10
+ - 2.4.0
11
+
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,38 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ logging-journald (1.0.0)
5
+ journald-logger
6
+ logging
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ journald-logger (2.0.3)
12
+ journald-native (~> 1.0)
13
+ journald-native (1.0.9)
14
+ little-plugger (1.1.4)
15
+ logging (2.2.2)
16
+ little-plugger (~> 1.1)
17
+ multi_json (~> 1.10)
18
+ metaclass (0.0.4)
19
+ mocha (1.3.0)
20
+ metaclass (~> 0.0.1)
21
+ multi_json (1.13.1)
22
+ power_assert (1.1.1)
23
+ rake (12.3.0)
24
+ test-unit (3.2.7)
25
+ power_assert
26
+
27
+ PLATFORMS
28
+ ruby
29
+
30
+ DEPENDENCIES
31
+ bundler
32
+ logging-journald!
33
+ mocha
34
+ rake
35
+ test-unit
36
+
37
+ BUNDLED WITH
38
+ 1.15.3
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2007-2016 Tim Pease
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ 'Software'), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,89 @@
1
+ ## Logging Journald
2
+ by Lukas Zapletal [![](https://secure.travis-ci.org/lzap/logging-journald.svg)](https://travis-ci.org/lzap/logging-journald)
3
+
4
+ * [Homepage](http://rubygems.org/gems/logging-journald)
5
+ * [Github Project](https://github.com/lzap/logging-journald)
6
+
7
+ ### Description
8
+
9
+ **Logging Journald** is a plugin for [logging gem](https://github.com/TwP/logging) - the flexible logging library for use in Ruby programs. It supports logging to system journal via journald-logger and journald-native gems.
10
+
11
+ ### Installation
12
+
13
+ ```
14
+ gem install logging-journald
15
+ ```
16
+
17
+ The gem provides journald appender and noop layout that does no formatting since core library does not provide such a layout. Apppender options are:
18
+
19
+ * name - name of the appender (required)
20
+ * ident - optional log ident (appender name by default)
21
+ * layout - optional layout (no formatting by default)
22
+ * mdc - log mdc into custom journal fields (true by default)
23
+ * ndc - log ndc hash values into custom journal fields (true by default)
24
+ * facility - optional syslog facility rendered as SYSLOG_FACILITY (LOG_USER (8) by default)
25
+ * extra - extra custom journal fields as hash
26
+
27
+ All custom fields are converted to uppercase by joudnald automatically, for more details [visit official documentation](https://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html).
28
+
29
+ ### Examples
30
+
31
+ Use MDC to send arbitrary key/value pairs to system journal:
32
+
33
+ ```ruby
34
+ require 'logging'
35
+
36
+ log = Logging.logger['app']
37
+ log.add_appenders(Logging.appenders.journald('myservice'))
38
+
39
+ # use mapped diagnostic context to send custom fields
40
+ Logging.mdc['signed_user'] = 'Ondra'
41
+ logger.debug "blah blah"
42
+ ```
43
+
44
+ The example above will be rendered as:
45
+
46
+ ```
47
+ # journalctl -o verbose
48
+ MESSAGE=blah blah
49
+ SYSLOG_FACILITY=8
50
+ SIGNED_USER=Ondra
51
+ PRIORITY=2
52
+ SYSLOG_IDENTIFIER=myapp
53
+ _PID=25979
54
+ _TRANSPORT=journal
55
+ _UID=1000
56
+ _GID=1000
57
+ _MACHINE_ID=xxx
58
+ _HOSTNAME=xxx
59
+ _BOOT_ID=xxx
60
+ ...
61
+ ```
62
+
63
+ Mapped diagnostic contexts are great for global values like logged user, request or session id. There are two more options to send arbitrary key/value pairs:
64
+
65
+ ```ruby
66
+ require 'logging'
67
+
68
+ log = Logging.logger['app']
69
+ log.add_appenders(Logging.appenders.journald('myservice'))
70
+
71
+ # nested diagnostic context is a stack of values and
72
+ # it can be used but only hashes are taken into account
73
+ begin
74
+ Logging.ndc << { exception: err, backtrace: err.backtrace }
75
+ log.fatal "an exception occured"
76
+ ensure
77
+ Logging.ndc.clear
78
+ end
79
+
80
+ # hash can be provided instead of string but in this case
81
+ # layout cannot be used to format message in the system journal
82
+ log.info message: "this must be called 'message'", akey: "a value"
83
+ ```
84
+
85
+ There are some examples in the [examples folder](/examples).
86
+
87
+ ### License
88
+
89
+ The MIT License - see the [LICENSE](/LICENSE) file for the full text.
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask.rb'
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.libs << "test"
6
+ t.test_files = FileList['test/test*.rb']
7
+ t .verbose = true
8
+ end
9
+
10
+ task :default => [:test]
@@ -0,0 +1,31 @@
1
+ require 'logging'
2
+
3
+ log = Logging.logger['example']
4
+ log.add_appenders(Logging.appenders.journald('simple',
5
+ ident: 'simple', # optional log ident (appender name by default)
6
+ layout: Logging.layouts.pattern(pattern: "%m\n"), # optional layout
7
+ mdc: true, # log mdc into custom journal fields (true by default)
8
+ ndc: true, # log ndc hash values into custom journal fields (true by default)
9
+ facility: ::Syslog::Constants::LOG_USER, # optional syslog facility
10
+ extra: {}, # extra custom journal fields
11
+ ))
12
+ log.add_appenders(Logging.appenders.stdout)
13
+ log.level = :debug
14
+
15
+ # mapped diagnostic context is logged when mdc is set to true
16
+ Logging.mdc['USERNAME'] = 'Ondra'
17
+
18
+ # logging into journal is straight-forward
19
+ log.debug "this is debug message"
20
+ log.info "a very nice little info message"
21
+ log.warn "this is your last warning"
22
+
23
+ # hash instead string is supported with arbitrary key/value pairs but
24
+ # layout is ignored in this case
25
+ log.error message: "oh no an error", akey: "a value"
26
+
27
+ # when ndc is enabled, any number of hash objects can be pushed
28
+ # and will be logged with the message
29
+ Logging.ndc << { akey: "a value" }
30
+ log.fatal "an exception occured"
31
+ Logging.ndc.clear
@@ -0,0 +1,95 @@
1
+ require 'journald/logger'
2
+
3
+ module Logging
4
+ module Appenders
5
+
6
+ def self.journald(name, *args)
7
+ if args.empty?
8
+ return self['journald'] || ::Logging::Appenders::Journald.new(name)
9
+ end
10
+ ::Logging::Appenders::Journald.new(name, *args)
11
+ end
12
+
13
+ class Journald < ::Logging::Appender
14
+ attr_reader :ident, :mdc, :ndc, :facility, :extra, :journal
15
+
16
+ def initialize(name, opts = {})
17
+ opts[:layout] ||= ::Logging::Layouts::Noop.new
18
+ @ident = opts.fetch(:ident, name)
19
+ @mdc = opts.fetch(:mdc, true)
20
+ @ndc = opts.fetch(:ndc, true)
21
+ @facility = Integer(opts.fetch(:facility, -1))
22
+ @extra = opts.fetch(:extra, {})
23
+ @logger_name = opts.fetch(:logger_name, false)
24
+ @map = [
25
+ ::Journald::LOG_DEBUG,
26
+ ::Journald::LOG_INFO,
27
+ ::Journald::LOG_WARNING,
28
+ ::Journald::LOG_ERR,
29
+ ::Journald::LOG_CRIT
30
+ ]
31
+ map = opts.fetch(:map, nil)
32
+ self.map = map unless map.nil?
33
+ @journal = ::Journald::Logger.new(ident, ::Journald::LOG_DEBUG)
34
+ #@journal.sev_threshold = ::Journald::LOG_DEBUG
35
+ super(name, opts)
36
+ end
37
+
38
+ def map=(levels)
39
+ map = []
40
+ levels.keys.each do |lvl|
41
+ num = ::Logging.level_num(lvl)
42
+ map[num] = syslog_level_num(levels[lvl])
43
+ end
44
+ @map = map
45
+ end
46
+
47
+ def close(*args)
48
+ super(false)
49
+ end
50
+
51
+ private
52
+
53
+ def syslog_level_num(level)
54
+ case level
55
+ when Integer; level
56
+ when String, Symbol
57
+ level = level.to_s.upcase
58
+ self.class.const_get level
59
+ else
60
+ raise ArgumentError, "unknown level '#{level}'"
61
+ end
62
+ end
63
+
64
+ def write(event)
65
+ record = {}
66
+ record.merge!(extra) unless extra.empty?
67
+ record[:SYSLOG_FACILITY] = @facility if @facility >= 0
68
+ record.merge!(Logging.mdc.context) if mdc
69
+ if ndc
70
+ Logging.ndc.context.each do |item|
71
+ record.merge!(item) if item.instance_of?(Hash)
72
+ end
73
+ end
74
+ if event.instance_of?(::Logging::LogEvent)
75
+ record[:priority] = (@map[event.level] || ::Journald::LOG_DEBUG)
76
+ record[@logger_name] = event.logger if @logger_name
77
+ if event.data.instance_of?(Hash)
78
+ record.merge!(event.data)
79
+ else
80
+ record[:message] = @layout.format(event)
81
+ end
82
+ else
83
+ record[:message] = event
84
+ end
85
+ @journal.send(record)
86
+ self
87
+ rescue StandardError => err
88
+ self.level = :off
89
+ ::Logging.log_internal 'system journal appender have been disabled'
90
+ ::Logging.log_internal_error(err)
91
+ raise(err)
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,13 @@
1
+ module Logging::Layouts
2
+
3
+ def self.noop(*args)
4
+ return ::Logging::Layouts::Noop if args.empty?
5
+ ::Logging::Layouts::Noop.new(*args)
6
+ end
7
+
8
+ class Noop < ::Logging::Layout
9
+ def format(event)
10
+ event.data.to_s
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ module Logging
2
+ module Plugins
3
+ module Journald
4
+ extend self
5
+
6
+ VERSION ||= '1.0.0'.freeze
7
+
8
+ def initialize_journald
9
+ require File.expand_path('../../layouts/noop', __FILE__)
10
+ require File.expand_path('../../appenders/journald', __FILE__)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,28 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'logging/plugins/journald'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'logging-journald'
7
+ spec.version = Logging::Plugins::Journald::VERSION
8
+ spec.authors = ['Lukas Zapletal']
9
+ spec.email = ['lukas-x@zapletalovi.com']
10
+ spec.summary = "Journald appender for logging gem"
11
+ spec.description = "Plugin for logging gem providing journald appender"
12
+ spec.homepage = 'https://github.com/lzap/logging-journald'
13
+ spec.license = 'MIT'
14
+
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
+ spec.require_paths = ['lib']
18
+
19
+ spec.required_ruby_version = '>= 2.1.0'
20
+
21
+ spec.add_runtime_dependency 'journald-logger'
22
+ spec.add_runtime_dependency 'logging'
23
+
24
+ spec.add_development_dependency 'bundler'
25
+ spec.add_development_dependency 'mocha'
26
+ spec.add_development_dependency 'rake'
27
+ spec.add_development_dependency 'test-unit'
28
+ end
@@ -0,0 +1,125 @@
1
+ require 'logging'
2
+ require 'test/unit'
3
+ require 'mocha/test_unit'
4
+
5
+ Logging.initialize_plugins
6
+
7
+ module TestLogging
8
+ module TestAppenders
9
+ DEBUG = ::Journald::LOG_DEBUG
10
+ INFO = ::Journald::LOG_INFO
11
+ WARN = ::Journald::LOG_WARNING
12
+ ERR = ::Journald::LOG_ERR
13
+ CRIT = ::Journald::LOG_CRIT
14
+
15
+ class TestJournald < Test::Unit::TestCase
16
+ def setup
17
+ @log = Logging.logger['test']
18
+ @log.clear_appenders
19
+ @log.level = :debug
20
+ end
21
+
22
+ def setup_appender(*args)
23
+ @appender = Logging.appenders.journald('simple', *args)
24
+ @log.add_appenders(@appender)
25
+ end
26
+
27
+ def test_initialize
28
+ setup_appender
29
+ assert_equal "test", @log.name
30
+ assert_equal 1, @log.appenders.size
31
+ end
32
+
33
+ def test_simple_debug_line
34
+ setup_appender
35
+ @appender.journal.expects(:send).with(has_entries(message: "test", priority: DEBUG)).once.returns(true)
36
+ @log.debug "test"
37
+ end
38
+
39
+ def test_simple_debug_line_with_facility
40
+ setup_appender facility: 10
41
+ @appender.journal.expects(:send).with(has_entries(message: "test", SYSLOG_FACILITY: 10, priority: DEBUG)).once.returns(true)
42
+ @log.debug "test"
43
+ end
44
+
45
+ def test_simple_debug_line_with_logger
46
+ setup_appender logger_name: :lg
47
+ @appender.journal.expects(:send).with(has_entries(message: "test", lg: 'test', priority: DEBUG)).once.returns(true)
48
+ @log.debug "test"
49
+ end
50
+
51
+ def test_simple_debug_line_level_info
52
+ setup_appender
53
+ @log.level = :info
54
+ @appender.journal.expects(:send).with(has_entries(message: "test", priority: DEBUG)).never.returns(true)
55
+ @log.debug "test"
56
+ end
57
+
58
+ def test_simple_info_line
59
+ setup_appender
60
+ @appender.journal.expects(:send).with(has_entries(message: "test", priority: INFO)).once.returns(true)
61
+ @log.info "test"
62
+ end
63
+
64
+ def test_simple_warning_line
65
+ setup_appender
66
+ @appender.journal.expects(:send).with(has_entries(message: "test", priority: WARN)).once.returns(true)
67
+ @log.warn "test"
68
+ end
69
+
70
+ def test_simple_error_line
71
+ setup_appender
72
+ @appender.journal.expects(:send).with(has_entries(message: "test", priority: ERR)).once.returns(true)
73
+ @log.error "test"
74
+ end
75
+
76
+ def test_simple_fatal_line
77
+ setup_appender
78
+ @appender.journal.expects(:send).with(has_entries(message: "test", priority: CRIT)).once.returns(true)
79
+ @log.fatal "test"
80
+ end
81
+
82
+ def test_simple_debug_line_as_hash
83
+ setup_appender
84
+ @appender.journal.expects(:send).with(has_entries("message" => "test", priority: DEBUG)).once.returns(true)
85
+ @log.debug "message" => "test"
86
+ end
87
+
88
+ def test_simple_debug_line_as_hash_with_layout
89
+ setup_appender(layout: Logging.layouts.pattern(pattern: "X %m X"))
90
+ @appender.journal.expects(:send).with(has_entries("message" => "test", priority: DEBUG)).once.returns(true)
91
+ @log.debug "message" => "test"
92
+ end
93
+
94
+ def test_simple_info_line_with_mdc
95
+ setup_appender
96
+ Logging.mdc['test'] = 'value'
97
+ @appender.journal.expects(:send).with(has_entries(message: "test", priority: INFO, "test" => "value")).once.returns(true)
98
+ @log.info "test"
99
+ ensure
100
+ Logging.mdc.clear
101
+ end
102
+
103
+ def test_simple_info_line_with_ndc
104
+ setup_appender
105
+ Logging.ndc << { test: "value" }
106
+ @appender.journal.expects(:send).with(has_entries(message: "test", priority: INFO, test: "value")).once.returns(true)
107
+ @log.info "test"
108
+ ensure
109
+ Logging.ndc.clear
110
+ end
111
+
112
+ def test_simple_info_line_with_layout_mdc_ndc
113
+ setup_appender(layout: Logging.layouts.pattern(pattern: "%m %X{test1} %x"))
114
+ Logging.mdc['test1'] = 'value'
115
+ Logging.ndc << { "test2" => "value" }
116
+ @appender.journal.expects(:send).with(has_entries(message: "test value {\"test2\"=>\"value\"}", priority: INFO, "test1" => "value", "test2" => "value")).once.returns(true)
117
+ @log.info "test"
118
+ ensure
119
+ Logging.mdc.clear
120
+ Logging.ndc.clear
121
+ end
122
+ end
123
+ end
124
+ end
125
+
metadata ADDED
@@ -0,0 +1,143 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: logging-journald
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Lukas Zapletal
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-02-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: journald-logger
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: logging
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: mocha
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: test-unit
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: Plugin for logging gem providing journald appender
98
+ email:
99
+ - lukas-x@zapletalovi.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - ".rubocop.yml"
106
+ - ".travis.yml"
107
+ - Gemfile
108
+ - Gemfile.lock
109
+ - LICENSE
110
+ - README.md
111
+ - Rakefile
112
+ - examples/simple.rb
113
+ - lib/logging/appenders/journald.rb
114
+ - lib/logging/layouts/noop.rb
115
+ - lib/logging/plugins/journald.rb
116
+ - logging-journald.gemspec
117
+ - test/test_appenders.rb
118
+ homepage: https://github.com/lzap/logging-journald
119
+ licenses:
120
+ - MIT
121
+ metadata: {}
122
+ post_install_message:
123
+ rdoc_options: []
124
+ require_paths:
125
+ - lib
126
+ required_ruby_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: 2.1.0
131
+ required_rubygems_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ requirements: []
137
+ rubyforge_project:
138
+ rubygems_version: 2.6.11
139
+ signing_key:
140
+ specification_version: 4
141
+ summary: Journald appender for logging gem
142
+ test_files:
143
+ - test/test_appenders.rb