tcp_syslog 1.0.2 → 1.0.3
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.
- data/Changelog.md +4 -0
- data/Rakefile +1 -1
- data/lib/tcp_syslog.rb +34 -5
- data/tcp_syslog.gemspec +8 -8
- data/test/test_tcp_syslog.rb +25 -5
- metadata +49 -51
data/Changelog.md
CHANGED
data/Rakefile
CHANGED
@@ -19,7 +19,7 @@ Jeweler::Tasks.new do |gem|
|
|
19
19
|
gem.description = %Q{Rails syslog logger using TCP instead of UDP}
|
20
20
|
gem.email = "philippe.lafoucriere@gmail.com"
|
21
21
|
gem.authors = ["Philippe Lafoucrière"]
|
22
|
-
gem.version = '1.0.
|
22
|
+
gem.version = '1.0.3'
|
23
23
|
# Include your dependencies below. Runtime dependencies are required when using your gem,
|
24
24
|
# and development dependencies are only needed for development (ie running rake tasks, tests, etc)
|
25
25
|
# gem.add_runtime_dependency 'jabber4r', '> 0.1'
|
data/lib/tcp_syslog.rb
CHANGED
@@ -2,7 +2,7 @@ require 'socket'
|
|
2
2
|
require 'syslog'
|
3
3
|
require 'logger'
|
4
4
|
require 'system_timer'
|
5
|
-
|
5
|
+
require 'openssl'
|
6
6
|
# TcpSyslog is used are a dead-simple replacement for
|
7
7
|
# syslog ruby libs. None of them is able to send logs
|
8
8
|
# to a remote server, and even less in TCP.
|
@@ -69,11 +69,15 @@ class TcpSyslog < ActiveSupport::BufferedLogger
|
|
69
69
|
# ** +facility+ : defaults to user
|
70
70
|
# ** +progname+ : defaults to 'rails'
|
71
71
|
# ** +auto_flushing+ : number of messages to buffer before flushing
|
72
|
+
# ** +ssl+ : defaults to nil
|
73
|
+
# *** +cert : "/path/to/cert"
|
74
|
+
# *** +key : "/path/to/key"
|
75
|
+
# *** +ca_file : "/path/to/ca_file"
|
72
76
|
#
|
73
77
|
def initialize(options = {})
|
74
78
|
@level = LOGGER_LEVEL_MAP[options[:level]] || Logger::DEBUG
|
75
79
|
@host = options[:host] || 'localhost'
|
76
|
-
@port = options[:port]
|
80
|
+
@port = options[:port] || '514'
|
77
81
|
@facility = options[:facility] || Syslog::LOG_USER
|
78
82
|
@progname = options[:progname] || 'rails'
|
79
83
|
@buffer = Hash.new { |h,k| h[k] = [] }
|
@@ -81,6 +85,7 @@ class TcpSyslog < ActiveSupport::BufferedLogger
|
|
81
85
|
@auto_flushing = options[:auto_flushing] || 1
|
82
86
|
@local_ip = local_ip
|
83
87
|
@remove_ansi_colors = options[:remove_ansi_colors] || true
|
88
|
+
@ssl = options[:ssl]
|
84
89
|
return if defined? SYSLOG
|
85
90
|
self.class.const_set :SYSLOG, true
|
86
91
|
end
|
@@ -121,11 +126,35 @@ class TcpSyslog < ActiveSupport::BufferedLogger
|
|
121
126
|
end
|
122
127
|
|
123
128
|
def socket
|
124
|
-
@socket[Thread.current] ||=
|
129
|
+
@socket[Thread.current] ||= new_socket
|
125
130
|
end
|
126
131
|
|
132
|
+
def ssl?
|
133
|
+
!@ssl.nil?
|
134
|
+
end
|
135
|
+
|
127
136
|
protected
|
128
|
-
|
137
|
+
|
138
|
+
def new_socket
|
139
|
+
ssl? ? ssl_socket : tcp_socket
|
140
|
+
end
|
141
|
+
|
142
|
+
def tcp_socket
|
143
|
+
TCPSocket.new(@host, @port)
|
144
|
+
end
|
145
|
+
|
146
|
+
def ssl_socket
|
147
|
+
ssl_context = OpenSSL::SSL::SSLContext.new
|
148
|
+
ssl_context.cert = OpenSSL::X509::Certificate.new(File.open(@ssl[:cert]))
|
149
|
+
ssl_context.key = OpenSSL::PKey::RSA.new(File.open(@ssl[:key]))
|
150
|
+
ssl_context.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
151
|
+
ssl_context.ca_file = @ssl[:ca_file]
|
152
|
+
ssl_socket = OpenSSL::SSL::SSLSocket.new(tcp_socket, ssl_context)
|
153
|
+
ssl_socket.sync_close = true
|
154
|
+
ssl_socket.connect
|
155
|
+
ssl_socket
|
156
|
+
end
|
157
|
+
|
129
158
|
# Clean up messages so they're nice and pretty.
|
130
159
|
def clean(message)
|
131
160
|
message = message.to_s.dup
|
@@ -156,7 +185,7 @@ class TcpSyslog < ActiveSupport::BufferedLogger
|
|
156
185
|
msg.split("\n").each do |line|
|
157
186
|
write_on_socket(severity, line)
|
158
187
|
end
|
159
|
-
rescue Errno::ECONNREFUSED, Errno::EPIPE, Timeout::Error
|
188
|
+
rescue Errno::ECONNREFUSED, Errno::ECONNRESET, Errno::EPIPE, Timeout::Error, OpenSSL::SSL::SSLError => e
|
160
189
|
# can't log anything, stop trying
|
161
190
|
@socket[Thread.current] = nil
|
162
191
|
end
|
data/tcp_syslog.gemspec
CHANGED
@@ -4,14 +4,14 @@
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "1.0.
|
7
|
+
s.name = "tcp_syslog"
|
8
|
+
s.version = "1.0.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Philippe Lafoucri\303\250re"]
|
12
|
-
s.date =
|
13
|
-
s.description =
|
14
|
-
s.email =
|
12
|
+
s.date = "2011-11-27"
|
13
|
+
s.description = "Rails syslog logger using TCP instead of UDP"
|
14
|
+
s.email = "philippe.lafoucriere@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE.txt",
|
17
17
|
"README.rdoc"
|
@@ -29,11 +29,11 @@ Gem::Specification.new do |s|
|
|
29
29
|
"test/tcp_syslog_benchmark.rb",
|
30
30
|
"test/test_tcp_syslog.rb"
|
31
31
|
]
|
32
|
-
s.homepage =
|
32
|
+
s.homepage = "http://github.com/tech-angels/tcp_syslog"
|
33
33
|
s.licenses = ["MIT"]
|
34
34
|
s.require_paths = ["lib"]
|
35
|
-
s.rubygems_version =
|
36
|
-
s.summary =
|
35
|
+
s.rubygems_version = "1.8.10"
|
36
|
+
s.summary = "Send logs to syslog using TCP instead of UDP"
|
37
37
|
s.test_files = [
|
38
38
|
"test/helper.rb",
|
39
39
|
"test/tcp_syslog_benchmark.rb",
|
data/test/test_tcp_syslog.rb
CHANGED
@@ -14,6 +14,7 @@ class TestTcpSyslog < ActiveSupport::TestCase
|
|
14
14
|
assert_equal 'rails', @logger.progname
|
15
15
|
assert_equal 1, @logger.auto_flushing
|
16
16
|
assert_equal Logger::DEBUG, @logger.level
|
17
|
+
assert_equal false, @logger.ssl?
|
17
18
|
end
|
18
19
|
|
19
20
|
should "have defined debug, info, warn, error, fatal methods" do
|
@@ -26,16 +27,35 @@ class TestTcpSyslog < ActiveSupport::TestCase
|
|
26
27
|
|
27
28
|
context "on add message" do
|
28
29
|
setup do
|
29
|
-
message = "This message to be sent to syslog"
|
30
|
+
@message = "This message to be sent to syslog"
|
31
|
+
end
|
32
|
+
|
33
|
+
should "have sent the message to syslog using plain TCP" do
|
34
|
+
mock.proxy(TCPSocket).new(@logger.host, @logger.port)
|
35
|
+
dont_allow(OpenSSL::SSL::SSLSocket).new
|
30
36
|
mock.proxy(@logger).flush
|
31
|
-
mock.proxy(@logger).log(Logger::INFO, message)
|
32
|
-
mock.proxy(@logger).write_on_socket(Logger::INFO, message)
|
33
|
-
@logger.add(Logger::INFO, message)
|
37
|
+
mock.proxy(@logger).log(Logger::INFO, @message)
|
38
|
+
mock.proxy(@logger).write_on_socket(Logger::INFO, @message)
|
39
|
+
@logger.add(Logger::INFO, @message)
|
40
|
+
RR.verify
|
34
41
|
end
|
35
42
|
|
36
|
-
should "have sent the message to syslog" do
|
43
|
+
should "have sent the message to syslog using SSL with peer verification" do
|
44
|
+
@logger = TcpSyslog.new(
|
45
|
+
:ssl => {
|
46
|
+
:cert => "/path/to/cert",
|
47
|
+
:key => "/path/to/key",
|
48
|
+
:ca_file => "/path/to/ca_file"
|
49
|
+
}
|
50
|
+
)
|
51
|
+
mock(@logger).ssl_socket{mock!.write(anything)}
|
52
|
+
mock.proxy(@logger).flush
|
53
|
+
mock.proxy(@logger).log(Logger::INFO, @message)
|
54
|
+
mock.proxy(@logger).write_on_socket(Logger::INFO, @message)
|
55
|
+
@logger.add(Logger::INFO, @message)
|
37
56
|
RR.verify
|
38
57
|
end
|
58
|
+
|
39
59
|
end
|
40
60
|
end
|
41
61
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tcp_syslog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 3
|
10
|
+
version: 1.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- "Philippe Lafoucri\xC3\xA8re"
|
@@ -15,12 +15,10 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
19
|
-
default_executable:
|
18
|
+
date: 2011-11-27 00:00:00 Z
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
21
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
24
22
|
none: false
|
25
23
|
requirements:
|
26
24
|
- - ">="
|
@@ -29,12 +27,12 @@ dependencies:
|
|
29
27
|
segments:
|
30
28
|
- 0
|
31
29
|
version: "0"
|
32
|
-
|
33
|
-
|
30
|
+
requirement: *id001
|
31
|
+
type: :development
|
34
32
|
prerelease: false
|
33
|
+
name: shoulda
|
35
34
|
- !ruby/object:Gem::Dependency
|
36
|
-
|
37
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
35
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
38
36
|
none: false
|
39
37
|
requirements:
|
40
38
|
- - ~>
|
@@ -45,12 +43,12 @@ dependencies:
|
|
45
43
|
- 6
|
46
44
|
- 0
|
47
45
|
version: 0.6.0
|
48
|
-
|
49
|
-
|
46
|
+
requirement: *id002
|
47
|
+
type: :development
|
50
48
|
prerelease: false
|
49
|
+
name: yard
|
51
50
|
- !ruby/object:Gem::Dependency
|
52
|
-
|
53
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
51
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
54
52
|
none: false
|
55
53
|
requirements:
|
56
54
|
- - ~>
|
@@ -61,12 +59,12 @@ dependencies:
|
|
61
59
|
- 0
|
62
60
|
- 0
|
63
61
|
version: 1.0.0
|
64
|
-
|
65
|
-
|
62
|
+
requirement: *id003
|
63
|
+
type: :development
|
66
64
|
prerelease: false
|
65
|
+
name: bundler
|
67
66
|
- !ruby/object:Gem::Dependency
|
68
|
-
|
69
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
67
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
70
68
|
none: false
|
71
69
|
requirements:
|
72
70
|
- - ~>
|
@@ -77,12 +75,12 @@ dependencies:
|
|
77
75
|
- 5
|
78
76
|
- 1
|
79
77
|
version: 1.5.1
|
80
|
-
|
81
|
-
|
78
|
+
requirement: *id004
|
79
|
+
type: :development
|
82
80
|
prerelease: false
|
81
|
+
name: jeweler
|
83
82
|
- !ruby/object:Gem::Dependency
|
84
|
-
|
85
|
-
requirement: &id005 !ruby/object:Gem::Requirement
|
83
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
86
84
|
none: false
|
87
85
|
requirements:
|
88
86
|
- - ">="
|
@@ -91,12 +89,12 @@ dependencies:
|
|
91
89
|
segments:
|
92
90
|
- 0
|
93
91
|
version: "0"
|
94
|
-
|
95
|
-
|
92
|
+
requirement: *id005
|
93
|
+
type: :development
|
96
94
|
prerelease: false
|
95
|
+
name: rcov
|
97
96
|
- !ruby/object:Gem::Dependency
|
98
|
-
|
99
|
-
requirement: &id006 !ruby/object:Gem::Requirement
|
97
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
100
98
|
none: false
|
101
99
|
requirements:
|
102
100
|
- - ~>
|
@@ -107,12 +105,12 @@ dependencies:
|
|
107
105
|
- 0
|
108
106
|
- 0
|
109
107
|
version: 3.0.0
|
110
|
-
|
111
|
-
|
108
|
+
requirement: *id006
|
109
|
+
type: :development
|
112
110
|
prerelease: false
|
111
|
+
name: activesupport
|
113
112
|
- !ruby/object:Gem::Dependency
|
114
|
-
|
115
|
-
requirement: &id007 !ruby/object:Gem::Requirement
|
113
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
116
114
|
none: false
|
117
115
|
requirements:
|
118
116
|
- - ">="
|
@@ -121,12 +119,12 @@ dependencies:
|
|
121
119
|
segments:
|
122
120
|
- 0
|
123
121
|
version: "0"
|
124
|
-
|
125
|
-
|
122
|
+
requirement: *id007
|
123
|
+
type: :development
|
126
124
|
prerelease: false
|
125
|
+
name: rr
|
127
126
|
- !ruby/object:Gem::Dependency
|
128
|
-
|
129
|
-
requirement: &id008 !ruby/object:Gem::Requirement
|
127
|
+
version_requirements: &id008 !ruby/object:Gem::Requirement
|
130
128
|
none: false
|
131
129
|
requirements:
|
132
130
|
- - ">="
|
@@ -135,12 +133,12 @@ dependencies:
|
|
135
133
|
segments:
|
136
134
|
- 0
|
137
135
|
version: "0"
|
138
|
-
|
139
|
-
|
136
|
+
requirement: *id008
|
137
|
+
type: :development
|
140
138
|
prerelease: false
|
139
|
+
name: i18n
|
141
140
|
- !ruby/object:Gem::Dependency
|
142
|
-
|
143
|
-
requirement: &id009 !ruby/object:Gem::Requirement
|
141
|
+
version_requirements: &id009 !ruby/object:Gem::Requirement
|
144
142
|
none: false
|
145
143
|
requirements:
|
146
144
|
- - ">="
|
@@ -149,12 +147,12 @@ dependencies:
|
|
149
147
|
segments:
|
150
148
|
- 0
|
151
149
|
version: "0"
|
152
|
-
|
153
|
-
|
150
|
+
requirement: *id009
|
151
|
+
type: :development
|
154
152
|
prerelease: false
|
153
|
+
name: SystemTimer
|
155
154
|
- !ruby/object:Gem::Dependency
|
156
|
-
|
157
|
-
requirement: &id010 !ruby/object:Gem::Requirement
|
155
|
+
version_requirements: &id010 !ruby/object:Gem::Requirement
|
158
156
|
none: false
|
159
157
|
requirements:
|
160
158
|
- - ~>
|
@@ -165,12 +163,12 @@ dependencies:
|
|
165
163
|
- 0
|
166
164
|
- 0
|
167
165
|
version: 3.0.0
|
168
|
-
|
169
|
-
|
166
|
+
requirement: *id010
|
167
|
+
type: :runtime
|
170
168
|
prerelease: false
|
169
|
+
name: activesupport
|
171
170
|
- !ruby/object:Gem::Dependency
|
172
|
-
|
173
|
-
requirement: &id011 !ruby/object:Gem::Requirement
|
171
|
+
version_requirements: &id011 !ruby/object:Gem::Requirement
|
174
172
|
none: false
|
175
173
|
requirements:
|
176
174
|
- - ">="
|
@@ -181,9 +179,10 @@ dependencies:
|
|
181
179
|
- 2
|
182
180
|
- 3
|
183
181
|
version: 1.2.3
|
184
|
-
|
185
|
-
|
182
|
+
requirement: *id011
|
183
|
+
type: :runtime
|
186
184
|
prerelease: false
|
185
|
+
name: SystemTimer
|
187
186
|
description: Rails syslog logger using TCP instead of UDP
|
188
187
|
email: philippe.lafoucriere@gmail.com
|
189
188
|
executables: []
|
@@ -205,7 +204,6 @@ files:
|
|
205
204
|
- test/helper.rb
|
206
205
|
- test/tcp_syslog_benchmark.rb
|
207
206
|
- test/test_tcp_syslog.rb
|
208
|
-
has_rdoc: true
|
209
207
|
homepage: http://github.com/tech-angels/tcp_syslog
|
210
208
|
licenses:
|
211
209
|
- MIT
|
@@ -235,7 +233,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
235
233
|
requirements: []
|
236
234
|
|
237
235
|
rubyforge_project:
|
238
|
-
rubygems_version: 1.
|
236
|
+
rubygems_version: 1.8.10
|
239
237
|
signing_key:
|
240
238
|
specification_version: 3
|
241
239
|
summary: Send logs to syslog using TCP instead of UDP
|