steno 1.1.0 → 1.2.2
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 +15 -0
- data/README.md +2 -1
- data/lib/steno/config.rb +12 -16
- data/lib/steno/sink.rb +1 -0
- data/lib/steno/sink/base.rb +2 -0
- data/lib/steno/sink/eventlog.rb +46 -0
- data/lib/steno/sink/syslog.rb +56 -53
- data/lib/steno/version.rb +1 -1
- data/spec/unit/config_spec.rb +130 -59
- data/spec/unit/logger_spec.rb +3 -3
- data/spec/unit/sink/eventlog_spec.rb +41 -0
- data/spec/unit/sink/fluentd_spec.rb +1 -1
- data/spec/unit/sink/io_spec.rb +13 -13
- data/spec/unit/sink/syslog_spec.rb +48 -47
- data/steno.gemspec +6 -1
- metadata +8 -21
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ODVjZjY5ZmYzYzM3NGFhMDlkMWYxYWM5MjAzYTI0MThlNzRiMTViOQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
N2ZmNDRjYWVlNjE0ODk0YTk5NTI5NGM1ZTU4MDk5NWZjNmE5Y2UzYg==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZGZjN2I5ZDQ1NGNkNWI3ZDJkNzU1Mzk5YTlmOGNhOWI2NmMyNTJiMGY3ZGEy
|
10
|
+
NmVmNmQ3NDVmNWMzMzIyNjhjN2QwZGI2ZjJiN2Y0NDgyMjQxNzQ0MjFmN2Rm
|
11
|
+
OWUwMjhhMWEyZmNmMTIzODNkYzdkNDkwYjRkY2M1NjRkNDBkNWI=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NTE0ODQwZWI0NTgxYjk1MGU5ZGQyMGI3ZWQxOGM2ZGI5OGMxOTUxNjA1ZGM2
|
14
|
+
N2U5ZTRiNTQwZmVhM2M0OTg3ZDUwNjI5MGFiNTYwNTlkNmEyNmZmMjQxM2Nk
|
15
|
+
YzVjNDA5MjBlYzM3MWQ4ZGIyOGQ0NGY0OTJiNGM5ZWRkOGFjMDg=
|
data/README.md
CHANGED
@@ -33,7 +33,8 @@ Alternatively, Steno can read its configuration from a YAML file in the followin
|
|
33
33
|
logging:
|
34
34
|
file: /some/path # Optional - path a log file
|
35
35
|
max_retries: 3 # Optional - number of times to retry if a file write fails.
|
36
|
-
syslog: some_syslog.id # Optional
|
36
|
+
syslog: some_syslog.id # Optional - only works on *nix systems
|
37
|
+
eventlog: true # Optional - only works on Windows
|
37
38
|
fluentd: # Optional
|
38
39
|
host: fluentd.host
|
39
40
|
port: 9999
|
data/lib/steno/config.rb
CHANGED
@@ -43,13 +43,19 @@ class Steno::Config
|
|
43
43
|
|
44
44
|
if hash[:file]
|
45
45
|
max_retries = hash[:max_retries]
|
46
|
-
opts[:sinks] << Steno::Sink::IO.for_file(hash[:file],
|
47
|
-
:max_retries => max_retries)
|
46
|
+
opts[:sinks] << Steno::Sink::IO.for_file(hash[:file], :max_retries => max_retries)
|
48
47
|
end
|
49
48
|
|
50
|
-
if
|
51
|
-
|
52
|
-
|
49
|
+
if Steno::Sink::WINDOWS
|
50
|
+
if hash[:eventlog]
|
51
|
+
Steno::Sink::Eventlog.instance.open(hash[:eventlog])
|
52
|
+
opts[:sinks] << Steno::Sink::Eventlog.instance
|
53
|
+
end
|
54
|
+
else
|
55
|
+
if hash[:syslog]
|
56
|
+
Steno::Sink::Syslog.instance.open(hash[:syslog])
|
57
|
+
opts[:sinks] << Steno::Sink::Syslog.instance
|
58
|
+
end
|
53
59
|
end
|
54
60
|
|
55
61
|
if hash[:fluentd]
|
@@ -64,17 +70,7 @@ class Steno::Config
|
|
64
70
|
end
|
65
71
|
|
66
72
|
def symbolize_keys(hash)
|
67
|
-
hash
|
68
|
-
symbolized = {}
|
69
|
-
hash.each_key do |key|
|
70
|
-
if !key.is_a? Symbol
|
71
|
-
symbolized[key.to_sym] = hash[key]
|
72
|
-
else
|
73
|
-
symbolized[key] = hash[key]
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
symbolized
|
73
|
+
Hash[hash.each_pair.map { |k, v| [k.to_sym, v] }]
|
78
74
|
end
|
79
75
|
end
|
80
76
|
|
data/lib/steno/sink.rb
CHANGED
data/lib/steno/sink/base.rb
CHANGED
@@ -0,0 +1,46 @@
|
|
1
|
+
if Steno::Sink::WINDOWS
|
2
|
+
require "steno/sink/base"
|
3
|
+
|
4
|
+
require "singleton"
|
5
|
+
require "thread"
|
6
|
+
require 'win32/eventlog'
|
7
|
+
|
8
|
+
class Steno::Sink::Eventlog < Steno::Sink::Base
|
9
|
+
include Singleton
|
10
|
+
|
11
|
+
LOG_LEVEL_MAP = {
|
12
|
+
:fatal => Win32::EventLog::ERROR,
|
13
|
+
:error => Win32::EventLog::ERROR,
|
14
|
+
:warn => Win32::EventLog::WARN,
|
15
|
+
:info => Win32::EventLog::INFO,
|
16
|
+
:debug => Win32::EventLog::INFO,
|
17
|
+
:debug1 => Win32::EventLog::INFO,
|
18
|
+
:debug2 => Win32::EventLog::INFO,
|
19
|
+
}
|
20
|
+
|
21
|
+
def initialize
|
22
|
+
super
|
23
|
+
@eventlog = nil
|
24
|
+
end
|
25
|
+
|
26
|
+
def open()
|
27
|
+
@eventlog = Win32::EventLog::open('Application')
|
28
|
+
end
|
29
|
+
|
30
|
+
def add_record(record)
|
31
|
+
msg = @codec.encode_record(record)
|
32
|
+
pri = LOG_LEVEL_MAP[record.log_level]
|
33
|
+
|
34
|
+
@eventlog.report_event(
|
35
|
+
:source => 'CloudFoundry',
|
36
|
+
:event_type => pri,
|
37
|
+
:data => msg
|
38
|
+
)
|
39
|
+
end
|
40
|
+
|
41
|
+
def flush
|
42
|
+
nil
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
data/lib/steno/sink/syslog.rb
CHANGED
@@ -1,56 +1,59 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
require "
|
5
|
-
require "
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
1
|
+
unless Steno::Sink::WINDOWS
|
2
|
+
require "steno/sink/base"
|
3
|
+
|
4
|
+
require "singleton"
|
5
|
+
require "thread"
|
6
|
+
require "syslog"
|
7
|
+
|
8
|
+
class Steno::Sink::Syslog < Steno::Sink::Base
|
9
|
+
include Singleton
|
10
|
+
|
11
|
+
MAX_MESSAGE_SIZE = 1024 * 3
|
12
|
+
|
13
|
+
LOG_LEVEL_MAP = {
|
14
|
+
:fatal => Syslog::LOG_CRIT,
|
15
|
+
:error => Syslog::LOG_ERR,
|
16
|
+
:warn => Syslog::LOG_WARNING,
|
17
|
+
:info => Syslog::LOG_INFO,
|
18
|
+
:debug => Syslog::LOG_DEBUG,
|
19
|
+
:debug1 => Syslog::LOG_DEBUG,
|
20
|
+
:debug2 => Syslog::LOG_DEBUG,
|
20
21
|
}
|
21
22
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
23
|
+
def initialize
|
24
|
+
super
|
25
|
+
|
26
|
+
@syslog = nil
|
27
|
+
@syslog_lock = Mutex.new
|
28
|
+
end
|
29
|
+
|
30
|
+
def open(identity)
|
31
|
+
@identity = identity
|
32
|
+
@syslog = Syslog.open(@identity, Syslog::LOG_PID, Syslog::LOG_USER)
|
33
|
+
end
|
34
|
+
|
35
|
+
def add_record(record)
|
36
|
+
record = truncate_record(record)
|
37
|
+
msg = @codec.encode_record(record)
|
38
|
+
pri = LOG_LEVEL_MAP[record.log_level]
|
39
|
+
@syslog_lock.synchronize { @syslog.log(pri, "%s", msg) }
|
40
|
+
end
|
41
|
+
|
42
|
+
def flush
|
43
|
+
nil
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def truncate_record(record)
|
49
|
+
return record if record.message.size <= MAX_MESSAGE_SIZE
|
50
|
+
|
51
|
+
truncated = record.message.slice(0..(MAX_MESSAGE_SIZE - 1))
|
52
|
+
truncated << "..."
|
53
|
+
Steno::Record.new(record.source, record.log_level,
|
54
|
+
truncated,
|
55
|
+
[record.file, record.lineno, record.method],
|
56
|
+
record.data)
|
57
|
+
end
|
55
58
|
end
|
56
|
-
end
|
59
|
+
end
|
data/lib/steno/version.rb
CHANGED
data/spec/unit/config_spec.rb
CHANGED
@@ -4,52 +4,106 @@ require "yaml"
|
|
4
4
|
require "spec_helper"
|
5
5
|
|
6
6
|
describe Steno::Config do
|
7
|
-
describe ".from_hash" do
|
8
|
-
before :each do
|
9
|
-
@log_path = "some_file"
|
10
|
-
|
11
|
-
@mock_sink_file = mock("sink")
|
12
|
-
@mock_sink_file.stub(:codec=)
|
13
|
-
Steno::Sink::IO.should_receive(:for_file).with(@log_path,
|
14
|
-
:max_retries => 5)
|
15
|
-
.and_return(@mock_sink_file)
|
16
7
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
.and_return(@mock_sink_syslog)
|
22
|
-
end
|
8
|
+
if Steno::Sink::WINDOWS
|
9
|
+
describe ".from_hash" do
|
10
|
+
before :each do
|
11
|
+
@log_path = "some_file"
|
23
12
|
|
24
|
-
|
25
|
-
|
13
|
+
@mock_sink_file = double("sink")
|
14
|
+
@mock_sink_file.stub(:codec=)
|
15
|
+
Steno::Sink::IO.should_receive(:for_file).with(@log_path,
|
16
|
+
:max_retries => 5)
|
17
|
+
.and_return(@mock_sink_file)
|
26
18
|
|
27
|
-
|
28
|
-
|
29
|
-
|
19
|
+
@mock_sink_eventlog = double("sink")
|
20
|
+
@mock_sink_eventlog.stub(:codec=)
|
21
|
+
@mock_sink_eventlog.should_receive(:open).with("test")
|
22
|
+
Steno::Sink::Eventlog.should_receive(:instance).twice()
|
23
|
+
.and_return(@mock_sink_eventlog)
|
24
|
+
end
|
25
|
+
|
26
|
+
after :each do
|
27
|
+
@config = Steno::Config.from_hash(@hash)
|
28
|
+
|
29
|
+
@config.default_log_level.should == :debug2
|
30
|
+
@config.context.should.class == Steno::Context::Null
|
31
|
+
@config.codec.should.class == Steno::Codec::Json
|
32
|
+
|
33
|
+
@config.sinks.size.should == 2
|
34
|
+
@config.sinks.should =~ [@mock_sink_file, @mock_sink_eventlog]
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should work for symbolized keys" do
|
38
|
+
@hash = {
|
39
|
+
:file => @log_path,
|
40
|
+
:level => "debug2",
|
41
|
+
:default_log_level => "warn",
|
42
|
+
:eventlog => "test",
|
43
|
+
:max_retries => 5,
|
44
|
+
}
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should work for non-symbolized keys" do
|
48
|
+
@hash = {
|
49
|
+
"file" => @log_path,
|
50
|
+
"level" => "debug2",
|
51
|
+
"default_log_level" => "warn",
|
52
|
+
"eventlog" => "test",
|
53
|
+
"max_retries" => 5,
|
54
|
+
}
|
55
|
+
end
|
30
56
|
|
31
|
-
@config.sinks.size.should == 2
|
32
|
-
@config.sinks.should =~ [@mock_sink_file, @mock_sink_syslog]
|
33
57
|
end
|
58
|
+
else
|
59
|
+
describe ".from_hash" do
|
60
|
+
before :each do
|
61
|
+
@log_path = "some_file"
|
62
|
+
|
63
|
+
@mock_sink_file = double("sink")
|
64
|
+
@mock_sink_file.stub(:codec=)
|
65
|
+
Steno::Sink::IO.should_receive(:for_file).with(@log_path,
|
66
|
+
:max_retries => 5)
|
67
|
+
.and_return(@mock_sink_file)
|
34
68
|
|
35
|
-
|
36
|
-
|
37
|
-
:
|
38
|
-
:
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
69
|
+
@mock_sink_syslog = double("sink")
|
70
|
+
@mock_sink_syslog.stub(:codec=)
|
71
|
+
@mock_sink_syslog.should_receive(:open).with("test")
|
72
|
+
Steno::Sink::Syslog.should_receive(:instance).twice()
|
73
|
+
.and_return(@mock_sink_syslog)
|
74
|
+
end
|
75
|
+
|
76
|
+
after :each do
|
77
|
+
@config = Steno::Config.from_hash(@hash)
|
78
|
+
|
79
|
+
@config.default_log_level.should == :debug2
|
80
|
+
@config.context.should.class == Steno::Context::Null
|
81
|
+
@config.codec.should.class == Steno::Codec::Json
|
82
|
+
|
83
|
+
@config.sinks.size.should == 2
|
84
|
+
@config.sinks.should =~ [@mock_sink_file, @mock_sink_syslog]
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should work for symbolized keys" do
|
88
|
+
@hash = {
|
89
|
+
:file => @log_path,
|
90
|
+
:level => "debug2",
|
91
|
+
:default_log_level => "warn",
|
92
|
+
:syslog => "test",
|
93
|
+
:max_retries => 5,
|
94
|
+
}
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should work for non-symbolized keys" do
|
98
|
+
@hash = {
|
99
|
+
"file" => @log_path,
|
100
|
+
"level" => "debug2",
|
101
|
+
"default_log_level" => "warn",
|
102
|
+
"syslog" => "test",
|
103
|
+
"max_retries" => 5,
|
104
|
+
}
|
105
|
+
end
|
44
106
|
|
45
|
-
it "should work for non-symbolized keys" do
|
46
|
-
@hash = {
|
47
|
-
"file" => @log_path,
|
48
|
-
"level" => "debug2",
|
49
|
-
"default_log_level" => "warn",
|
50
|
-
"syslog" => "test",
|
51
|
-
"max_retries" => 5,
|
52
|
-
}
|
53
107
|
end
|
54
108
|
end
|
55
109
|
|
@@ -80,47 +134,64 @@ describe Steno::Config do
|
|
80
134
|
end
|
81
135
|
|
82
136
|
it "should set the default_log_level if a key with the same name is supplied" do
|
83
|
-
write_config(@config_path, {
|
137
|
+
write_config(@config_path, {"level" => "debug2"})
|
84
138
|
Steno::Config.from_file(@config_path).default_log_level.should == :debug2
|
85
139
|
|
86
|
-
write_config(@config_path, {
|
140
|
+
write_config(@config_path, {"default_log_level" => "debug2"})
|
87
141
|
Steno::Config.from_file(@config_path).default_log_level.should == :debug2
|
88
142
|
end
|
89
143
|
|
90
144
|
it "should read the 'level' key if both default_log_level and level are spscified" do
|
91
|
-
write_config(@config_path, {
|
92
|
-
|
145
|
+
write_config(@config_path, {"level" => "debug2",
|
146
|
+
"default_log_level" => "warn"})
|
93
147
|
Steno::Config.from_file(@config_path).default_log_level.should == :debug2
|
94
148
|
end
|
95
149
|
|
96
150
|
it "should add a file sink if the 'file' key is specified" do
|
97
|
-
write_config(@config_path, {
|
98
|
-
mock_sink =
|
151
|
+
write_config(@config_path, {"file" => @log_path, "max_retries" => 2})
|
152
|
+
mock_sink = double("sink")
|
99
153
|
mock_sink.stub(:codec=)
|
100
154
|
|
101
155
|
Steno::Sink::IO.should_receive(:for_file).
|
102
|
-
|
156
|
+
with(@log_path, :max_retries => 2).and_return(mock_sink)
|
103
157
|
config = Steno::Config.from_file(@config_path)
|
104
158
|
config.sinks.size.should == 1
|
105
159
|
config.sinks[0].should == mock_sink
|
106
160
|
end
|
107
161
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
162
|
+
if Steno::Sink::WINDOWS
|
163
|
+
it "should add a event sink if the 'eventlog' key is specified" do
|
164
|
+
write_config(@config_path, {"eventlog" => "test"})
|
165
|
+
mock_sink = double("sink")
|
166
|
+
mock_sink.should_receive(:open).with("test")
|
167
|
+
mock_sink.stub(:codec=)
|
168
|
+
|
169
|
+
Steno::Sink::Eventlog.should_receive(:instance).twice().and_return(mock_sink)
|
170
|
+
|
171
|
+
config = Steno::Config.from_file(@config_path)
|
172
|
+
config.sinks.size.should == 1
|
173
|
+
config.sinks[0].should == mock_sink
|
174
|
+
end
|
175
|
+
else
|
176
|
+
it "should add a syslog sink if the 'syslog' key is specified" do
|
177
|
+
write_config(@config_path, {"syslog" => "test"})
|
178
|
+
mock_sink = double("sink")
|
179
|
+
mock_sink.should_receive(:open).with("test")
|
180
|
+
mock_sink.stub(:codec=)
|
181
|
+
|
182
|
+
Steno::Sink::Syslog.should_receive(:instance).twice().and_return(mock_sink)
|
183
|
+
|
184
|
+
config = Steno::Config.from_file(@config_path)
|
185
|
+
config.sinks.size.should == 1
|
186
|
+
config.sinks[0].should == mock_sink
|
187
|
+
end
|
188
|
+
end
|
113
189
|
|
114
|
-
Steno::Sink::Syslog.should_receive(:instance).twice().and_return(mock_sink)
|
115
190
|
|
116
|
-
config = Steno::Config.from_file(@config_path)
|
117
|
-
config.sinks.size.should == 1
|
118
|
-
config.sinks[0].should == mock_sink
|
119
|
-
end
|
120
191
|
|
121
192
|
it "should add an io sink to stdout if no sinks are explicitly specified in the config file" do
|
122
193
|
write_config(@config_path, {})
|
123
|
-
mock_sink =
|
194
|
+
mock_sink = double("sink")
|
124
195
|
mock_sink.stub(:codec=)
|
125
196
|
|
126
197
|
Steno::Sink::IO.should_receive(:new).with(STDOUT).and_return(mock_sink)
|
@@ -131,7 +202,7 @@ describe Steno::Config do
|
|
131
202
|
end
|
132
203
|
|
133
204
|
it "should merge supplied overrides with the file based config" do
|
134
|
-
write_config(@config_path, {
|
205
|
+
write_config(@config_path, {"default_log_level" => "debug"})
|
135
206
|
|
136
207
|
context = Steno::Context::ThreadLocal.new
|
137
208
|
config = Steno::Config.from_file(@config_path,
|
@@ -144,7 +215,7 @@ describe Steno::Config do
|
|
144
215
|
|
145
216
|
def write_config(path, config)
|
146
217
|
File.open(path, "w+") do |f|
|
147
|
-
f.write(YAML.dump({
|
218
|
+
f.write(YAML.dump({"logging" => config}))
|
148
219
|
end
|
149
220
|
end
|
150
221
|
end
|
data/spec/unit/logger_spec.rb
CHANGED
@@ -44,7 +44,7 @@ describe Steno::Logger do
|
|
44
44
|
|
45
45
|
describe "#log" do
|
46
46
|
it "should not forward any messages for levels that are inactive" do
|
47
|
-
sink =
|
47
|
+
sink = double("sink")
|
48
48
|
sink.should_not_receive(:add_record)
|
49
49
|
|
50
50
|
my_logger = Steno::Logger.new("test", [sink])
|
@@ -53,7 +53,7 @@ describe Steno::Logger do
|
|
53
53
|
end
|
54
54
|
|
55
55
|
it "should forward messages for levels that are active" do
|
56
|
-
sink =
|
56
|
+
sink = double("sink")
|
57
57
|
sink.should_receive(:add_record).with(any_args())
|
58
58
|
|
59
59
|
my_logger = Steno::Logger.new("test", [sink])
|
@@ -74,7 +74,7 @@ describe Steno::Logger do
|
|
74
74
|
end
|
75
75
|
|
76
76
|
it "creates a record with the proper level" do
|
77
|
-
sink =
|
77
|
+
sink = double("sink")
|
78
78
|
Steno::Record.should_receive(:new).with("test", :warn, "message", anything, anything).and_call_original
|
79
79
|
sink.stub(:add_record)
|
80
80
|
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
if Steno::Sink::WINDOWS
|
3
|
+
describe Steno::Sink::Eventlog do
|
4
|
+
let(:level) do
|
5
|
+
Steno::Logger.lookup_level(:info)
|
6
|
+
end
|
7
|
+
|
8
|
+
let(:record) do
|
9
|
+
Steno::Record.new("source", level.name, "message")
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#add_record" do
|
13
|
+
|
14
|
+
it "should append an encoded record with the correct priority" do
|
15
|
+
eventlog = double("Win32::EventLog")
|
16
|
+
Win32::EventLog.should_receive(:open) \
|
17
|
+
.with('Application') \
|
18
|
+
.and_return(eventlog)
|
19
|
+
|
20
|
+
sink = Steno::Sink::Eventlog.instance
|
21
|
+
sink.open
|
22
|
+
|
23
|
+
codec = double("codec")
|
24
|
+
codec.should_receive(:encode_record).with(record).and_return(record.message)
|
25
|
+
sink.codec = codec
|
26
|
+
|
27
|
+
eventlog.should_receive(:report_event).with(:source => "CloudFoundry",
|
28
|
+
:event_type => Win32::EventLog::INFO,
|
29
|
+
:data => record.message)
|
30
|
+
|
31
|
+
sink.add_record(record)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "#flush" do
|
36
|
+
it "should do nothing" do
|
37
|
+
Steno::Sink::Eventlog.instance.flush
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -36,7 +36,7 @@ describe Steno::Sink::IO do
|
|
36
36
|
|
37
37
|
describe "#add_record" do
|
38
38
|
it "should post an record with the correct tag" do
|
39
|
-
fluentd =
|
39
|
+
fluentd = double("fluentd")
|
40
40
|
Fluent::Logger::FluentLogger.should_receive(:new).and_return(fluentd)
|
41
41
|
fluentd.should_receive(:post).with("source", record)
|
42
42
|
sink = Steno::Sink::Fluentd.new()
|
data/spec/unit/sink/io_spec.rb
CHANGED
@@ -11,12 +11,12 @@ describe Steno::Sink::IO do
|
|
11
11
|
|
12
12
|
describe ".for_file" do
|
13
13
|
it "should return a new sink configured to append to the file at path with autosync set to true by default" do
|
14
|
-
mock_handle =
|
14
|
+
mock_handle = double("file handle")
|
15
15
|
|
16
16
|
File.should_receive(:open).with("path", "a+").and_return(mock_handle)
|
17
17
|
mock_handle.should_receive(:sync=).with(true)
|
18
18
|
|
19
|
-
mock_sink =
|
19
|
+
mock_sink = double("sink")
|
20
20
|
Steno::Sink::IO.should_receive(:new).with(mock_handle,
|
21
21
|
:max_retries => 10).
|
22
22
|
and_return(mock_sink)
|
@@ -27,12 +27,12 @@ describe Steno::Sink::IO do
|
|
27
27
|
end
|
28
28
|
|
29
29
|
it "should return a new sink configured to append to the file at path with specified options" do
|
30
|
-
mock_handle =
|
30
|
+
mock_handle = double("file handle")
|
31
31
|
|
32
32
|
File.should_receive(:open).with("path", "a+").and_return(mock_handle)
|
33
33
|
mock_handle.should_receive(:sync=).with(false)
|
34
34
|
|
35
|
-
mock_sink =
|
35
|
+
mock_sink = double("sink")
|
36
36
|
Steno::Sink::IO.should_receive(:new).with(mock_handle,
|
37
37
|
:max_retries => 10).
|
38
38
|
and_return(mock_sink)
|
@@ -46,20 +46,20 @@ describe Steno::Sink::IO do
|
|
46
46
|
|
47
47
|
describe "#add_record" do
|
48
48
|
it "should encode the record and write it to the underlying io object" do
|
49
|
-
codec =
|
49
|
+
codec = double("codec")
|
50
50
|
codec.should_receive(:encode_record).with(record).and_return(record.message)
|
51
51
|
|
52
|
-
io =
|
52
|
+
io = double("io")
|
53
53
|
io.should_receive(:write).with(record.message)
|
54
54
|
|
55
55
|
Steno::Sink::IO.new(io, :codec => codec).add_record(record)
|
56
56
|
end
|
57
57
|
|
58
58
|
it "should by default not retry on IOError" do
|
59
|
-
codec =
|
59
|
+
codec = double("codec")
|
60
60
|
codec.should_receive(:encode_record).with(record).and_return(record.message)
|
61
61
|
|
62
|
-
io =
|
62
|
+
io = double("io")
|
63
63
|
|
64
64
|
io.should_receive(:write).with(record.message).ordered.and_raise(IOError)
|
65
65
|
|
@@ -69,10 +69,10 @@ describe Steno::Sink::IO do
|
|
69
69
|
end
|
70
70
|
|
71
71
|
it "should retry not more than specified number of times on IOError" do
|
72
|
-
codec =
|
72
|
+
codec = double("codec")
|
73
73
|
codec.should_receive(:encode_record).with(record).and_return(record.message)
|
74
74
|
|
75
|
-
io =
|
75
|
+
io = double("io")
|
76
76
|
|
77
77
|
io.should_receive(:write).exactly(3).times.with(record.message).
|
78
78
|
and_raise(IOError)
|
@@ -84,10 +84,10 @@ describe Steno::Sink::IO do
|
|
84
84
|
end
|
85
85
|
|
86
86
|
it "should retry on IOError and succeed" do
|
87
|
-
codec =
|
87
|
+
codec = double("codec")
|
88
88
|
codec.should_receive(:encode_record).with(record).and_return(record.message)
|
89
89
|
|
90
|
-
io =
|
90
|
+
io = double("io")
|
91
91
|
io.should_receive(:write).with(record.message).once.
|
92
92
|
and_raise(IOError)
|
93
93
|
io.should_receive(:write).with(record.message).once.ordered.
|
@@ -102,7 +102,7 @@ describe Steno::Sink::IO do
|
|
102
102
|
|
103
103
|
describe "#flush" do
|
104
104
|
it "should call flush on the underlying io object" do
|
105
|
-
io =
|
105
|
+
io = double("io")
|
106
106
|
io.should_receive(:flush)
|
107
107
|
|
108
108
|
Steno::Sink::IO.new(io).flush
|
@@ -1,73 +1,74 @@
|
|
1
1
|
require "spec_helper"
|
2
|
+
unless Steno::Sink::WINDOWS
|
3
|
+
describe Steno::Sink::Syslog do
|
4
|
+
let(:level) do
|
5
|
+
Steno::Logger.lookup_level(:info)
|
6
|
+
end
|
2
7
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
end
|
7
|
-
|
8
|
-
let(:record) do
|
9
|
-
Steno::Record.new("source", level.name, "message")
|
10
|
-
end
|
8
|
+
let(:record) do
|
9
|
+
Steno::Record.new("source", level.name, "message")
|
10
|
+
end
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
let(:record_with_big_message) do
|
13
|
+
Steno::Record.new("source", level.name,
|
14
|
+
"a" * (Steno::Sink::Syslog::MAX_MESSAGE_SIZE + 1))
|
15
|
+
end
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
describe "#add_record" do
|
18
|
+
it "should append an encoded record with the correct priority" do
|
19
|
+
identity = "test"
|
20
20
|
|
21
|
-
|
22
|
-
|
21
|
+
syslog = double("syslog")
|
22
|
+
Syslog.should_receive(:open) \
|
23
23
|
.with(identity, Syslog::LOG_PID, Syslog::LOG_USER) \
|
24
24
|
.and_return(syslog)
|
25
25
|
|
26
|
-
|
27
|
-
|
26
|
+
sink = Steno::Sink::Syslog.instance
|
27
|
+
sink.open(identity)
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
|
29
|
+
codec = double("codec")
|
30
|
+
codec.should_receive(:encode_record).with(record).and_return(record.message)
|
31
|
+
sink.codec = codec
|
32
32
|
|
33
|
-
|
33
|
+
syslog.should_receive(:log).with(Syslog::LOG_INFO, "%s", record.message)
|
34
34
|
|
35
|
-
|
36
|
-
|
35
|
+
sink.add_record(record)
|
36
|
+
end
|
37
37
|
|
38
|
-
|
39
|
-
|
38
|
+
it "should truncate the record message if its greater than than allowed size" do
|
39
|
+
identity = "test"
|
40
40
|
|
41
|
-
|
42
|
-
|
41
|
+
syslog = double("syslog")
|
42
|
+
Syslog.should_receive(:open) \
|
43
43
|
.with(identity, Syslog::LOG_PID, Syslog::LOG_USER) \
|
44
44
|
.and_return(syslog)
|
45
45
|
|
46
|
-
|
47
|
-
|
46
|
+
sink = Steno::Sink::Syslog.instance
|
47
|
+
sink.open(identity)
|
48
48
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
49
|
+
truncated = record_with_big_message.message.
|
50
|
+
slice(0..(Steno::Sink::Syslog::MAX_MESSAGE_SIZE) - 1)
|
51
|
+
truncated << "..."
|
52
|
+
codec = double("codec")
|
53
|
+
codec.should_receive(:encode_record) do |*args|
|
54
|
+
args.size.should == 1
|
55
|
+
args[0].message.should == truncated
|
56
56
|
|
57
|
-
|
58
|
-
|
57
|
+
next args[0].message
|
58
|
+
end
|
59
59
|
|
60
|
-
|
60
|
+
sink.codec = codec
|
61
61
|
|
62
|
-
|
62
|
+
syslog.should_receive(:log).with(Syslog::LOG_INFO, "%s", truncated)
|
63
63
|
|
64
|
-
|
64
|
+
sink.add_record(record_with_big_message)
|
65
|
+
end
|
65
66
|
end
|
66
|
-
end
|
67
67
|
|
68
|
-
|
69
|
-
|
70
|
-
|
68
|
+
describe "#flush" do
|
69
|
+
it "should do nothing" do
|
70
|
+
Steno::Sink::Syslog.instance.flush
|
71
|
+
end
|
71
72
|
end
|
72
73
|
end
|
73
74
|
end
|
data/steno.gemspec
CHANGED
@@ -28,9 +28,14 @@ Gem::Specification.new do |gem|
|
|
28
28
|
gem.add_dependency("grape")
|
29
29
|
gem.add_dependency("yajl-ruby", "~> 1.0")
|
30
30
|
gem.add_dependency("fluent-logger")
|
31
|
-
|
31
|
+
|
32
32
|
gem.add_development_dependency("ci_reporter")
|
33
33
|
gem.add_development_dependency("rack-test")
|
34
34
|
gem.add_development_dependency("rake")
|
35
35
|
gem.add_development_dependency("rspec")
|
36
|
+
|
37
|
+
if RUBY_PLATFORM=~ /mswin|mingw|cygwin/
|
38
|
+
gem.platform = Gem::Platform::CURRENT
|
39
|
+
gem.add_dependency("win32-eventlog")
|
40
|
+
end
|
36
41
|
end
|
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: steno
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
5
|
-
prerelease:
|
4
|
+
version: 1.2.2
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- mpage
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-06
|
11
|
+
date: 2013-09-06 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: grape
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ! '>='
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -22,7 +20,6 @@ dependencies:
|
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - ! '>='
|
28
25
|
- !ruby/object:Gem::Version
|
@@ -30,7 +27,6 @@ dependencies:
|
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: yajl-ruby
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - ~>
|
36
32
|
- !ruby/object:Gem::Version
|
@@ -38,7 +34,6 @@ dependencies:
|
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - ~>
|
44
39
|
- !ruby/object:Gem::Version
|
@@ -46,7 +41,6 @@ dependencies:
|
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: fluent-logger
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
45
|
- - ! '>='
|
52
46
|
- !ruby/object:Gem::Version
|
@@ -54,7 +48,6 @@ dependencies:
|
|
54
48
|
type: :runtime
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
52
|
- - ! '>='
|
60
53
|
- !ruby/object:Gem::Version
|
@@ -62,7 +55,6 @@ dependencies:
|
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: ci_reporter
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
59
|
- - ! '>='
|
68
60
|
- !ruby/object:Gem::Version
|
@@ -70,7 +62,6 @@ dependencies:
|
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
66
|
- - ! '>='
|
76
67
|
- !ruby/object:Gem::Version
|
@@ -78,7 +69,6 @@ dependencies:
|
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: rack-test
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
73
|
- - ! '>='
|
84
74
|
- !ruby/object:Gem::Version
|
@@ -86,7 +76,6 @@ dependencies:
|
|
86
76
|
type: :development
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
80
|
- - ! '>='
|
92
81
|
- !ruby/object:Gem::Version
|
@@ -94,7 +83,6 @@ dependencies:
|
|
94
83
|
- !ruby/object:Gem::Dependency
|
95
84
|
name: rake
|
96
85
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
86
|
requirements:
|
99
87
|
- - ! '>='
|
100
88
|
- !ruby/object:Gem::Version
|
@@ -102,7 +90,6 @@ dependencies:
|
|
102
90
|
type: :development
|
103
91
|
prerelease: false
|
104
92
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
93
|
requirements:
|
107
94
|
- - ! '>='
|
108
95
|
- !ruby/object:Gem::Version
|
@@ -110,7 +97,6 @@ dependencies:
|
|
110
97
|
- !ruby/object:Gem::Dependency
|
111
98
|
name: rspec
|
112
99
|
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
100
|
requirements:
|
115
101
|
- - ! '>='
|
116
102
|
- !ruby/object:Gem::Version
|
@@ -118,7 +104,6 @@ dependencies:
|
|
118
104
|
type: :development
|
119
105
|
prerelease: false
|
120
106
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
107
|
requirements:
|
123
108
|
- - ! '>='
|
124
109
|
- !ruby/object:Gem::Version
|
@@ -146,6 +131,7 @@ files:
|
|
146
131
|
- lib/steno/record.rb
|
147
132
|
- lib/steno/sink/base.rb
|
148
133
|
- lib/steno/sink/counter.rb
|
134
|
+
- lib/steno/sink/eventlog.rb
|
149
135
|
- lib/steno/sink/fluentd.rb
|
150
136
|
- lib/steno/sink/io.rb
|
151
137
|
- lib/steno/sink/syslog.rb
|
@@ -170,6 +156,7 @@ files:
|
|
170
156
|
- spec/unit/logger_spec.rb
|
171
157
|
- spec/unit/record_spec.rb
|
172
158
|
- spec/unit/sink/counter_spec.rb
|
159
|
+
- spec/unit/sink/eventlog_spec.rb
|
173
160
|
- spec/unit/sink/fluentd_spec.rb
|
174
161
|
- spec/unit/sink/io_spec.rb
|
175
162
|
- spec/unit/sink/syslog_spec.rb
|
@@ -178,27 +165,26 @@ files:
|
|
178
165
|
- steno.gemspec
|
179
166
|
homepage: http://www.cloudfoundry.org
|
180
167
|
licenses: []
|
168
|
+
metadata: {}
|
181
169
|
post_install_message:
|
182
170
|
rdoc_options: []
|
183
171
|
require_paths:
|
184
172
|
- lib
|
185
173
|
required_ruby_version: !ruby/object:Gem::Requirement
|
186
|
-
none: false
|
187
174
|
requirements:
|
188
175
|
- - ! '>='
|
189
176
|
- !ruby/object:Gem::Version
|
190
177
|
version: '0'
|
191
178
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
192
|
-
none: false
|
193
179
|
requirements:
|
194
180
|
- - ! '>='
|
195
181
|
- !ruby/object:Gem::Version
|
196
182
|
version: '0'
|
197
183
|
requirements: []
|
198
184
|
rubyforge_project:
|
199
|
-
rubygems_version:
|
185
|
+
rubygems_version: 2.0.7
|
200
186
|
signing_key:
|
201
|
-
specification_version:
|
187
|
+
specification_version: 4
|
202
188
|
summary: A logging library.
|
203
189
|
test_files:
|
204
190
|
- spec/spec_helper.rb
|
@@ -215,6 +201,7 @@ test_files:
|
|
215
201
|
- spec/unit/logger_spec.rb
|
216
202
|
- spec/unit/record_spec.rb
|
217
203
|
- spec/unit/sink/counter_spec.rb
|
204
|
+
- spec/unit/sink/eventlog_spec.rb
|
218
205
|
- spec/unit/sink/fluentd_spec.rb
|
219
206
|
- spec/unit/sink/io_spec.rb
|
220
207
|
- spec/unit/sink/syslog_spec.rb
|