syslogger5424 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: 22ddee9851cb22ad2d3b96c3e72f5d897abdaaed
4
+ data.tar.gz: 42079138da0fd99aa6230dffdc4ce852116da9f0
5
+ SHA512:
6
+ metadata.gz: dddc1c51a0ca5f5d1203380f5d72e9563955c4532736e332e5d55a15ba1b132d62aa397caf30a3681aef78dd91ed2a5e06563e0502e9b82998ce453a96451e01
7
+ data.tar.gz: c3b327028cca44584dd95fc948a72652d9e5bdaa768f82f4a3ee6aa6279c5100a91ef3dc1f21690c3bc87238c655954d8e7cc33a05f844434da05fa52225a123
data/lib/syslogger.rb ADDED
@@ -0,0 +1,14 @@
1
+ require 'socket'
2
+ require 'logger'
3
+
4
+ require 'syslogger/logger'
5
+ require 'syslogger/io'
6
+ require 'syslogger/formatter/rfc5424'
7
+
8
+ module SysLogger
9
+ extend self
10
+
11
+ def new(logdev = nil, shift_age = 0, shift_size = 1048576, &block)
12
+ return Logger.new(logdev, shift_age, shift_size, &block)
13
+ end
14
+ end
@@ -0,0 +1,90 @@
1
+ module SysLogger
2
+ module Formatter
3
+ class RFC5424 < ::Logger::Formatter
4
+ attr_reader :msgid, :procid, :appname
5
+
6
+ Format = "<%s>1 %s %s %s %s %s [meta x-group=\"%s\"] %s\n"
7
+
8
+ FACILITIES = {
9
+ :kern => 0,
10
+ :user => 1,
11
+ :mail => 2,
12
+ :daemon => 3,
13
+ :auth => 4,
14
+ :syslog => 5,
15
+ :lpr => 6,
16
+ :news => 7,
17
+ :uucp => 8,
18
+ :cron => 9,
19
+ :authpriv => 10,
20
+ :ftp => 11,
21
+ :ntp => 12,
22
+ :audit => 13,
23
+ :alert => 14,
24
+ :at => 15,
25
+ :local0 => 16,
26
+ :local1 => 17,
27
+ :local2 => 18,
28
+ :local3 => 19,
29
+ :local4 => 20,
30
+ :local5 => 21,
31
+ :local6 => 22,
32
+ :local7 => 23
33
+ }
34
+
35
+ SEVERITIES = {
36
+ :emerg => 0,
37
+ :alert => 1,
38
+ :crit => 2,
39
+ :fatal => 2,
40
+ :err => 3,
41
+ :error => 3,
42
+ :warn => 4,
43
+ :notice => 5,
44
+ :info => 6,
45
+ :debug => 7
46
+ }
47
+
48
+ def initialize(appname = nil, procid = nil, msgid = nil, facility = nil)
49
+ super()
50
+
51
+ @msgid = format(msgid, 32)
52
+ @procid = format(procid, 128)
53
+ @appname = format(appname, 48)
54
+
55
+ self.facility = facility || :local7
56
+ end
57
+
58
+ def facility; @facility; end
59
+ def facility=(f)
60
+ @facility = FACILITIES[f.to_s.downcase.to_sym] || @facility
61
+ end
62
+
63
+ def call(severity, datetime, progname, message)
64
+ severity = SEVERITIES[severity.to_s.downcase.to_sym] || SEVERITIES[:info]
65
+ pri = (facility * 8) + severity
66
+
67
+ # Since we're using RFC5424 format, it makes more sense to use the
68
+ # passed in progname as the msgid rather than changing the appname when
69
+ # a block was received to generate the message.
70
+ message_id = progname.nil? ? msgid : format(progname, 32)
71
+
72
+ x_group = rand(99999999)
73
+ lines = msg2str(message).split(/\r?\n/).reject(&:empty?).map do |line|
74
+ Format % [pri, datetime.strftime("%FT%T.%6N%:z"), Socket.gethostname,
75
+ appname, procid, message_id, x_group, line]
76
+ end
77
+
78
+ lines.join
79
+ end
80
+
81
+ def format(text, max_length)
82
+ if text
83
+ text[0..max_length].gsub(/\s+/, '')
84
+ else
85
+ '-'
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,43 @@
1
+ module SysLogger
2
+ class IO
3
+ def initialize(&file_creator)
4
+ @file_creator = file_creator
5
+ @file = @file_creator.call
6
+ end
7
+
8
+ def file
9
+ @file.closed? ? @file = @file_creator.call : @file
10
+ end
11
+
12
+ def write(message)
13
+ tries = 2
14
+ Array(message).each do |msg|
15
+ begin
16
+ transmit(msg)
17
+ rescue
18
+ file.close
19
+ retry unless (tries -= 1).zero?
20
+ end
21
+ end
22
+ end
23
+
24
+ def transmit(message)
25
+ # UNIXSocket overwrites Object#send, so using file.respond_to?(:send)
26
+ # does not work. If send and __send__ have different signigutres call
27
+ # send. Otherwise, call write.
28
+ unless file.method(:send).hash == file.method(:__send__).hash
29
+ file.send(message)
30
+ else
31
+ file.write(message)
32
+ end
33
+ end
34
+
35
+ def flush
36
+ @file.flush
37
+ end
38
+
39
+ def close
40
+ @file.close
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,17 @@
1
+ module SysLogger
2
+ class Logger < ::Logger
3
+ attr_reader :logdev, :default_formatter
4
+
5
+ def initialize(logdev = nil, shift_age = 0, shift_size = 1048576, &block)
6
+ if logdev.nil? && block_given?
7
+ super(SysLogger::IO.new(&block), shift_age, shift_size)
8
+ elsif logdev.nil?
9
+ super($stdout, shift_age, shift_size)
10
+ else
11
+ super(logdev, shift_age, shift_size)
12
+ end
13
+
14
+ @default_formatter = SysLogger::Formatter::RFC5424.new
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,6 @@
1
+ require 'syslogger'
2
+
3
+ require 'rspec/its'
4
+
5
+ RSpec.configure do |config|
6
+ end
@@ -0,0 +1,13 @@
1
+ describe SysLogger::Formatter::RFC5424 do
2
+ its(:msgid) { is_expected.to eq "-" }
3
+ its(:procid) { is_expected.to eq "-" }
4
+ its(:appname) { is_expected.to eq "-" }
5
+ its(:facility) { is_expected.to eq 23 }
6
+
7
+ describe "#call" do
8
+ it "generates Format" do
9
+ expect(subject.call(::Logger::INFO, DateTime.now, "Prog", "Message")).
10
+ to match /<190>1.* - - Prog \[meta x-group=".*"\] Message/
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ describe SysLogger::IO do
2
+ let(:io) { StringIO.new }
3
+
4
+ subject { SysLogger::IO.new { io } }
5
+
6
+ its(:file) { is_expected.to eq io }
7
+
8
+ describe "#write" do
9
+ it "uses io" do
10
+ subject.write("foobar")
11
+ expect(io.string).to eq "foobar"
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ describe SysLogger::Logger do
2
+ let(:io) { StringIO.new }
3
+
4
+ subject { SysLogger::Logger.new(io) }
5
+
6
+ its("logdev.dev") { is_expected.to be io }
7
+ its(:default_formatter) { is_expected.to be_a SysLogger::Formatter::RFC5424 }
8
+
9
+ it "logs exceptions" do
10
+ subject.error StandardError.new("foobar")
11
+ expect(io.string).to match(
12
+ /<187>1.* - - - \[meta x-group=".*"\] foobar \(StandardError\)/)
13
+ end
14
+ end
@@ -0,0 +1,9 @@
1
+ describe SysLogger do
2
+ let(:logger) { SysLogger.new(StringIO.new) }
3
+
4
+ describe '#new' do
5
+ it 'creates a Logger' do
6
+ expect(logger).to be_a SysLogger::Logger
7
+ end
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,112 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: syslogger5424
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - EasyPost
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
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: rspec-its
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
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: pry
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: pry-nav
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
+ description:
70
+ email: support@easypost.com
71
+ executables: []
72
+ extensions: []
73
+ extra_rdoc_files: []
74
+ files:
75
+ - lib/syslogger.rb
76
+ - lib/syslogger/formatter/rfc5424.rb
77
+ - lib/syslogger/io.rb
78
+ - lib/syslogger/logger.rb
79
+ - spec/spec_helper.rb
80
+ - spec/syslogger/formatter/rfc5424_spec.rb
81
+ - spec/syslogger/io_spec.rb
82
+ - spec/syslogger/logger_spec.rb
83
+ - spec/syslogger_spec.rb
84
+ homepage: http://github.com/EasyPost/syslogger
85
+ licenses: []
86
+ metadata: {}
87
+ post_install_message:
88
+ rdoc_options: []
89
+ require_paths:
90
+ - lib
91
+ required_ruby_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ required_rubygems_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ requirements: []
102
+ rubyforge_project:
103
+ rubygems_version: 2.2.2
104
+ signing_key:
105
+ specification_version: 4
106
+ summary: Logging via syslog
107
+ test_files:
108
+ - spec/spec_helper.rb
109
+ - spec/syslogger/formatter/rfc5424_spec.rb
110
+ - spec/syslogger/io_spec.rb
111
+ - spec/syslogger/logger_spec.rb
112
+ - spec/syslogger_spec.rb