syslogger 1.6.4 → 1.6.5
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 +4 -4
- data/.gitignore +26 -0
- data/.travis.yml +9 -0
- data/CHANGELOG.md +9 -0
- data/Gemfile +3 -0
- data/LICENSE +17 -16
- data/README.md +43 -0
- data/Rakefile +2 -13
- data/lib/syslogger.rb +61 -46
- data/lib/syslogger/version.rb +3 -0
- data/spec/spec_helper.rb +18 -2
- data/spec/syslogger_spec.rb +354 -280
- data/syslogger.gemspec +27 -0
- metadata +36 -16
- data/README.rdoc +0 -57
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 10037fda0f96cf2e4073a7b721083696f1b30404
|
4
|
+
data.tar.gz: e483814598921fe12e703c5b519abe904121b290
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4eff79de93b2c28c2ec407d6d4675f815698894f0b4f2ceb79e9a7f0d96e54655310f96ccfa69244f3c742daa55e242491a09499a9f41827b40db969672d5be3
|
7
|
+
data.tar.gz: 66deff30ebd629b8d0251981b0c8f4530c72764bb0c56bdfdc97ba5ca403993626e098f106717020dbdc1abe0287dd3b53d3507bd33c75a36483a69035748872
|
data/.gitignore
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
## MAC OS
|
2
|
+
.DS_Store
|
3
|
+
|
4
|
+
## TEXTMATE
|
5
|
+
*.tmproj
|
6
|
+
tmtags
|
7
|
+
|
8
|
+
## EMACS
|
9
|
+
*~
|
10
|
+
\#*
|
11
|
+
.\#*
|
12
|
+
|
13
|
+
## VIM
|
14
|
+
*.swp
|
15
|
+
|
16
|
+
## PROJECT::GENERAL
|
17
|
+
coverage
|
18
|
+
rdoc
|
19
|
+
pkg
|
20
|
+
Gemfile.lock
|
21
|
+
|
22
|
+
## PROJECT::SPECIFIC
|
23
|
+
|
24
|
+
## RVM
|
25
|
+
.rvmrc
|
26
|
+
|
data/.travis.yml
ADDED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
# CHANGELOG
|
2
|
+
|
3
|
+
## 1.6.5
|
4
|
+
|
5
|
+
* Merge [Fixnum type is deprecated](https://github.com/crohr/syslogger/pull/42) (thanks thesmart)
|
6
|
+
* Merge [Add #puts method to Syslogger](https://github.com/crohr/syslogger/pull/38) (thanks VuokkoVuorinnen)
|
7
|
+
* Fix [Severity is passed as an array in the call to the formatter](https://github.com/crohr/syslogger/issues/35)
|
8
|
+
* Save uniq tags in the thread
|
9
|
+
* Improve tests
|
data/Gemfile
ADDED
data/LICENSE
CHANGED
@@ -1,20 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
1
3
|
Copyright (c) 2010 Cyril Rohr, INRIA Rennes-Bretagne Atlantique
|
2
4
|
|
3
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
the following conditions:
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
10
11
|
|
11
|
-
The above copyright notice and this permission notice shall be
|
12
|
-
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
13
14
|
|
14
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
OF
|
20
|
-
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
## Syslogger
|
2
|
+
|
3
|
+
[](https://github.com/crohr/syslogger/blob/master/LICENSE)
|
4
|
+
[](https://github.com/crohr/syslogger/releases/latest)
|
5
|
+
[](https://rubygems.org/gems/syslogger)
|
6
|
+
[](https://rubygems.org/gems/syslogger)
|
7
|
+
[](https://travis-ci.org/crohr/syslogger)
|
8
|
+
|
9
|
+
A drop-in replacement for the standard Logger Ruby library, that logs to the syslog instead of a log file.
|
10
|
+
Contrary to the SyslogLogger library, you can specify the facility and the syslog options.
|
11
|
+
|
12
|
+
## Installation
|
13
|
+
|
14
|
+
```sh
|
15
|
+
$ gem install syslogger
|
16
|
+
```
|
17
|
+
|
18
|
+
## Usage
|
19
|
+
|
20
|
+
```ruby
|
21
|
+
require 'syslogger'
|
22
|
+
|
23
|
+
# Will send all messages to the local0 facility, adding the process id in the message
|
24
|
+
logger = Syslogger.new("app_name", Syslog::LOG_PID, Syslog::LOG_LOCAL0)
|
25
|
+
|
26
|
+
# Optionally split messages to the specified number of bytes
|
27
|
+
logger.max_octets = 480
|
28
|
+
|
29
|
+
# Send messages that are at least of the Logger::INFO level
|
30
|
+
logger.level = Logger::INFO # use Logger levels
|
31
|
+
|
32
|
+
logger.debug "will not appear"
|
33
|
+
logger.info "will appear"
|
34
|
+
logger.warn "will appear"
|
35
|
+
```
|
36
|
+
|
37
|
+
## Contributions
|
38
|
+
|
39
|
+
See <https://github.com/crohr/syslogger/contributors>.
|
40
|
+
|
41
|
+
## Copyright
|
42
|
+
|
43
|
+
Copyright (c) 2010 Cyril Rohr, INRIA Rennes-Bretagne Atlantique. See LICENSE for details.
|
data/Rakefile
CHANGED
@@ -1,17 +1,8 @@
|
|
1
|
-
require 'bundler'
|
2
|
-
Bundler.require
|
3
|
-
|
4
1
|
require 'rspec/core/rake_task'
|
5
2
|
require 'rdoc/task'
|
6
3
|
|
7
|
-
|
8
|
-
|
9
|
-
RSpec::Core::RakeTask.new(:spec) do |spec|
|
10
|
-
end
|
11
|
-
|
12
|
-
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
13
|
-
spec.rcov = true
|
14
|
-
end
|
4
|
+
RSpec::Core::RakeTask.new(:spec)
|
5
|
+
task default: :spec
|
15
6
|
|
16
7
|
Rake::RDocTask.new do |rdoc|
|
17
8
|
require 'syslogger'
|
@@ -20,5 +11,3 @@ Rake::RDocTask.new do |rdoc|
|
|
20
11
|
rdoc.rdoc_files.include('README*')
|
21
12
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
22
13
|
end
|
23
|
-
|
24
|
-
task :default => :spec
|
data/lib/syslogger.rb
CHANGED
@@ -4,21 +4,19 @@ require 'thread'
|
|
4
4
|
|
5
5
|
class Syslogger
|
6
6
|
|
7
|
-
VERSION = "1.6.4"
|
8
|
-
|
9
7
|
MUTEX = Mutex.new
|
10
8
|
|
11
9
|
attr_reader :level, :ident, :options, :facility, :max_octets
|
12
10
|
attr_accessor :formatter
|
13
11
|
|
14
12
|
MAPPING = {
|
15
|
-
Logger::DEBUG
|
16
|
-
Logger::INFO
|
17
|
-
Logger::WARN
|
18
|
-
Logger::ERROR
|
19
|
-
Logger::FATAL
|
13
|
+
Logger::DEBUG => Syslog::LOG_DEBUG,
|
14
|
+
Logger::INFO => Syslog::LOG_INFO,
|
15
|
+
Logger::WARN => Syslog::LOG_WARNING,
|
16
|
+
Logger::ERROR => Syslog::LOG_ERR,
|
17
|
+
Logger::FATAL => Syslog::LOG_CRIT,
|
20
18
|
Logger::UNKNOWN => Syslog::LOG_ALERT
|
21
|
-
}
|
19
|
+
}.freeze
|
22
20
|
|
23
21
|
#
|
24
22
|
# Initializes default options for the logger
|
@@ -45,11 +43,11 @@ class Syslogger
|
|
45
43
|
# logger.info "my_subapp" { "Some lazily computed message" }
|
46
44
|
#
|
47
45
|
def initialize(ident = $0, options = Syslog::LOG_PID | Syslog::LOG_CONS, facility = nil)
|
48
|
-
@ident
|
49
|
-
@options
|
50
|
-
@facility
|
51
|
-
@level
|
52
|
-
@formatter = proc do |
|
46
|
+
@ident = ident
|
47
|
+
@options = options || (Syslog::LOG_PID | Syslog::LOG_CONS)
|
48
|
+
@facility = facility
|
49
|
+
@level = Logger::INFO
|
50
|
+
@formatter = proc do |_, _, _, msg|
|
53
51
|
msg
|
54
52
|
end
|
55
53
|
end
|
@@ -80,6 +78,10 @@ class Syslogger
|
|
80
78
|
add(Logger::INFO, msg)
|
81
79
|
end
|
82
80
|
|
81
|
+
def puts(msg)
|
82
|
+
add(Logger::INFO, msg)
|
83
|
+
end
|
84
|
+
|
83
85
|
# Low level method to add a message.
|
84
86
|
# +severity+:: the level of the message. One of Logger::DEBUG, Logger::INFO, Logger::WARN, Logger::ERROR, Logger::FATAL, Logger::UNKNOWN
|
85
87
|
# +message+:: the message string.
|
@@ -93,27 +95,10 @@ class Syslogger
|
|
93
95
|
progname ||= @ident
|
94
96
|
mask = Syslog::LOG_UPTO(MAPPING[@level])
|
95
97
|
communication = message || block && block.call
|
96
|
-
formatted_communication = clean(formatter.call(
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
s.mask = mask
|
101
|
-
if self.max_octets
|
102
|
-
buffer = "#{tags_text}"
|
103
|
-
formatted_communication.bytes do |byte|
|
104
|
-
buffer.concat(byte)
|
105
|
-
# if the last byte we added is potentially part of an escape, we'll go ahead and add another byte
|
106
|
-
if buffer.bytesize >= self.max_octets && !['%'.ord,'\\'.ord].include?(byte)
|
107
|
-
s.log(MAPPING[severity],buffer)
|
108
|
-
buffer = ""
|
109
|
-
end
|
110
|
-
end
|
111
|
-
s.log(MAPPING[severity],buffer) unless buffer.empty?
|
112
|
-
else
|
113
|
-
s.log(MAPPING[severity],"#{tags_text}#{formatted_communication}")
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
98
|
+
formatted_communication = clean(formatter.call(severity, Time.now, progname, communication))
|
99
|
+
|
100
|
+
# Call Syslog
|
101
|
+
syslog_add(progname, severity, mask, formatted_communication)
|
117
102
|
end
|
118
103
|
|
119
104
|
# Set the max octets of the messages written to the log
|
@@ -124,13 +109,7 @@ class Syslogger
|
|
124
109
|
# Sets the minimum level for messages to be written in the log.
|
125
110
|
# +level+:: one of <tt>Logger::DEBUG</tt>, <tt>Logger::INFO</tt>, <tt>Logger::WARN</tt>, <tt>Logger::ERROR</tt>, <tt>Logger::FATAL</tt>, <tt>Logger::UNKNOWN</tt>
|
126
111
|
def level=(level)
|
127
|
-
level =
|
128
|
-
|
129
|
-
unless level.is_a?(Fixnum)
|
130
|
-
raise ArgumentError.new("Invalid logger level `#{level.inspect}`")
|
131
|
-
end
|
132
|
-
|
133
|
-
@level = level
|
112
|
+
@level = sanitize_level(level)
|
134
113
|
end
|
135
114
|
|
136
115
|
# Sets the ident string passed along to Syslog
|
@@ -147,8 +126,8 @@ class Syslogger
|
|
147
126
|
end
|
148
127
|
|
149
128
|
def push_tags(*tags)
|
150
|
-
tags.flatten.reject{ |i| i.respond_to?(:empty?) ? i.empty? : !i }.tap do |new_tags|
|
151
|
-
current_tags.concat
|
129
|
+
tags.flatten.reject { |i| i.respond_to?(:empty?) ? i.empty? : !i }.tap do |new_tags|
|
130
|
+
current_tags.concat(new_tags).uniq!
|
152
131
|
end
|
153
132
|
end
|
154
133
|
|
@@ -160,8 +139,26 @@ class Syslogger
|
|
160
139
|
current_tags.clear
|
161
140
|
end
|
162
141
|
|
142
|
+
def current_tags
|
143
|
+
Thread.current[:syslogger_tagged_logging_tags] ||= []
|
144
|
+
end
|
145
|
+
|
163
146
|
protected
|
164
147
|
|
148
|
+
def sanitize_level(new_level)
|
149
|
+
begin
|
150
|
+
new_level = Logger.const_get(new_level.to_s.upcase)
|
151
|
+
rescue => _
|
152
|
+
raise ArgumentError.new("Invalid logger level `#{new_level.inspect}`")
|
153
|
+
end if new_level.is_a?(Symbol)
|
154
|
+
|
155
|
+
unless new_level.is_a?(Integer)
|
156
|
+
raise ArgumentError.new("Invalid logger level `#{new_level.inspect}`")
|
157
|
+
end
|
158
|
+
|
159
|
+
new_level
|
160
|
+
end
|
161
|
+
|
165
162
|
# Borrowed from SyslogLogger.
|
166
163
|
def clean(message)
|
167
164
|
message = message.to_s.dup
|
@@ -177,11 +174,29 @@ class Syslogger
|
|
177
174
|
def tags_text
|
178
175
|
tags = current_tags
|
179
176
|
if tags.any?
|
180
|
-
clean(tags.collect { |tag| "[#{tag}] " }.join) <<
|
177
|
+
clean(tags.collect { |tag| "[#{tag}] " }.join) << ' '
|
181
178
|
end
|
182
179
|
end
|
183
180
|
|
184
|
-
def
|
185
|
-
|
181
|
+
def syslog_add(progname, severity, mask, formatted_communication)
|
182
|
+
MUTEX.synchronize do
|
183
|
+
Syslog.open(progname, @options, @facility) do |s|
|
184
|
+
s.mask = mask
|
185
|
+
if self.max_octets
|
186
|
+
buffer = "#{tags_text}"
|
187
|
+
formatted_communication.bytes do |byte|
|
188
|
+
buffer.concat(byte)
|
189
|
+
# if the last byte we added is potentially part of an escape, we'll go ahead and add another byte
|
190
|
+
if buffer.bytesize >= self.max_octets && !['%'.ord,'\\'.ord].include?(byte)
|
191
|
+
s.log(MAPPING[severity], buffer)
|
192
|
+
buffer = ''
|
193
|
+
end
|
194
|
+
end
|
195
|
+
s.log(MAPPING[severity], buffer) unless buffer.empty?
|
196
|
+
else
|
197
|
+
s.log(MAPPING[severity], "#{tags_text}#{formatted_communication}")
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
186
201
|
end
|
187
202
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,5 +1,21 @@
|
|
1
|
+
require 'simplecov'
|
1
2
|
require 'rspec'
|
2
3
|
|
3
|
-
|
4
|
-
|
4
|
+
# Start Simplecov
|
5
|
+
SimpleCov.start
|
6
|
+
|
7
|
+
# Configure RSpec
|
8
|
+
RSpec.configure do |config|
|
9
|
+
config.color = true
|
10
|
+
config.fail_fast = false
|
11
|
+
|
12
|
+
config.order = :random
|
13
|
+
Kernel.srand config.seed
|
14
|
+
|
15
|
+
config.expect_with :rspec do |c|
|
16
|
+
c.syntax = :expect
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Load lib
|
5
21
|
require 'syslogger'
|
data/spec/syslogger_spec.rb
CHANGED
@@ -1,274 +1,196 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
describe "Syslogger" do
|
4
|
-
it "should log to the default syslog facility, with the default options" do
|
5
|
-
logger = Syslogger.new
|
6
|
-
Syslog.should_receive(:open).with($0, Syslog::LOG_PID | Syslog::LOG_CONS, nil).and_yield(syslog=double("syslog", :mask= => true))
|
7
|
-
syslog.should_receive(:log).with(Syslog::LOG_WARNING, "Some message")
|
8
|
-
logger.warn "Some message"
|
9
|
-
end
|
1
|
+
require 'spec_helper'
|
10
2
|
|
11
|
-
|
12
|
-
logger = Syslogger.new("my_app", Syslog::LOG_PID, Syslog::LOG_USER)
|
13
|
-
Syslog.should_receive(:open).with("my_app", Syslog::LOG_PID, Syslog::LOG_USER).and_yield(syslog=double("syslog", :mask= => true))
|
14
|
-
syslog.should_receive(:log).with(Syslog::LOG_WARNING, "Some message")
|
15
|
-
logger.warn "Some message"
|
16
|
-
end
|
3
|
+
describe Syslogger do
|
17
4
|
|
18
|
-
|
19
|
-
it "should respond to the #{logger_method.inspect} method" do
|
20
|
-
Syslogger.new.should respond_to logger_method.to_sym
|
21
|
-
end
|
5
|
+
let(:fake_syslog) { double('syslog', :mask= => true) }
|
22
6
|
|
23
|
-
|
7
|
+
describe '.new' do
|
8
|
+
it 'should log to the default syslog facility, with the default options' do
|
9
|
+
expect(Syslog).to receive(:open).with($0, Syslog::LOG_PID | Syslog::LOG_CONS, nil).and_yield(fake_syslog)
|
10
|
+
expect(fake_syslog).to receive(:log).with(Syslog::LOG_WARNING, 'Some message')
|
24
11
|
logger = Syslogger.new
|
25
|
-
logger.
|
26
|
-
Syslog.stub(:open).and_yield(syslog=double("syslog", :mask= => true))
|
27
|
-
severity = Syslogger::MAPPING[Logger.const_get(logger_method.upcase)]
|
28
|
-
syslog.should_receive(:log).with(severity, "Some message that doesn't need to be in a block")
|
29
|
-
lambda {
|
30
|
-
logger.send(logger_method.to_sym) { "Some message that doesn't need to be in a block" }
|
31
|
-
}.should_not raise_error
|
12
|
+
logger.warn 'Some message'
|
32
13
|
end
|
33
14
|
|
34
|
-
it
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
severity = Syslogger::MAPPING[Logger.const_get(logger_method.upcase)]
|
40
|
-
syslog.should_receive(:log).with(severity, "Some message that really needs a block")
|
41
|
-
lambda {
|
42
|
-
logger.send(logger_method.to_sym, "Woah") { "Some message that really needs a block" }
|
43
|
-
}.should_not raise_error
|
15
|
+
it 'should log to the user facility, with specific options' do
|
16
|
+
expect(Syslog).to receive(:open).with('my_app', Syslog::LOG_PID, Syslog::LOG_USER).and_yield(fake_syslog)
|
17
|
+
expect(fake_syslog).to receive(:log).with(Syslog::LOG_WARNING, 'Some message')
|
18
|
+
logger = Syslogger.new('my_app', Syslog::LOG_PID, Syslog::LOG_USER)
|
19
|
+
logger.warn 'Some message'
|
44
20
|
end
|
21
|
+
end
|
45
22
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
23
|
+
describe '#add' do
|
24
|
+
let(:logger) { Syslogger.new('my_app', Syslog::LOG_PID, Syslog::LOG_USER) }
|
25
|
+
|
26
|
+
it 'should respond to add' do
|
27
|
+
expect(logger).to respond_to(:add)
|
51
28
|
end
|
52
29
|
|
53
|
-
it
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
}.should_not raise_error
|
30
|
+
it 'should correctly log' do
|
31
|
+
expect(Syslog).to receive(:open).with('my_app', Syslog::LOG_PID, Syslog::LOG_USER).and_yield(fake_syslog)
|
32
|
+
expect(fake_syslog).to receive(:log).with(Syslog::LOG_INFO, 'message')
|
33
|
+
logger.add(Logger::INFO, 'message')
|
58
34
|
end
|
59
35
|
|
60
|
-
it
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
msg+="%BBB"
|
65
|
-
lambda {
|
66
|
-
logger.send(logger_method.to_sym,msg)
|
67
|
-
}.should_not raise_error
|
36
|
+
it 'should take the message from the block if :message is nil' do
|
37
|
+
expect(Syslog).to receive(:open).with('my_app', Syslog::LOG_PID, Syslog::LOG_USER).and_yield(fake_syslog)
|
38
|
+
expect(fake_syslog).to receive(:log).with(Syslog::LOG_INFO, 'message')
|
39
|
+
logger.add(Logger::INFO) { 'message' }
|
68
40
|
end
|
69
|
-
end
|
70
41
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
logger.
|
75
|
-
Syslog.should_not_receive(:open).with($0, Syslog::LOG_PID | Syslog::LOG_CONS, nil).and_yield(syslog=double("syslog", :mask= => true))
|
76
|
-
syslog.should_not_receive(:log).with(Syslog::LOG_NOTICE, "Some message")
|
77
|
-
logger.send(logger_method.to_sym, "Some message")
|
42
|
+
it 'should use the given progname' do
|
43
|
+
expect(Syslog).to receive(:open).with('progname', Syslog::LOG_PID, Syslog::LOG_USER).and_yield(fake_syslog)
|
44
|
+
expect(fake_syslog).to receive(:log).with(Syslog::LOG_INFO, 'message')
|
45
|
+
logger.add(Logger::INFO, 'message', 'progname')
|
78
46
|
end
|
79
47
|
|
80
|
-
it
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
syslog.should_not_receive(:log).with(Syslog::LOG_NOTICE, "Some message")
|
85
|
-
logger.send(logger_method.to_sym) { violated "This block should not have been called" }
|
48
|
+
it 'should use the default progname when message is passed in progname' do
|
49
|
+
expect(Syslog).to receive(:open).with('my_app', Syslog::LOG_PID, Syslog::LOG_USER).and_yield(fake_syslog)
|
50
|
+
expect(fake_syslog).to receive(:log).with(Syslog::LOG_INFO, 'message')
|
51
|
+
logger.add(Logger::INFO, nil, 'message')
|
86
52
|
end
|
87
|
-
end
|
88
53
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
logger << "yop"
|
95
|
-
end
|
54
|
+
it 'should use the given progname if message is passed in block' do
|
55
|
+
expect(Syslog).to receive(:open).with('progname', Syslog::LOG_PID, Syslog::LOG_USER).and_yield(fake_syslog)
|
56
|
+
expect(fake_syslog).to receive(:log).with(Syslog::LOG_INFO, 'message')
|
57
|
+
logger.add(Logger::INFO, nil, 'progname') { 'message' }
|
58
|
+
end
|
96
59
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
logger.write "yop"
|
103
|
-
end
|
60
|
+
it "should substitute '%' for '%%' before adding the :message" do
|
61
|
+
allow(Syslog).to receive(:open).and_yield(fake_syslog)
|
62
|
+
expect(fake_syslog).to receive(:log).with(Syslog::LOG_INFO, "%%me%%ssage%%")
|
63
|
+
logger.add(Logger::INFO, "%me%ssage%")
|
64
|
+
end
|
104
65
|
|
105
|
-
|
106
|
-
|
107
|
-
|
66
|
+
it 'should clean formatted message' do
|
67
|
+
allow(Syslog).to receive(:open).and_yield(fake_syslog)
|
68
|
+
expect(fake_syslog).to receive(:log).with(Syslog::LOG_INFO, "m%%e%%s%%s%%a%%g%%e")
|
108
69
|
|
109
|
-
|
110
|
-
5000.times do |i|
|
111
|
-
logger1.write "logger1"
|
112
|
-
end
|
113
|
-
end
|
70
|
+
original_formatter = logger.formatter
|
114
71
|
|
115
|
-
|
116
|
-
|
117
|
-
|
72
|
+
begin
|
73
|
+
logger.formatter = proc do |severity, datetime, progname, msg|
|
74
|
+
msg.split(//).join('%')
|
75
|
+
end
|
76
|
+
logger.add(Logger::INFO, 'message')
|
77
|
+
ensure
|
78
|
+
logger.formatter = original_formatter
|
118
79
|
end
|
119
80
|
end
|
120
81
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
threads << Thread.new do
|
129
|
-
(1..100).each do |index|
|
130
|
-
logger = Syslogger.new(Thread.current.inspect, Syslog::LOG_PID, Syslog::LOG_USER)
|
131
|
-
logger.write index
|
82
|
+
it 'should clean tagged message' do
|
83
|
+
allow(Syslog).to receive(:open).and_yield(fake_syslog)
|
84
|
+
expect(fake_syslog).to receive(:log).with(Syslog::LOG_INFO, "[t%%a%%g%%g%%e%%d] [it] message")
|
85
|
+
|
86
|
+
logger.tagged("t%a%g%g%e%d") do
|
87
|
+
logger.tagged('it') do
|
88
|
+
logger.add(Logger::INFO, 'message')
|
132
89
|
end
|
133
90
|
end
|
134
91
|
end
|
135
|
-
|
136
|
-
threads.each{|thread| thread.join }
|
137
|
-
end
|
138
92
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
it "should respond to add" do
|
144
|
-
@logger.should respond_to(:add)
|
145
|
-
end
|
146
|
-
it "should correctly log" do
|
147
|
-
Syslog.should_receive(:open).with("my_app", Syslog::LOG_PID, Syslog::LOG_USER).and_yield(syslog=double("syslog", :mask= => true))
|
148
|
-
syslog.should_receive(:log).with(Syslog::LOG_INFO, "message")
|
149
|
-
@logger.add(Logger::INFO, "message")
|
150
|
-
end
|
151
|
-
it "should take the message from the block if :message is nil" do
|
152
|
-
Syslog.should_receive(:open).with("my_app", Syslog::LOG_PID, Syslog::LOG_USER).and_yield(syslog=double("syslog", :mask= => true))
|
153
|
-
syslog.should_receive(:log).with(Syslog::LOG_INFO, "my message")
|
154
|
-
@logger.add(Logger::INFO) { "my message" }
|
93
|
+
it 'should strip the :message' do
|
94
|
+
allow(Syslog).to receive(:open).and_yield(fake_syslog)
|
95
|
+
expect(fake_syslog).to receive(:log).with(Syslog::LOG_INFO, 'message')
|
96
|
+
logger.add(Logger::INFO, "\n\nmessage ")
|
155
97
|
end
|
156
|
-
it "should use the given progname" do
|
157
|
-
Syslog.should_receive(:open).with("progname", Syslog::LOG_PID, Syslog::LOG_USER).and_yield(syslog=double("syslog", :mask= => true))
|
158
|
-
syslog.should_receive(:log).with(Syslog::LOG_INFO, "message")
|
159
|
-
@logger.add(Logger::INFO, "message", "progname") { "my message" }
|
160
|
-
end
|
161
|
-
|
162
|
-
it "should use the default progname when message is passed in progname" do
|
163
|
-
Syslog.should_receive(:open).
|
164
|
-
with("my_app", Syslog::LOG_PID, Syslog::LOG_USER).
|
165
|
-
and_yield(syslog = double("syslog", :mask= => true))
|
166
98
|
|
167
|
-
|
168
|
-
|
99
|
+
it 'should not raise exception if asked to log with a nil message and body' do
|
100
|
+
expect(Syslog).to receive(:open).with('my_app', Syslog::LOG_PID, Syslog::LOG_USER).and_yield(fake_syslog)
|
101
|
+
expect(fake_syslog).to receive(:log).with(Syslog::LOG_INFO, '')
|
102
|
+
expect {
|
103
|
+
logger.add(Logger::INFO, nil)
|
104
|
+
}.to_not raise_error
|
169
105
|
end
|
170
106
|
|
171
|
-
it
|
172
|
-
Syslog.
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
syslog.should_receive(:log).with(Syslog::LOG_INFO, "message")
|
177
|
-
@logger.add(Logger::INFO, nil, "progname") { "message" }
|
107
|
+
it 'should send an empty string if the message and block are nil' do
|
108
|
+
expect(Syslog).to receive(:open).with('my_app', Syslog::LOG_PID, Syslog::LOG_USER).and_yield(fake_syslog)
|
109
|
+
expect(fake_syslog).to receive(:log).with(Syslog::LOG_INFO, '')
|
110
|
+
logger.add(Logger::INFO, nil)
|
178
111
|
end
|
179
112
|
|
180
|
-
it
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
it "should clean formatted message" do
|
187
|
-
Syslog.stub(:open).and_yield(syslog=double("syslog", :mask= => true))
|
188
|
-
syslog.should_receive(:log).with(Syslog::LOG_INFO, "m%%e%%s%%s%%a%%g%%e")
|
189
|
-
|
190
|
-
original_formatter = @logger.formatter
|
191
|
-
begin
|
192
|
-
@logger.formatter = proc do |severity, datetime, progname, msg|
|
193
|
-
msg.split(//).join('%')
|
194
|
-
end
|
195
|
-
|
196
|
-
@logger.add(Logger::INFO, "message")
|
197
|
-
ensure
|
198
|
-
@logger.formatter = original_formatter
|
199
|
-
end
|
113
|
+
it 'should split string over the max octet size' do
|
114
|
+
logger.max_octets = 480
|
115
|
+
expect(Syslog).to receive(:open).with('my_app', Syslog::LOG_PID, Syslog::LOG_USER).and_yield(fake_syslog)
|
116
|
+
expect(fake_syslog).to receive(:log).with(Syslog::LOG_INFO, 'a' * 480).twice
|
117
|
+
logger.add(Logger::INFO, 'a' * 960)
|
200
118
|
end
|
201
|
-
|
202
|
-
it
|
203
|
-
Syslog.
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
@logger.tagged("it") do
|
208
|
-
@logger.add(Logger::INFO, "message")
|
209
|
-
end
|
119
|
+
|
120
|
+
it 'should apply the log formatter to the message' do
|
121
|
+
allow(Syslog).to receive(:open).and_yield(fake_syslog)
|
122
|
+
expect(fake_syslog).to receive(:log).with(Syslog::LOG_INFO, 'test message!')
|
123
|
+
logger.formatter = proc do |severity, datetime, progname, msg|
|
124
|
+
"test #{msg}!"
|
210
125
|
end
|
126
|
+
logger.add(Logger::INFO, 'message')
|
211
127
|
end
|
128
|
+
end
|
212
129
|
|
213
|
-
|
214
|
-
|
215
|
-
syslog.should_receive(:log).with(Syslog::LOG_INFO, "message")
|
216
|
-
@logger.add(Logger::INFO, "\n\nmessage ")
|
217
|
-
end
|
130
|
+
describe '#<<' do
|
131
|
+
let(:logger) { Syslogger.new('my_app', Syslog::LOG_PID, Syslog::LOG_USER) }
|
218
132
|
|
219
|
-
it
|
220
|
-
|
221
|
-
with("my_app", Syslog::LOG_PID, Syslog::LOG_USER).
|
222
|
-
and_yield(syslog=double("syslog", :mask= => true))
|
223
|
-
syslog.should_receive(:log).with(Syslog::LOG_INFO, "")
|
224
|
-
lambda {
|
225
|
-
@logger.add(Logger::INFO, nil)
|
226
|
-
}.should_not raise_error
|
133
|
+
it 'should respond to <<' do
|
134
|
+
expect(logger).to respond_to(:<<)
|
227
135
|
end
|
228
136
|
|
229
|
-
it
|
230
|
-
Syslog.
|
231
|
-
|
232
|
-
|
233
|
-
syslog.should_receive(:log).with(Syslog::LOG_INFO, "")
|
234
|
-
@logger.add(Logger::INFO, nil)
|
137
|
+
it 'should correctly log' do
|
138
|
+
expect(Syslog).to receive(:open).with('my_app', Syslog::LOG_PID, Syslog::LOG_USER).and_yield(fake_syslog)
|
139
|
+
expect(fake_syslog).to receive(:log).with(Syslog::LOG_INFO, 'message')
|
140
|
+
logger << 'message'
|
235
141
|
end
|
142
|
+
end
|
236
143
|
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
syslog.should_receive(:log).with(Syslog::LOG_INFO, "a"*480).twice
|
243
|
-
@logger.add(Logger::INFO, "a"*960)
|
144
|
+
describe '#puts' do
|
145
|
+
let(:logger) { Syslogger.new('my_app', Syslog::LOG_PID, Syslog::LOG_USER) }
|
146
|
+
|
147
|
+
it 'should respond to puts' do
|
148
|
+
expect(logger).to respond_to(:puts)
|
244
149
|
end
|
245
150
|
|
246
|
-
it
|
247
|
-
Syslog.
|
248
|
-
|
249
|
-
|
250
|
-
"test #{msg}!"
|
251
|
-
end
|
252
|
-
@logger.add(Logger::INFO, "message")
|
151
|
+
it 'should correctly log' do
|
152
|
+
expect(Syslog).to receive(:open).with('my_app', Syslog::LOG_PID, Syslog::LOG_USER).and_yield(fake_syslog)
|
153
|
+
expect(fake_syslog).to receive(:log).with(Syslog::LOG_INFO, 'message')
|
154
|
+
logger.puts 'message'
|
253
155
|
end
|
254
|
-
end
|
156
|
+
end
|
255
157
|
|
256
|
-
describe
|
257
|
-
|
258
|
-
|
158
|
+
describe '#write' do
|
159
|
+
let(:logger) { Syslogger.new('my_app', Syslog::LOG_PID, Syslog::LOG_USER) }
|
160
|
+
|
161
|
+
it 'should respond to write' do
|
162
|
+
expect(logger).to respond_to(:write)
|
259
163
|
end
|
260
164
|
|
261
|
-
it
|
262
|
-
|
263
|
-
|
165
|
+
it 'should correctly log' do
|
166
|
+
expect(Syslog).to receive(:open).with('my_app', Syslog::LOG_PID, Syslog::LOG_USER).and_yield(fake_syslog)
|
167
|
+
expect(fake_syslog).to receive(:log).with(Syslog::LOG_INFO, 'message')
|
168
|
+
logger.write 'message'
|
264
169
|
end
|
170
|
+
end
|
265
171
|
|
172
|
+
describe '#max_octets=' do
|
173
|
+
let(:logger) { Syslogger.new('my_app', Syslog::LOG_PID, Syslog::LOG_USER) }
|
174
|
+
|
175
|
+
it 'should set the max_octets for the logger' do
|
176
|
+
expect { logger.max_octets = 1 }.to change(logger, :max_octets)
|
177
|
+
expect(logger.max_octets).to eq 1
|
178
|
+
end
|
266
179
|
end
|
267
180
|
|
268
|
-
describe
|
269
|
-
|
270
|
-
|
181
|
+
describe '#ident=' do
|
182
|
+
let(:logger) { Syslogger.new('my_app', Syslog::LOG_PID | Syslog::LOG_CONS, nil) }
|
183
|
+
|
184
|
+
it 'should permanently change the ident string' do
|
185
|
+
logger.ident = 'new_ident'
|
186
|
+
expect(Syslog).to receive(:open).with('new_ident', Syslog::LOG_PID | Syslog::LOG_CONS, nil).and_yield(fake_syslog)
|
187
|
+
expect(fake_syslog).to receive(:log)
|
188
|
+
logger.warn('should get the new ident string')
|
271
189
|
end
|
190
|
+
end
|
191
|
+
|
192
|
+
describe '#level=' do
|
193
|
+
let(:logger) { Syslogger.new('my_app', Syslog::LOG_PID, Syslog::LOG_USER) }
|
272
194
|
|
273
195
|
{ :debug => Logger::DEBUG,
|
274
196
|
:info => Logger::INFO,
|
@@ -277,105 +199,257 @@ describe "Syslogger" do
|
|
277
199
|
:fatal => Logger::FATAL
|
278
200
|
}.each_pair do |level_symbol, level_value|
|
279
201
|
it "should allow using :#{level_symbol}" do
|
280
|
-
|
281
|
-
|
202
|
+
logger.level = level_symbol
|
203
|
+
expect(logger.level).to eq level_value
|
282
204
|
end
|
283
205
|
|
284
|
-
it "should allow using
|
285
|
-
|
286
|
-
|
206
|
+
it "should allow using Integer #{level_value}" do
|
207
|
+
logger.level = level_value
|
208
|
+
expect(logger.level).to eq level_value
|
287
209
|
end
|
288
210
|
end
|
289
211
|
|
290
|
-
it
|
291
|
-
|
292
|
-
|
293
|
-
}.
|
212
|
+
it 'should not allow using random symbols' do
|
213
|
+
expect {
|
214
|
+
logger.level = :foo
|
215
|
+
}.to raise_error(ArgumentError)
|
294
216
|
end
|
295
217
|
|
296
|
-
it
|
297
|
-
|
298
|
-
|
299
|
-
}.
|
218
|
+
it 'should not allow using symbols mapping back to non-level constants' do
|
219
|
+
expect {
|
220
|
+
logger.level = :version
|
221
|
+
}.to raise_error(ArgumentError)
|
300
222
|
end
|
301
223
|
|
302
|
-
it
|
303
|
-
|
304
|
-
|
305
|
-
}.
|
224
|
+
it 'should not allow using strings' do
|
225
|
+
expect {
|
226
|
+
logger.level = 'warn'
|
227
|
+
}.to raise_error(ArgumentError)
|
306
228
|
end
|
307
|
-
end
|
229
|
+
end
|
308
230
|
|
309
|
-
describe
|
310
|
-
|
311
|
-
|
231
|
+
describe '#:level? methods' do
|
232
|
+
let(:logger) { Syslogger.new('my_app', Syslog::LOG_PID, Syslog::LOG_USER) }
|
233
|
+
|
234
|
+
%w{debug info warn error fatal}.each do |logger_method|
|
235
|
+
it "should respond to the #{logger_method}? method" do
|
236
|
+
expect(logger).to respond_to "#{logger_method}?".to_sym
|
237
|
+
end
|
312
238
|
end
|
313
239
|
|
314
|
-
it
|
315
|
-
|
316
|
-
Syslog.should_receive(:open).with("new_ident", Syslog::LOG_PID | Syslog::LOG_CONS, nil).and_yield(syslog=double("syslog", :mask= => true))
|
317
|
-
syslog.should_receive(:log)
|
318
|
-
@logger.warn("should get the new ident string")
|
240
|
+
it 'should not have unknown? method' do
|
241
|
+
expect(logger).to_not respond_to :unknown?
|
319
242
|
end
|
320
|
-
end
|
321
243
|
|
322
|
-
|
323
|
-
|
324
|
-
|
244
|
+
context 'when loglevel is Logger::DEBUG' do
|
245
|
+
it 'should return true for all methods' do
|
246
|
+
logger.level = Logger::DEBUG
|
247
|
+
%w{debug info warn error fatal}.each do |logger_method|
|
248
|
+
expect(logger.send("#{logger_method}?")).to be true
|
249
|
+
end
|
250
|
+
end
|
325
251
|
end
|
326
252
|
|
327
|
-
|
328
|
-
it
|
329
|
-
|
253
|
+
context 'when loglevel is Logger::INFO' do
|
254
|
+
it 'should return true for all except debug?' do
|
255
|
+
logger.level = Logger::INFO
|
256
|
+
%w{info warn error fatal}.each do |logger_method|
|
257
|
+
expect(logger.send("#{logger_method}?")).to be true
|
258
|
+
end
|
259
|
+
expect(logger.debug?).to be false
|
330
260
|
end
|
331
261
|
end
|
332
262
|
|
333
|
-
|
334
|
-
|
263
|
+
context 'when loglevel is Logger::WARN' do
|
264
|
+
it 'should return true for warn?, error? and fatal? when WARN' do
|
265
|
+
logger.level = Logger::WARN
|
266
|
+
%w{warn error fatal}.each do |logger_method|
|
267
|
+
expect(logger.send("#{logger_method}?")).to be true
|
268
|
+
end
|
269
|
+
%w{debug info}.each do |logger_method|
|
270
|
+
expect(logger.send("#{logger_method}?")).to be false
|
271
|
+
end
|
272
|
+
end
|
335
273
|
end
|
336
274
|
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
275
|
+
context 'when loglevel is Logger::ERROR' do
|
276
|
+
it 'should return true for error? and fatal? when ERROR' do
|
277
|
+
logger.level = Logger::ERROR
|
278
|
+
%w{error fatal}.each do |logger_method|
|
279
|
+
expect(logger.send("#{logger_method}?")).to be true
|
280
|
+
end
|
281
|
+
%w{warn debug info}.each do |logger_method|
|
282
|
+
expect(logger.send("#{logger_method}?")).to be false
|
283
|
+
end
|
341
284
|
end
|
342
285
|
end
|
343
286
|
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
287
|
+
context 'when loglevel is Logger::FATAL' do
|
288
|
+
it 'should return true only for fatal? when FATAL' do
|
289
|
+
logger.level = Logger::FATAL
|
290
|
+
expect(logger.fatal?).to be true
|
291
|
+
%w{error warn debug info}.each do |logger_method|
|
292
|
+
expect(logger.send("#{logger_method}?")).to be false
|
293
|
+
end
|
348
294
|
end
|
349
|
-
@logger.debug?.should be_false
|
350
295
|
end
|
296
|
+
end
|
297
|
+
|
298
|
+
describe '#push_tags' do
|
299
|
+
let(:logger) { Syslogger.new('my_app', Syslog::LOG_PID, Syslog::LOG_USER) }
|
300
|
+
after(:each) { logger.clear_tags! }
|
301
|
+
|
302
|
+
it 'saves tags' do
|
303
|
+
logger.push_tags('tag1')
|
304
|
+
logger.push_tags('tag2')
|
305
|
+
expect(logger.current_tags).to eq ['tag1', 'tag2']
|
306
|
+
end
|
307
|
+
|
308
|
+
it 'saves uniq tags' do
|
309
|
+
logger.push_tags('tag1')
|
310
|
+
logger.push_tags('tag2')
|
311
|
+
logger.push_tags('foo')
|
312
|
+
logger.push_tags('foo')
|
313
|
+
expect(logger.current_tags).to eq ['tag1', 'tag2', 'foo']
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
describe '#clear_tags!' do
|
318
|
+
let(:logger) { Syslogger.new('my_app', Syslog::LOG_PID, Syslog::LOG_USER) }
|
319
|
+
after(:each) { logger.clear_tags! }
|
351
320
|
|
352
|
-
it
|
353
|
-
|
354
|
-
|
355
|
-
|
321
|
+
it 'clears tags' do
|
322
|
+
expect(logger.current_tags).to eq []
|
323
|
+
logger.push_tags('tag1')
|
324
|
+
logger.push_tags('tag2')
|
325
|
+
expect(logger.current_tags).to eq ['tag1', 'tag2']
|
326
|
+
logger.clear_tags!
|
327
|
+
expect(logger.current_tags).to eq []
|
328
|
+
end
|
329
|
+
end
|
330
|
+
|
331
|
+
describe 'logger methods (debug info warn error fatal unknown)' do
|
332
|
+
%w{debug info warn error fatal unknown}.each do |logger_method|
|
333
|
+
|
334
|
+
it "should respond to the #{logger_method.inspect} method" do
|
335
|
+
expect(Syslogger.new).to respond_to logger_method.to_sym
|
356
336
|
end
|
357
|
-
|
358
|
-
|
337
|
+
|
338
|
+
it "should log #{logger_method} without raising an exception if called with a block" do
|
339
|
+
severity = Syslogger::MAPPING[Logger.const_get(logger_method.upcase)]
|
340
|
+
|
341
|
+
logger = Syslogger.new
|
342
|
+
logger.level = Logger.const_get(logger_method.upcase)
|
343
|
+
|
344
|
+
expect(Syslog).to receive(:open).and_yield(fake_syslog)
|
345
|
+
expect(fake_syslog).to receive(:log).with(severity, 'Some message that dont need to be in a block')
|
346
|
+
expect {
|
347
|
+
logger.send(logger_method.to_sym) { 'Some message that dont need to be in a block' }
|
348
|
+
}.to_not raise_error
|
359
349
|
end
|
360
|
-
end
|
361
350
|
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
351
|
+
it "should log #{logger_method} using message as progname with the block's result" do
|
352
|
+
severity = Syslogger::MAPPING[Logger.const_get(logger_method.upcase)]
|
353
|
+
|
354
|
+
logger = Syslogger.new
|
355
|
+
logger.level = Logger.const_get(logger_method.upcase)
|
356
|
+
|
357
|
+
expect(Syslog).to receive(:open).with('Woah', anything, nil).and_yield(fake_syslog)
|
358
|
+
expect(fake_syslog).to receive(:log).with(severity, 'Some message that really needs a block')
|
359
|
+
expect {
|
360
|
+
logger.send(logger_method.to_sym, 'Woah') { 'Some message that really needs a block' }
|
361
|
+
}.to_not raise_error
|
362
|
+
end
|
363
|
+
|
364
|
+
it "should log #{logger_method} without raising an exception if called with a nil message" do
|
365
|
+
logger = Syslogger.new
|
366
|
+
expect {
|
367
|
+
logger.send(logger_method.to_sym, nil)
|
368
|
+
}.to_not raise_error
|
369
|
+
end
|
370
|
+
|
371
|
+
it "should log #{logger_method} without raising an exception if called with a no message" do
|
372
|
+
logger = Syslogger.new
|
373
|
+
expect {
|
374
|
+
logger.send(logger_method.to_sym)
|
375
|
+
}.to_not raise_error
|
366
376
|
end
|
367
|
-
|
368
|
-
|
377
|
+
|
378
|
+
it "should log #{logger_method} without raising an exception if message splits on an escape" do
|
379
|
+
logger = Syslogger.new
|
380
|
+
logger.max_octets = 100
|
381
|
+
msg = 'A' * 99
|
382
|
+
msg += "%BBB"
|
383
|
+
expect {
|
384
|
+
logger.send(logger_method.to_sym, msg)
|
385
|
+
}.to_not raise_error
|
369
386
|
end
|
370
387
|
end
|
388
|
+
end
|
389
|
+
|
390
|
+
describe 'it should be thread safe' do
|
391
|
+
it 'should not fail under chaos' do
|
392
|
+
threads = []
|
393
|
+
(1..10).each do
|
394
|
+
threads << Thread.new do
|
395
|
+
(1..100).each do |index|
|
396
|
+
logger = Syslogger.new(Thread.current.inspect, Syslog::LOG_PID, Syslog::LOG_USER)
|
397
|
+
logger.write index
|
398
|
+
end
|
399
|
+
end
|
400
|
+
end
|
401
|
+
|
402
|
+
threads.map(&:join)
|
403
|
+
end
|
404
|
+
|
405
|
+
it 'should allow multiple instances to log at the same time' do
|
406
|
+
logger1 = Syslogger.new('my_app1', Syslog::LOG_PID, Syslog::LOG_USER)
|
407
|
+
logger2 = Syslogger.new('my_app2', Syslog::LOG_PID, Syslog::LOG_USER)
|
408
|
+
|
409
|
+
syslog1 = double('syslog1', :mask= => true)
|
410
|
+
syslog2 = double('syslog2', :mask= => true)
|
411
|
+
|
412
|
+
expect(Syslog).to receive(:open).exactly(5000).times.with('my_app1', Syslog::LOG_PID, Syslog::LOG_USER).and_yield(syslog1)
|
413
|
+
expect(Syslog).to receive(:open).exactly(5000).times.with('my_app2', Syslog::LOG_PID, Syslog::LOG_USER).and_yield(syslog2)
|
371
414
|
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
415
|
+
expect(syslog1).to receive(:log).exactly(5000).times.with(Syslog::LOG_INFO, 'logger1')
|
416
|
+
expect(syslog2).to receive(:log).exactly(5000).times.with(Syslog::LOG_INFO, 'logger2')
|
417
|
+
|
418
|
+
threads = []
|
419
|
+
|
420
|
+
threads << Thread.new do
|
421
|
+
5000.times do |i|
|
422
|
+
logger1.info 'logger1'
|
423
|
+
end
|
424
|
+
end
|
425
|
+
|
426
|
+
threads << Thread.new do
|
427
|
+
5000.times do |i|
|
428
|
+
logger2.info 'logger2'
|
429
|
+
end
|
377
430
|
end
|
431
|
+
|
432
|
+
threads.map(&:join)
|
378
433
|
end
|
379
|
-
end
|
434
|
+
end
|
435
|
+
|
436
|
+
describe 'it should respect loglevel precedence when logging' do
|
437
|
+
%w{debug info warn error}.each do |logger_method|
|
438
|
+
it "should not log #{logger_method} when level is higher" do
|
439
|
+
logger = Syslogger.new
|
440
|
+
logger.level = Logger::FATAL
|
441
|
+
expect(Syslog).to_not receive(:open).with($0, Syslog::LOG_PID | Syslog::LOG_CONS, nil).and_yield(fake_syslog)
|
442
|
+
expect(fake_syslog).to_not receive(:log).with(Syslog::LOG_NOTICE, 'Some message')
|
443
|
+
logger.send(logger_method.to_sym, 'Some message')
|
444
|
+
end
|
380
445
|
|
381
|
-
|
446
|
+
it "should not evaluate a block or log #{logger_method} when level is higher" do
|
447
|
+
logger = Syslogger.new
|
448
|
+
logger.level = Logger::FATAL
|
449
|
+
expect(Syslog).to_not receive(:open).with($0, Syslog::LOG_PID | Syslog::LOG_CONS, nil).and_yield(fake_syslog)
|
450
|
+
expect(fake_syslog).to_not receive(:log).with(Syslog::LOG_NOTICE, 'Some message')
|
451
|
+
logger.send(logger_method.to_sym) { violated 'This block should not have been called' }
|
452
|
+
end
|
453
|
+
end
|
454
|
+
end
|
455
|
+
end
|