sysloggable 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 905c341697f07420f3fbba5a5118c0991f058cfc
4
+ data.tar.gz: 4bbb3c0b63fe1f68250395295dd32a943e776bef
5
+ SHA512:
6
+ metadata.gz: 78d7e3972c7476aedadec9c6eb5b9c3f4bf1c9bbb35e02307f4068041344ff7eb2a9b3f147383767da8444c5ff47eac3aa1243567287da93fa56350a9293e855
7
+ data.tar.gz: 5eede3bf94802cb56b478bcf1951d0f2f49c235be7781564e0b9f792b90b12f1e6eaea34985c2b10972c53842ebf714b58fd32464e4e7d9720c6d4c6732a0c8a
data/.drone.yml ADDED
@@ -0,0 +1,28 @@
1
+ matrix:
2
+ include:
3
+ - DOCKER_RUBY_VERSION: 2.2
4
+ RUBY_IMAGE_TAG: 2.2-1
5
+
6
+ - DOCKER_RUBY_VERSION: 1.9.3
7
+ RUBY_IMAGE_TAG: 1.9.3-2
8
+
9
+ build:
10
+ image: abakpress/dind:1
11
+ privileged: true
12
+ volumes:
13
+ - /home/data/drone/images:/images
14
+ - /home/data/drone/gems:/bundle
15
+ environment:
16
+ - COMPOSE_FILE_EXT=drone
17
+ commands:
18
+ - wrapdocker docker -v
19
+
20
+ - if [ ! -e /images/ssh-agent.tar ]; then docker pull whilp/ssh-agent; docker save whilp/ssh-agent > /images/ssh-agent.tar; fi
21
+ - if [ ! -e /images/ruby_$RUBY_IMAGE_TAG.tar ]; then docker pull abakpress/ruby:$RUBY_IMAGE_TAG; docker save abakpress/ruby:$RUBY_IMAGE_TAG > /images/ruby_$RUBY_IMAGE_TAG.tar; fi
22
+
23
+ - docker load -i /images/ssh-agent.tar
24
+ - docker load -i /images/ruby_$RUBY_IMAGE_TAG.tar
25
+
26
+ - dip ssh add -T
27
+ - dip provision
28
+ - dip rspec
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,4 @@
1
+ --color
2
+ --tty
3
+ --format progress
4
+ --order random
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in sysloggable.gemspec
4
+ gemspec
5
+
6
+ if RUBY_VERSION < '2'
7
+ gem 'json', '< 2.0.0'
8
+ gem 'dry-container', '= 0.3.4'
9
+ end
data/README.md ADDED
@@ -0,0 +1,47 @@
1
+ # Sysloggable
2
+
3
+ Write your logs to syslog. Message is formatted with options and duration.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'sysloggable'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install sysloggable
20
+
21
+ ## Usage
22
+
23
+ ```ruby
24
+ class FooService
25
+ include ::Sysloggable::InjectLogger(ident: 'banners_stats')
26
+
27
+ def call
28
+ message = "Heavy operation"
29
+ logger.info(message, operation: 'dump', counter: counter.id, date: date) do |params|
30
+ heavy_process!
31
+ end
32
+ rescue exception
33
+ logger.fatal(exception.message, trace: exception.backtrace.join("\n"))
34
+ raise
35
+ end
36
+ end
37
+ ```
38
+
39
+ ## Development
40
+
41
+ Install Docker, Docker-Compose and DIP https://github.com/bibendi/dip
42
+
43
+ ```sh
44
+ dip provision
45
+
46
+ dip rspec
47
+ ```
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/dip.yml ADDED
@@ -0,0 +1,35 @@
1
+ version: '1'
2
+
3
+ environment:
4
+ DOCKER_RUBY_VERSION: 2.2
5
+ RUBY_IMAGE_TAG: 2.2-1
6
+ COMPOSE_FILE_EXT: development
7
+
8
+ compose:
9
+ files:
10
+ - docker-compose.yml
11
+ - docker-compose.${COMPOSE_FILE_EXT}.yml
12
+
13
+ interaction:
14
+ sh:
15
+ service: app
16
+
17
+ irb:
18
+ service: app
19
+ command: irb
20
+
21
+ bundle:
22
+ service: app
23
+ command: bundle
24
+
25
+ rspec:
26
+ service: app
27
+ command: bundle exec rspec
28
+
29
+ clean:
30
+ service: app
31
+ command: rm -f Gemfile.lock
32
+
33
+ provision:
34
+ - docker volume create --name bundler_data
35
+ - dip bundle install
@@ -0,0 +1,18 @@
1
+ version: '2'
2
+
3
+ services:
4
+ app:
5
+ volumes:
6
+ - .:/app
7
+ - ../:/localgems
8
+ - ssh-data:/ssh:ro
9
+ - bundler-data:/bundle
10
+
11
+ volumes:
12
+ bundler-data:
13
+ external:
14
+ name: bundler_data
15
+
16
+ ssh-data:
17
+ external:
18
+ name: ssh_data
@@ -0,0 +1,14 @@
1
+ version: '2'
2
+
3
+ services:
4
+ app:
5
+ volumes:
6
+ - .:/app
7
+ - /bundle:/bundle
8
+ - ssh-data:/ssh:ro
9
+
10
+
11
+ volumes:
12
+ ssh-data:
13
+ external:
14
+ name: ssh_data
@@ -0,0 +1,9 @@
1
+ version: '2'
2
+
3
+ services:
4
+ app:
5
+ image: abakpress/ruby:$RUBY_IMAGE_TAG
6
+ environment:
7
+ - SSH_AUTH_SOCK=/ssh/auth/sock
8
+ - BUNDLE_PATH=/bundle/$DOCKER_RUBY_VERSION
9
+ command: bash
@@ -0,0 +1,12 @@
1
+ require "dry/container"
2
+ require "syslogger"
3
+ require "sysloggable/logger"
4
+
5
+ module Sysloggable
6
+ Container = ::Dry::Container.new
7
+ end
8
+
9
+ ::Sysloggable::Container.namespace('lib') do
10
+ register 'logger', -> { ::Sysloggable::Logger }
11
+ register 'syslogger', -> { ::Syslogger }
12
+ end
@@ -0,0 +1,67 @@
1
+ module Sysloggable
2
+ class Logger
3
+ SEVERITIES = {
4
+ debug: ::Logger::DEBUG,
5
+ info: ::Logger::INFO,
6
+ warn: ::Logger::WARN,
7
+ error: ::Logger::ERROR,
8
+ fatal: ::Logger::FATAL,
9
+ unknown: ::Logger::UNKNOWN
10
+ }.freeze
11
+
12
+ def initialize(options)
13
+ @options = options
14
+ end
15
+
16
+ SEVERITIES.each do |logger_method, logger_code|
17
+ define_method logger_method do |*args, &block|
18
+ add(logger_code, *args, &block)
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def logger
25
+ return @logger if defined?(@logger)
26
+
27
+ @logger = Container['lib.syslogger'].new(
28
+ @options.fetch(:ident),
29
+ ::Syslog::LOG_PID | ::Syslog::LOG_CONS,
30
+ ::Syslog::LOG_LOCAL0
31
+ )
32
+
33
+ @logger.level = @options.fetch(:level, ::Logger::INFO)
34
+ @logger.push_tags(@options[:tags]) if @options[:tags]
35
+
36
+ @logger
37
+ end
38
+
39
+ def add(severity, message, params = {})
40
+ if block_given?
41
+ beginning = Time.now.utc
42
+ yield params
43
+ duration = Time.now.utc - beginning
44
+ else
45
+ duration = 0
46
+ end
47
+
48
+ formated_message = format_message(severity, message, duration, params)
49
+
50
+ logger.add(severity, formated_message)
51
+ end
52
+
53
+ def format_message(severity, message, duration, params)
54
+ result = {
55
+ severity: ::Logger::SEV_LABEL[severity],
56
+ service: @options.fetch(:service_name, @options.fetch(:ident)),
57
+ operation: params.delete(:operation),
58
+ duration: duration,
59
+ message: message
60
+ }.merge!(params)
61
+
62
+ result.each_with_object(String.new) do |(key, value), memo|
63
+ memo << " " << "#{key}=#{value}"
64
+ end.strip!
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,3 @@
1
+ module Sysloggable
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,12 @@
1
+ require "sysloggable/version"
2
+ require "sysloggable/container"
3
+
4
+ module Sysloggable
5
+ def self.InjectLogger(options)
6
+ Module.new do
7
+ define_method(:logger) do
8
+ @logger ||= Container['lib.logger'].new(options)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,35 @@
1
+ require "spec_helper"
2
+
3
+ describe Sysloggable::Logger do
4
+ let(:syslogger) { spy("syslogger") }
5
+ subject(:logger) { described_class.new(ident: "test_ident") }
6
+
7
+ before do
8
+ Sysloggable::Container.stub('lib.syslogger', syslogger)
9
+ end
10
+
11
+ described_class::SEVERITIES.each do |severity_name, severity_value|
12
+ it "responds to #{severity_name}" do
13
+ sev_label = (severity_name == :unknown) ? "ANY" : severity_name.upcase
14
+
15
+ expect(syslogger).to receive(:add).
16
+ with(severity_value, "severity=#{sev_label} service=test_ident operation= duration=0 message=msg")
17
+
18
+ logger.send(severity_name, "msg")
19
+ end
20
+ end
21
+
22
+ it "counts duration" do
23
+ Timecop.freeze(Time.now.utc)
24
+
25
+ expect(syslogger).to receive(:add).
26
+ with(described_class::SEVERITIES[:info],
27
+ "severity=INFO service=test_ident operation= duration=10.0 message=msg")
28
+
29
+ logger.info("msg") do
30
+ Timecop.freeze(Time.now.utc + 10)
31
+ end
32
+
33
+ Timecop.return
34
+ end
35
+ end
@@ -0,0 +1,31 @@
1
+ require "spec_helper"
2
+
3
+ describe Sysloggable do
4
+ it "has a version number" do
5
+ expect(Sysloggable::VERSION).not_to be nil
6
+ end
7
+
8
+ it "defines logger instance method" do
9
+ klass = Class.new do
10
+ include Sysloggable::InjectLogger(ident: "test_name")
11
+ end
12
+
13
+ expect(klass.new.logger).to be_a(Sysloggable::Logger)
14
+ end
15
+
16
+ it "defines logger class method" do
17
+ klass = Class.new do
18
+ extend Sysloggable::InjectLogger(ident: "test_name")
19
+ end
20
+
21
+ expect(klass.logger).to be_a(Sysloggable::Logger)
22
+ end
23
+
24
+ it "passes an options to logger" do
25
+ klass = Class.new do
26
+ include Sysloggable::InjectLogger(ident: "test_name")
27
+ end
28
+
29
+ expect(klass.new.logger.send(:logger).ident).to eq "test_name"
30
+ end
31
+ end
@@ -0,0 +1,15 @@
1
+ $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
2
+
3
+ require "simplecov"
4
+ SimpleCov.start do
5
+ minimum_coverage 95
6
+ end
7
+
8
+ require "sysloggable"
9
+ require "dry/container/stub"
10
+ require "timecop"
11
+
12
+ RSpec.configure do |config|
13
+ config.before { Sysloggable::Container.enable_stubs! }
14
+ config.after { Sysloggable::Container.unstub }
15
+ end
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'sysloggable/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "sysloggable"
8
+ spec.version = Sysloggable::VERSION
9
+ spec.authors = ["Michail Merkushin"]
10
+ spec.email = ["merkushin.m.s@gmail.com"]
11
+
12
+ spec.summary = "The Logger with writing to syslog"
13
+ spec.description = "Writes to syslog with user defined params"
14
+ spec.homepage = "https://github.com/abak-press/sysloggable"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|features)/}) }
17
+ spec.bindir = "exe"
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_runtime_dependency "syslogger", "~> 1.6"
22
+ spec.add_runtime_dependency "dry-container", ">= 0.3.4"
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.13"
25
+ spec.add_development_dependency "rake", "~> 10.0"
26
+ spec.add_development_dependency "rspec", "~> 3.0"
27
+ spec.add_development_dependency "timecop", "~> 0.8"
28
+ spec.add_development_dependency "simplecov", "~> 0.12"
29
+ end
metadata ADDED
@@ -0,0 +1,159 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sysloggable
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Michail Merkushin
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-10-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: syslogger
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: dry-container
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.3.4
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 0.3.4
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.13'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.13'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: timecop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.8'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.8'
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.12'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.12'
111
+ description: Writes to syslog with user defined params
112
+ email:
113
+ - merkushin.m.s@gmail.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".drone.yml"
119
+ - ".gitignore"
120
+ - ".rspec"
121
+ - Gemfile
122
+ - README.md
123
+ - Rakefile
124
+ - dip.yml
125
+ - docker-compose.development.yml
126
+ - docker-compose.drone.yml
127
+ - docker-compose.yml
128
+ - lib/sysloggable.rb
129
+ - lib/sysloggable/container.rb
130
+ - lib/sysloggable/logger.rb
131
+ - lib/sysloggable/version.rb
132
+ - spec/lib/sysloggable/logger_spec.rb
133
+ - spec/lib/sysloggable_spec.rb
134
+ - spec/spec_helper.rb
135
+ - sysloggable.gemspec
136
+ homepage: https://github.com/abak-press/sysloggable
137
+ licenses: []
138
+ metadata: {}
139
+ post_install_message:
140
+ rdoc_options: []
141
+ require_paths:
142
+ - lib
143
+ required_ruby_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ required_rubygems_version: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ requirements: []
154
+ rubyforge_project:
155
+ rubygems_version: 2.6.1
156
+ signing_key:
157
+ specification_version: 4
158
+ summary: The Logger with writing to syslog
159
+ test_files: []