termite 0.0.10 → 0.0.20
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +91 -37
- data/TODO +8 -2
- data/lib/termite.rb +266 -91
- data/lib/termite/hastur_logger.rb +41 -0
- data/lib/termite/syslog_logger.rb +47 -0
- data/lib/termite/version.rb +1 -1
- data/lib/termite/version.rb~ +3 -0
- data/termite.gemspec +2 -1
- data/test/ecology_log_test.rb +4 -3
- data/test/extra_logger_test.rb +5 -4
- data/test/hastur_logger_test.rb +58 -0
- data/test/level_test.rb +53 -0
- data/test/rescue_test.rb +8 -10
- data/test/sinks_test.rb +183 -0
- data/test/stderr_log_test.rb +11 -6
- data/test/termite_logger_test.rb +24 -15
- data/test/termite_subclass_test.rb +1 -1
- data/test/test_helper.rb +14 -9
- metadata +123 -74
- data/Gemfile.lock +0 -29
@@ -0,0 +1,41 @@
|
|
1
|
+
module Termite
|
2
|
+
class HasturLogger
|
3
|
+
def initialize(socket, addr, port, labels)
|
4
|
+
@socket, @addr, @port = socket, addr, port
|
5
|
+
@labels = labels || {}
|
6
|
+
end
|
7
|
+
|
8
|
+
def to_usec(time)
|
9
|
+
(time.to_f * 1_000_000).round
|
10
|
+
end
|
11
|
+
|
12
|
+
def send_message(severity, raw_message, app_data, time=Time.now, data='{}')
|
13
|
+
severity = Logger::LOGGER_LEVEL_MAP.invert[severity].to_s
|
14
|
+
tid = Ecology.thread_id(::Thread.current)
|
15
|
+
hostname = Socket.gethostname
|
16
|
+
pid = Process.pid
|
17
|
+
application, component = app_data[:app], app_data[:component]
|
18
|
+
|
19
|
+
message = {
|
20
|
+
:_route => :log,
|
21
|
+
:timestamp => to_usec(time),
|
22
|
+
:message => raw_message
|
23
|
+
}
|
24
|
+
|
25
|
+
labels = {
|
26
|
+
:severity => severity,
|
27
|
+
:pid => pid,
|
28
|
+
:tid => tid,
|
29
|
+
:app => application,
|
30
|
+
:component => component,
|
31
|
+
:hostname => hostname
|
32
|
+
}
|
33
|
+
|
34
|
+
labels.merge!(MultiJson.decode(data)) if data && data != '{}'
|
35
|
+
labels.merge!(@labels) if @labels && !@labels.empty?
|
36
|
+
message[:labels] = labels
|
37
|
+
|
38
|
+
@socket.send MultiJson.encode(message), 0, @addr, @port
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require "syslog"
|
2
|
+
|
3
|
+
module Termite
|
4
|
+
class SyslogLogger
|
5
|
+
def initialize(socket, server_addr, server_port, transport)
|
6
|
+
@socket, @server_addr, @server_port, @transport = socket, server_addr, server_port, transport
|
7
|
+
end
|
8
|
+
|
9
|
+
def send_message(severity, full_message, app_data, time=Time.now, data='{}')
|
10
|
+
tid = Ecology.thread_id(::Thread.current)
|
11
|
+
day = time.strftime("%b %d").sub(/0(\d)/, ' \\1')
|
12
|
+
time_of_day = time.strftime("%T")
|
13
|
+
hostname = Socket.gethostname
|
14
|
+
application = app_data[:combined] || app_data[:app]
|
15
|
+
|
16
|
+
# Convert Ruby log level to syslog severity
|
17
|
+
tag = Syslog::LOG_LOCAL6 + Logger::SYSLOG_SEVERITY_MAP[Logger::LEVEL_SYSLOG_MAP[severity]]
|
18
|
+
syslog_string = "<#{tag}>#{day} #{time_of_day} #{hostname} #{application} [#{Process.pid}]: [#{tid}] "
|
19
|
+
|
20
|
+
# ruby_severity is the Ruby Logger severity as a symbol
|
21
|
+
ruby_severity = Logger::LOGGER_LEVEL_MAP.invert[severity]
|
22
|
+
|
23
|
+
full_message.split("\n").each do |line|
|
24
|
+
syslog_message = "#{line} #{data}"
|
25
|
+
case @transport
|
26
|
+
when "UDP"
|
27
|
+
send_udp(severity, syslog_string, syslog_message, application)
|
28
|
+
when "syscall", "libc"
|
29
|
+
send_libc(severity, syslog_message, application) rescue nil
|
30
|
+
else
|
31
|
+
send_libc(severity, syslog_message, application) rescue
|
32
|
+
send_udp(severity, syslog_string, syslog_message, application)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def send_udp(severity, syslog_string, syslog_message, application)
|
38
|
+
@socket.send(syslog_string + syslog_message, 0, @server_addr, @server_port) rescue nil
|
39
|
+
end
|
40
|
+
|
41
|
+
def send_libc(severity, syslog_message, application)
|
42
|
+
Syslog.open(application, Syslog::LOG_PID | Syslog::LOG_CONS) do |s|
|
43
|
+
s.send(Logger::LEVEL_SYSLOG_MAP[severity], syslog_message)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/termite/version.rb
CHANGED
data/termite.gemspec
CHANGED
@@ -25,8 +25,9 @@ EOS
|
|
25
25
|
|
26
26
|
s.require_paths = ["lib"]
|
27
27
|
|
28
|
-
s.add_dependency "multi_json"
|
29
28
|
s.add_dependency "ecology", "~>0.0.6"
|
29
|
+
s.add_dependency "multi_json"
|
30
|
+
s.add_dependency "rainbow", "~> 1.1.3"
|
30
31
|
|
31
32
|
s.add_development_dependency "bundler", "~> 1.0.10"
|
32
33
|
s.add_development_dependency "scope", "~> 0.2.1"
|
data/test/ecology_log_test.rb
CHANGED
@@ -29,17 +29,17 @@ ECOLOGY_CONTENTS
|
|
29
29
|
end
|
30
30
|
|
31
31
|
should "send back extra JSON data and a default component when specified" do
|
32
|
-
expect_add(
|
32
|
+
expect_add(2, 'oh no! {"app_group":"SuperSpiffyGroup","precedence":7}', :application => "MyApp:SplodgingLib")
|
33
33
|
@logger.fatal("oh no!")
|
34
34
|
end
|
35
35
|
|
36
36
|
should "allow overriding the default component" do
|
37
|
-
expect_add(
|
37
|
+
expect_add(2, 'oh no! {"app_group":"SuperSpiffyGroup","precedence":7}', :application => "MyApp:SpliyingLib")
|
38
38
|
@logger.fatal("oh no!", {}, :component => "SpliyingLib")
|
39
39
|
end
|
40
40
|
|
41
41
|
should "allow overriding the default component with nothing" do
|
42
|
-
expect_add(
|
42
|
+
expect_add(2, 'oh no! {"app_group":"SuperSpiffyGroup","precedence":7}', :application => "MyApp")
|
43
43
|
@logger.fatal("oh no!", {}, :component => nil)
|
44
44
|
end
|
45
45
|
end
|
@@ -53,6 +53,7 @@ ECOLOGY_CONTENTS
|
|
53
53
|
should "override parameters passed to Termite Logger" do
|
54
54
|
log_mock = mock("Ruby Logger")
|
55
55
|
::Logger.expects(:new).with("/tmp/bobo.txt", 10, 1024000).returns(log_mock)
|
56
|
+
::Logger.expects(:new).with("/var/lib/sam.log", "daily", 1048576).returns(log_mock)
|
56
57
|
Termite::Logger.new("/var/lib/sam.log", "daily")
|
57
58
|
end
|
58
59
|
end
|
data/test/extra_logger_test.rb
CHANGED
@@ -11,15 +11,16 @@ class TermiteExtraLoggerTest < Scope::TestCase
|
|
11
11
|
setup do
|
12
12
|
@logger = Termite::Logger.new("/tmp/test_log_output.txt") # Test with output file
|
13
13
|
@logger.level = Logger::DEBUG
|
14
|
-
|
14
|
+
Syslog.expects(:open)
|
15
15
|
@mock_logger_1 = mock()
|
16
|
+
@mock_logger_2 = mock()
|
16
17
|
@logger.add_logger(@mock_logger_1)
|
17
18
|
@logger.add_logger(@mock_logger_2)
|
18
19
|
end
|
19
20
|
|
20
|
-
should "correctly send logs to
|
21
|
-
@mock_logger_1.expects(
|
22
|
-
@mock_logger_2.expects(
|
21
|
+
should "correctly send logs to additional loggers" do
|
22
|
+
@mock_logger_1.expects(:<<).with("foo!")
|
23
|
+
@mock_logger_2.expects(:<<).with("foo!")
|
23
24
|
@logger.add(Logger::FATAL, "foo!", {})
|
24
25
|
end
|
25
26
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "test_helper.rb")
|
2
|
+
|
3
|
+
class HasturLoggerTest < Scope::TestCase
|
4
|
+
|
5
|
+
def expect_send(raw_message, data)
|
6
|
+
message = {
|
7
|
+
:_route => :log,
|
8
|
+
:timestamp => @time_usec,
|
9
|
+
:message => raw_message
|
10
|
+
}
|
11
|
+
|
12
|
+
labels = {
|
13
|
+
:severity => "warn",
|
14
|
+
:pid => @pid,
|
15
|
+
:tid => @tid,
|
16
|
+
:app => @app_data[:app],
|
17
|
+
:component => @app_data[:component],
|
18
|
+
:hostname => @host
|
19
|
+
}
|
20
|
+
|
21
|
+
message[:labels] = labels.merge(MultiJson.decode(data)).merge(@labels)
|
22
|
+
json_message = MultiJson.encode(message)
|
23
|
+
|
24
|
+
@socket.expects(:send).with(json_message, 0, @addr, @port)
|
25
|
+
end
|
26
|
+
|
27
|
+
context "with a hastur logger" do
|
28
|
+
setup do
|
29
|
+
@socket = mock("UDP Socket")
|
30
|
+
@labels = {"hi" => "lo", "fast" => "slo"}
|
31
|
+
@addr = "127.0.0.1"
|
32
|
+
@port = 8125
|
33
|
+
@logger = Termite::HasturLogger.new(@socket, @addr, @port, @labels)
|
34
|
+
end
|
35
|
+
|
36
|
+
context "will send a message" do
|
37
|
+
setup do
|
38
|
+
@severity = 2
|
39
|
+
@raw_message = "message"
|
40
|
+
@app_data = {:combined => "app:comp", :app => "app", :component => "comp"}
|
41
|
+
@pid = 123
|
42
|
+
@tid = "main"
|
43
|
+
@time = 345
|
44
|
+
@time_usec = 345_000_000
|
45
|
+
@host = "host"
|
46
|
+
Ecology.stubs(:thread_id).returns(@tid)
|
47
|
+
Process.stubs(:pid).returns(@pid)
|
48
|
+
Time.stubs(:now).returns(@time)
|
49
|
+
Socket.stubs(:gethostname).returns(@host)
|
50
|
+
end
|
51
|
+
|
52
|
+
should "send back extra JSON data and labels when specified" do
|
53
|
+
expect_send("oh no!", '{"app_group":"SuperSpiffyGroup","precedence":7}')
|
54
|
+
@logger.send_message(@severity, "oh no!", @app_data, Time.now, '{"app_group":"SuperSpiffyGroup","precedence":7}')
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/test/level_test.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "test_helper.rb")
|
2
|
+
|
3
|
+
class LevelTest < Scope::TestCase
|
4
|
+
context "without termite ecology" do
|
5
|
+
setup do
|
6
|
+
@logger = Termite::Logger.new(:level => "error")
|
7
|
+
end
|
8
|
+
|
9
|
+
should "correctly set level to error" do
|
10
|
+
assert_equal Logger::ERROR, @logger.level
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
context "with termite ecology" do
|
15
|
+
setup do
|
16
|
+
Ecology.reset
|
17
|
+
|
18
|
+
set_up_ecology <<ECOLOGY_TEXT
|
19
|
+
{
|
20
|
+
"application": "foo_app",
|
21
|
+
"logging":
|
22
|
+
{
|
23
|
+
"default_component": "whatcomponent",
|
24
|
+
"level": "info"
|
25
|
+
}
|
26
|
+
}
|
27
|
+
ECOLOGY_TEXT
|
28
|
+
end
|
29
|
+
|
30
|
+
context "and no overrides" do
|
31
|
+
setup do
|
32
|
+
@logger = Termite::Logger.new
|
33
|
+
end
|
34
|
+
|
35
|
+
should "correctly have level set at info" do
|
36
|
+
assert_equal Logger::INFO, @logger.level
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "and debug overriding at env level" do
|
41
|
+
setup do
|
42
|
+
ENV["TERMITE_DEBUG"] = "1"
|
43
|
+
@logger = Termite::Logger.new()
|
44
|
+
end
|
45
|
+
|
46
|
+
should "correctly have level set at debug" do
|
47
|
+
assert_equal Logger::DEBUG, @logger.level
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
data/test/rescue_test.rb
CHANGED
@@ -9,34 +9,32 @@ class RescueTest < Scope::TestCase
|
|
9
9
|
end
|
10
10
|
|
11
11
|
should "continue even if all loggers raise errors" do
|
12
|
-
# First,
|
13
|
-
@logger.socket.expects(:send).raises(StandardError, "You suck!")
|
14
|
-
|
15
|
-
# Termite should fall back to trying Ruby Syslog...
|
12
|
+
# First, termite should try Ruby Syslog...
|
16
13
|
syslog_mock = mock("Syslog connection")
|
17
14
|
Syslog.expects(:open).yields(syslog_mock)
|
18
|
-
syslog_mock.expects(:error).with("UDP syslog failed! Falling back to libc syslog!")
|
19
15
|
syslog_mock.expects(:crit).raises(StandardError, "You suck even more than that!")
|
20
16
|
|
21
|
-
#
|
22
|
-
@logger.
|
17
|
+
# Then, it will fal back to UDP and raise an error
|
18
|
+
@logger.socket.expects(:send).raises(StandardError, "You suck!")
|
19
|
+
|
20
|
+
# And it should still try to write to a file logger - this is now just an extra logger
|
21
|
+
# @logger.file_logger.expects(:fatal).raises(StandardError, "You suck lots!")
|
23
22
|
|
24
23
|
extra_logger = mock("Additional logger")
|
25
24
|
@logger.add_logger(extra_logger)
|
26
25
|
# And it should try to write to any extra loggers
|
27
|
-
extra_logger.expects(
|
26
|
+
extra_logger.expects(:<<).raises(StandardError, "You suck constantly!")
|
28
27
|
|
29
28
|
# And yet, nothing should be raised to the outside world
|
30
29
|
begin
|
31
30
|
@logger.fatal("Woe is me!")
|
32
31
|
assert true, "Nothing was raised! Yay!"
|
33
32
|
rescue Exception
|
34
|
-
flunk "Logging an event raised an assertion outside the logger!"
|
33
|
+
flunk "Logging an event raised an assertion outside the logger!"
|
35
34
|
end
|
36
35
|
end
|
37
36
|
|
38
37
|
should "continue even if internal logic gives an error" do
|
39
|
-
#Time.expects(:now).raises(Exception.new "You suck!")
|
40
38
|
Ecology.expects(:thread_id).raises(Exception.new "Ecology thread_id dies!")
|
41
39
|
begin
|
42
40
|
@logger.fatal("Woe is me!")
|
data/test/sinks_test.rb
ADDED
@@ -0,0 +1,183 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "test_helper.rb")
|
2
|
+
|
3
|
+
class SinksTest < Scope::TestCase
|
4
|
+
context "with a hastur sink ecology" do
|
5
|
+
setup do
|
6
|
+
Ecology.reset
|
7
|
+
|
8
|
+
set_up_ecology <<ECOLOGY_CONTENTS
|
9
|
+
{
|
10
|
+
"application": "MyApp",
|
11
|
+
"logging": {
|
12
|
+
"default_component": "SplodgingLib",
|
13
|
+
"extra_json_fields": {
|
14
|
+
"app_group": "SuperSpiffyGroup",
|
15
|
+
"precedence": 7
|
16
|
+
},
|
17
|
+
"console_print": "off",
|
18
|
+
"sinks": [
|
19
|
+
{
|
20
|
+
"type": "syslog",
|
21
|
+
"transport": "UDP"
|
22
|
+
},
|
23
|
+
{
|
24
|
+
"type": "hastur",
|
25
|
+
"labels": {
|
26
|
+
"hi": "lo",
|
27
|
+
"fast": "slo"
|
28
|
+
}
|
29
|
+
}
|
30
|
+
]
|
31
|
+
}
|
32
|
+
}
|
33
|
+
ECOLOGY_CONTENTS
|
34
|
+
end
|
35
|
+
|
36
|
+
context "with a default termite logger" do
|
37
|
+
setup do
|
38
|
+
@hastur_mock = mock("Hastur Logger")
|
39
|
+
Termite::HasturLogger.expects(:new).returns(@hastur_mock)
|
40
|
+
@logger = Termite::Logger.new
|
41
|
+
end
|
42
|
+
|
43
|
+
should "send back extra JSON data and a default component when specified" do
|
44
|
+
@hastur_mock.expects(:send_message).with(4, 'oh no!', {:combined => "MyApp:SplodgingLib", :app => "MyApp", :component => "SplodgingLib"}, anything, '{"app_group":"SuperSpiffyGroup","precedence":7}')
|
45
|
+
@logger.fatal("oh no!")
|
46
|
+
end
|
47
|
+
|
48
|
+
should "allow overriding the default component" do
|
49
|
+
@hastur_mock.expects(:send_message).with(4, 'oh no!', {:combined => "MyApp:SpliyingLib", :app => "MyApp", :component => "SpliyingLib"}, anything, '{"app_group":"SuperSpiffyGroup","precedence":7}')
|
50
|
+
@logger.fatal("oh no!", {}, :component => "SpliyingLib")
|
51
|
+
end
|
52
|
+
|
53
|
+
should "allow overriding the default component with nothing" do
|
54
|
+
@hastur_mock.expects(:send_message).with(4, 'oh no!', {:combined => nil, :app => "MyApp", :component => nil}, anything, '{"app_group":"SuperSpiffyGroup","precedence":7}')
|
55
|
+
@logger.fatal("oh no!", {}, :component => nil)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context "with a sinked UDP ecology" do
|
61
|
+
setup do
|
62
|
+
Ecology.reset
|
63
|
+
|
64
|
+
set_up_ecology <<ECOLOGY_CONTENTS
|
65
|
+
{
|
66
|
+
"application": "MyApp",
|
67
|
+
"logging": {
|
68
|
+
"default_component": "SplodgingLib",
|
69
|
+
"extra_json_fields": {
|
70
|
+
"app_group": "SuperSpiffyGroup",
|
71
|
+
"precedence": 7
|
72
|
+
},
|
73
|
+
"console_print": "off",
|
74
|
+
"sinks": [
|
75
|
+
{
|
76
|
+
"type": "syslog",
|
77
|
+
"transport": "UDP"
|
78
|
+
}
|
79
|
+
]
|
80
|
+
}
|
81
|
+
}
|
82
|
+
ECOLOGY_CONTENTS
|
83
|
+
end
|
84
|
+
|
85
|
+
context "with a default termite logger" do
|
86
|
+
setup do
|
87
|
+
@logger = Termite::Logger.new
|
88
|
+
end
|
89
|
+
|
90
|
+
should "send back extra JSON data and a default component when specified" do
|
91
|
+
expect_udp(@logger.socket, 2, 'oh no! {"app_group":"SuperSpiffyGroup","precedence":7}', :application => "MyApp:SplodgingLib")
|
92
|
+
@logger.fatal("oh no!")
|
93
|
+
end
|
94
|
+
|
95
|
+
should "allow overriding the default component" do
|
96
|
+
expect_udp(@logger.socket, 2, 'oh no! {"app_group":"SuperSpiffyGroup","precedence":7}', :application => "MyApp:SpliyingLib")
|
97
|
+
@logger.fatal("oh no!", {}, :component => "SpliyingLib")
|
98
|
+
end
|
99
|
+
|
100
|
+
should "allow overriding the default component with nothing" do
|
101
|
+
expect_udp(@logger.socket, 2, 'oh no! {"app_group":"SuperSpiffyGroup","precedence":7}', :application => "MyApp")
|
102
|
+
@logger.fatal("oh no!", {}, :component => nil)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
context "with a sinked ecology" do
|
108
|
+
setup do
|
109
|
+
Ecology.reset
|
110
|
+
|
111
|
+
set_up_ecology <<ECOLOGY_CONTENTS
|
112
|
+
{
|
113
|
+
"application": "MyApp",
|
114
|
+
"logging": {
|
115
|
+
"default_component": "SplodgingLib",
|
116
|
+
"extra_json_fields": {
|
117
|
+
"app_group": "SuperSpiffyGroup",
|
118
|
+
"precedence": 7
|
119
|
+
},
|
120
|
+
"console_print": "off",
|
121
|
+
"sinks": [
|
122
|
+
{
|
123
|
+
"type": "stdout",
|
124
|
+
"color": "green",
|
125
|
+
"min_level": "debug",
|
126
|
+
"max_level": "warn"
|
127
|
+
},
|
128
|
+
{
|
129
|
+
"type": "stderr",
|
130
|
+
"color": "red",
|
131
|
+
"min_level": "error"
|
132
|
+
},
|
133
|
+
{
|
134
|
+
"type": "file",
|
135
|
+
"filename": "/tmp/bobo.txt",
|
136
|
+
"min_level": "warn",
|
137
|
+
"shift_age": 10,
|
138
|
+
"shift_size": 1024000
|
139
|
+
},
|
140
|
+
{
|
141
|
+
"type": "syslog"
|
142
|
+
}
|
143
|
+
]
|
144
|
+
}
|
145
|
+
}
|
146
|
+
ECOLOGY_CONTENTS
|
147
|
+
end
|
148
|
+
|
149
|
+
context "with a default termite logger" do
|
150
|
+
setup do
|
151
|
+
@logger = Termite::Logger.new
|
152
|
+
end
|
153
|
+
|
154
|
+
should "send back extra JSON data and a default component when specified" do
|
155
|
+
expect_add(2, 'oh no! {"app_group":"SuperSpiffyGroup","precedence":7}', :application => "MyApp:SplodgingLib")
|
156
|
+
@logger.fatal("oh no!")
|
157
|
+
end
|
158
|
+
|
159
|
+
should "allow overriding the default component" do
|
160
|
+
expect_add(2, 'oh no! {"app_group":"SuperSpiffyGroup","precedence":7}', :application => "MyApp:SpliyingLib")
|
161
|
+
@logger.fatal("oh no!", {}, :component => "SpliyingLib")
|
162
|
+
end
|
163
|
+
|
164
|
+
should "allow overriding the default component with nothing" do
|
165
|
+
expect_add(2, 'oh no! {"app_group":"SuperSpiffyGroup","precedence":7}', :application => "MyApp")
|
166
|
+
@logger.fatal("oh no!", {}, :component => nil)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
should "pass initialize parameters to Ruby Logger" do
|
171
|
+
log_mock = mock("Ruby Logger")
|
172
|
+
::Logger.expects(:new).with("/tmp/bobo.txt", 10, 1024000).returns(log_mock)
|
173
|
+
Termite::Logger.new
|
174
|
+
end
|
175
|
+
|
176
|
+
should "override parameters passed to Termite Logger" do
|
177
|
+
log_mock = mock("Ruby Logger")
|
178
|
+
::Logger.expects(:new).with("/tmp/bobo.txt", 10, 1024000).returns(log_mock)
|
179
|
+
::Logger.expects(:new).with("/var/lib/sam.log", "daily", 1048576).returns(log_mock)
|
180
|
+
Termite::Logger.new("/var/lib/sam.log", "daily")
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|