logglier 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +5 -2
- data/lib/logglier/client/http.rb +8 -1
- data/lib/logglier/client/syslog.rb +15 -12
- data/lib/logglier/client.rb +14 -0
- data/lib/logglier/version.rb +1 -1
- data/lib/logglier.rb +1 -3
- data/spec/client_spec.rb +35 -10
- data/spec/logglier_spec.rb +30 -2
- data/spec/spec_helper.rb +37 -0
- metadata +3 -3
data/README.md
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
Overview
|
2
2
|
--------
|
3
3
|
|
4
|
-
|
4
|
+
Send logged messages to Loggly using either the HTTP API or Syslog/UDP.
|
5
5
|
|
6
|
+
Can be used in place of Ruby's Logger (<http://www.ruby-doc.org/stdlib/libdoc/logger/rdoc/>)
|
7
|
+
|
8
|
+
In fact, it (currently) returns an instance of Logger.
|
6
9
|
|
7
10
|
Usage
|
8
11
|
-----
|
@@ -36,7 +39,7 @@ The id is provided by loggly, look at the input's details page
|
|
36
39
|
Logglier.new('udp://<hostname>:<port>/<facility>')
|
37
40
|
|
38
41
|
The facility is optional and defaults to 16 (local0) if none is
|
39
|
-
specified.
|
42
|
+
specified. Facilities are just integers from 0 to 23, see <http://www.faqs.org/rfcs/rfc3164.html>
|
40
43
|
|
41
44
|
|
42
45
|
TODO
|
data/lib/logglier/client/http.rb
CHANGED
@@ -26,12 +26,19 @@ module Logglier
|
|
26
26
|
# Required by Logger::LogDevice
|
27
27
|
def write(message)
|
28
28
|
begin
|
29
|
-
@http.
|
29
|
+
@http.request_post(@input_uri.path, message)
|
30
30
|
rescue TimeoutError => e
|
31
31
|
$stderr.puts "WARNING: TimeoutError posting message: #{message}"
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
+
def formatter
|
36
|
+
proc do |severity, datetime, progname, msg|
|
37
|
+
message = "#{datetime} "
|
38
|
+
message << massage_message(msg, severity)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
35
42
|
# Required by Logger::LogDevice
|
36
43
|
def close
|
37
44
|
nil
|
@@ -9,12 +9,20 @@ module Logglier
|
|
9
9
|
class Syslog
|
10
10
|
include Logglier::Client::InstanceMethods
|
11
11
|
|
12
|
-
attr_reader :input_uri, :facility
|
12
|
+
attr_reader :input_uri, :facility, :syslog
|
13
13
|
|
14
14
|
def initialize(opts={})
|
15
15
|
setup_input_uri(opts)
|
16
|
-
|
17
|
-
|
16
|
+
|
17
|
+
case @input_uri.scheme
|
18
|
+
when 'udp'
|
19
|
+
@syslog = UDPSocket.new()
|
20
|
+
@syslog.connect(@input_uri.host, @input_uri.port)
|
21
|
+
when 'tcp'
|
22
|
+
@syslog = TCPSocket.new(@input_uri.host, @input_uri.port)
|
23
|
+
@syslog.setsockopt( Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, 1 )
|
24
|
+
@syslog.setsockopt( Socket::IPPROTO_TCP, Socket::TCP_NODELAY, true)
|
25
|
+
end
|
18
26
|
|
19
27
|
unless @input_uri.path.empty?
|
20
28
|
@facility = @input_uri.path.split('/')[1]
|
@@ -33,7 +41,6 @@ module Logglier
|
|
33
41
|
# Required by Logger::LogDevice
|
34
42
|
def write(message)
|
35
43
|
begin
|
36
|
-
pp message
|
37
44
|
@syslog.send(message,0)
|
38
45
|
rescue TimeoutError => e
|
39
46
|
$stderr.puts "WARNING: TimeoutError posting message: #{message}"
|
@@ -77,15 +84,11 @@ module Logglier
|
|
77
84
|
else
|
78
85
|
message << "#{$0}: "
|
79
86
|
end
|
80
|
-
message <<
|
81
|
-
|
82
|
-
|
83
|
-
msg.inject(message) {|m,v| m << "#{v[0]}=#{v[1]}" }
|
84
|
-
when String
|
85
|
-
message << msg
|
86
|
-
else
|
87
|
-
message << msg.inspect
|
87
|
+
message << massage_message(msg,severity)
|
88
|
+
if @input_uri.scheme == 'tcp'
|
89
|
+
message << "\r\n"
|
88
90
|
end
|
91
|
+
message
|
89
92
|
end
|
90
93
|
end
|
91
94
|
|
data/lib/logglier/client.rb
CHANGED
@@ -27,6 +27,20 @@ module Logglier
|
|
27
27
|
|
28
28
|
module InstanceMethods
|
29
29
|
|
30
|
+
def massage_message(incoming_message, severity)
|
31
|
+
outgoing_message = ""
|
32
|
+
outgoing_message << "severity=#{severity}, "
|
33
|
+
case incoming_message
|
34
|
+
when Hash
|
35
|
+
outgoing_message << incoming_message.map { |v| "#{v[0]}=#{v[1]}" }.join(", ")
|
36
|
+
when String
|
37
|
+
outgoing_message << incoming_message
|
38
|
+
else
|
39
|
+
outgoing_message << incoming_message.inspect
|
40
|
+
end
|
41
|
+
outgoing_message
|
42
|
+
end
|
43
|
+
|
30
44
|
def setup_input_uri(opts)
|
31
45
|
@input_uri = opts[:input_url]
|
32
46
|
|
data/lib/logglier/version.rb
CHANGED
data/lib/logglier.rb
CHANGED
data/spec/client_spec.rb
CHANGED
@@ -12,7 +12,7 @@ describe Logglier::Client do
|
|
12
12
|
|
13
13
|
end
|
14
14
|
|
15
|
-
context "a single string param" do
|
15
|
+
context "with a single string param" do
|
16
16
|
|
17
17
|
context "that is a valid http uri" do
|
18
18
|
|
@@ -33,6 +33,10 @@ describe Logglier::Client do
|
|
33
33
|
|
34
34
|
context "that is a valid tcp uri" do
|
35
35
|
|
36
|
+
before do
|
37
|
+
TCPSocket.stub(:new) { MockTCPSocket.new }
|
38
|
+
end
|
39
|
+
|
36
40
|
it "should return an instance of the proper client" do
|
37
41
|
log = Logglier::Client.new('tcp://logs.loggly.com:42538')
|
38
42
|
log.should be_an_instance_of Logglier::Client::Syslog
|
@@ -58,19 +62,40 @@ describe Logglier::Client do
|
|
58
62
|
|
59
63
|
end
|
60
64
|
|
61
|
-
context "
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
+
context "HTTPS" do
|
66
|
+
context "#write" do
|
67
|
+
it "should post a message" do
|
68
|
+
log = Logglier::Client.new('https://localhost')
|
69
|
+
log.http.stub(:request_post)
|
70
|
+
log.http.should_receive(:request_post).with('','msg')
|
71
|
+
log.write('msg')
|
72
|
+
end
|
65
73
|
end
|
74
|
+
end
|
66
75
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
76
|
+
context "Syslog" do
|
77
|
+
context "udp" do
|
78
|
+
context "#write" do
|
79
|
+
it "should send a message" do
|
80
|
+
log = Logglier::Client.new('udp://localhost:12345')
|
81
|
+
log.syslog.stub(:send)
|
82
|
+
log.syslog.should_receive(:send).with('msg',0)
|
83
|
+
log.write('msg')
|
84
|
+
end
|
72
85
|
end
|
86
|
+
end
|
73
87
|
|
88
|
+
context "tcp" do
|
89
|
+
context "#write" do
|
90
|
+
before { TCPSocket.stub(:new) { MockTCPSocket.new } }
|
91
|
+
it "should send a message" do
|
92
|
+
log = Logglier::Client.new('tcp://localhost:12345')
|
93
|
+
log.syslog.stub(:send)
|
94
|
+
log.syslog.should_receive(:send).with('msg',0)
|
95
|
+
log.write('msg')
|
96
|
+
end
|
97
|
+
end
|
74
98
|
end
|
75
99
|
end
|
100
|
+
|
76
101
|
end
|
data/spec/logglier_spec.rb
CHANGED
@@ -1,6 +1,34 @@
|
|
1
1
|
describe Logglier do
|
2
2
|
|
3
|
-
|
3
|
+
context "HTTPS" do
|
4
|
+
subject { new_logglier('https://localhost') }
|
4
5
|
|
5
|
-
|
6
|
+
it { should be_an_instance_of Logger }
|
7
|
+
its('logdev.dev') { should be_an_instance_of Logglier::Client::HTTP }
|
8
|
+
|
9
|
+
it_should_behave_like "a logglier enhanced Logger instance"
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
context "Syslog TCP" do
|
14
|
+
before { TCPSocket.stub(:new) { MockTCPSocket.new } }
|
15
|
+
|
16
|
+
subject { new_logglier('tcp://localhost:12345') }
|
17
|
+
|
18
|
+
it { should be_an_instance_of Logger }
|
19
|
+
its('logdev.dev') { should be_an_instance_of Logglier::Client::Syslog }
|
20
|
+
|
21
|
+
it_should_behave_like "a logglier enhanced Logger instance"
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
context "Syslog UDP" do
|
26
|
+
subject { new_logglier('udp://localhost:12345') }
|
27
|
+
|
28
|
+
it { should be_an_instance_of Logger }
|
29
|
+
its('logdev.dev') { should be_an_instance_of Logglier::Client::Syslog }
|
30
|
+
|
31
|
+
it_should_behave_like "a logglier enhanced Logger instance"
|
32
|
+
|
33
|
+
end
|
6
34
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -2,11 +2,48 @@ $:.unshift(File.join(File.dirname(__FILE__), 'lib'))
|
|
2
2
|
|
3
3
|
require 'lib/logglier'
|
4
4
|
|
5
|
+
module LoggerHacks
|
6
|
+
def logdev
|
7
|
+
@logdev
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
5
11
|
RSpec.configure do |config|
|
6
12
|
config.color_enabled = config.tty = true
|
13
|
+
config.add_formatter('documentation')
|
7
14
|
|
8
15
|
config.before(:each) do
|
9
16
|
end
|
10
17
|
|
18
|
+
class MockTCPSocket
|
19
|
+
def initialize(*args); end
|
20
|
+
def setsockopt(*args); end
|
21
|
+
def send(*args); end
|
22
|
+
end
|
23
|
+
|
24
|
+
def new_logglier(url)
|
25
|
+
log = Logglier.new(url)
|
26
|
+
log.extend(LoggerHacks)
|
27
|
+
end
|
28
|
+
|
11
29
|
end
|
12
30
|
|
31
|
+
shared_examples_for "a logglier enhanced Logger instance" do
|
32
|
+
context "#add" do
|
33
|
+
context "with a string" do
|
34
|
+
it "should send a message via the logdev" do
|
35
|
+
subject.logdev.dev.should_receive(:write).with(/severity=WARN, foo/)
|
36
|
+
subject.add(Logger::WARN) { 'foo' }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "with a hash" do
|
41
|
+
it "should send a message via the logdev" do
|
42
|
+
subject.logdev.dev.should_receive(:write).with(/severity=WARN, foo=bar, man=pants/)
|
43
|
+
# The following is equiv to:
|
44
|
+
# subject.warn :foo => :bar, :man => :pants
|
45
|
+
subject.add(Logger::WARN) { {:foo => :bar, :man => :pants} }
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logglier
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 4
|
10
|
+
version: 0.0.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Edward Muller (aka freeformz)
|