syslogger 1.6.4 → 1.6.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![GitHub license](https://img.shields.io/github/license/crohr/syslogger.svg)](https://github.com/crohr/syslogger/blob/master/LICENSE)
|
4
|
+
[![GitHub release](https://img.shields.io/github/release/crohr/syslogger.svg)](https://github.com/crohr/syslogger/releases/latest)
|
5
|
+
[![Gem](https://img.shields.io/gem/v/syslogger.svg)](https://rubygems.org/gems/syslogger)
|
6
|
+
[![Gem](https://img.shields.io/gem/dtv/syslogger.svg)](https://rubygems.org/gems/syslogger)
|
7
|
+
[![Build Status](https://travis-ci.org/crohr/syslogger.svg?branch=master)](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
|