yell-adapters-syslog 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/Rakefile +1 -0
- data/lib/yell-adapters-syslog.rb +30 -0
- data/lib/yell/adapters/syslog.rb +150 -0
- data/lib/yell/adapters/syslog/version.rb +12 -0
- data/spec/spec_helper.rb +14 -0
- data/spec/yell/adapters/syslog_spec.rb +120 -0
- data/yell-adapters-syslog.gemspec +24 -0
- metadata +90 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
Copyright (c) 2012 Rudolf Schmidt
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# Copyright (c) 2012 Rudolf Schmidt
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
# a copy of this software and associated documentation files (the
|
7
|
+
# "Software"), to deal in the Software without restriction, including
|
8
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
# the following conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be
|
14
|
+
# included in all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
|
24
|
+
require 'yell'
|
25
|
+
|
26
|
+
require File.dirname(__FILE__) + '/yell/adapters/syslog'
|
27
|
+
|
28
|
+
module Yell #:nodoc:
|
29
|
+
end
|
30
|
+
|
@@ -0,0 +1,150 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'syslog'
|
4
|
+
|
5
|
+
module Yell #:nodoc:
|
6
|
+
module Adapters #:nodoc:
|
7
|
+
|
8
|
+
class Syslog < Yell::Adapters::Base
|
9
|
+
|
10
|
+
# Syslog severities
|
11
|
+
#
|
12
|
+
# `man syslog` to see the severities
|
13
|
+
Severities = [7, 6, 4, 3, 2, 1]
|
14
|
+
|
15
|
+
# Map Syslog severities to internal represenation
|
16
|
+
# 'DEBUG' => 7
|
17
|
+
# 'INFO' => 6
|
18
|
+
# 'WARN' => 4
|
19
|
+
# 'ERROR' => 3
|
20
|
+
# 'FATAL' => 2
|
21
|
+
# 'UNKNOWN' => 1
|
22
|
+
SeverityMap = Hash[ *(Yell::Severities.zip(Severities).flatten) ]
|
23
|
+
|
24
|
+
# Map Syslog options to internal representation
|
25
|
+
OptionMap = {
|
26
|
+
:cons => ::Syslog::LOG_CONS,
|
27
|
+
:ndelay => ::Syslog::LOG_NDELAY,
|
28
|
+
:nowait => ::Syslog::LOG_NOWAIT,
|
29
|
+
:odelay => ::Syslog::LOG_ODELAY,
|
30
|
+
:perror => ::Syslog::LOG_PERROR,
|
31
|
+
:pid => ::Syslog::LOG_PID
|
32
|
+
}
|
33
|
+
|
34
|
+
# Map Syslog facilities to internal represenation
|
35
|
+
FacilityMap = {
|
36
|
+
:auth => ::Syslog::LOG_AUTH,
|
37
|
+
:authpriv => ::Syslog::LOG_AUTHPRIV,
|
38
|
+
# :console => ::Syslog::LOG_CONSOLE, # described in 1.9.3 docu, but not defined
|
39
|
+
:cron => ::Syslog::LOG_CRON,
|
40
|
+
:daemon => ::Syslog::LOG_DAEMON,
|
41
|
+
:ftp => ::Syslog::LOG_FTP,
|
42
|
+
:kern => ::Syslog::LOG_KERN,
|
43
|
+
# :lrp => ::Syslog::LOG_LRP, # described in 1.9.3 docu, but not defined
|
44
|
+
:mail => ::Syslog::LOG_MAIL,
|
45
|
+
:news => ::Syslog::LOG_NEWS,
|
46
|
+
# :ntp => ::Syslog::LOG_NTP, # described in 1.9.3 docu, but not defined
|
47
|
+
# :security => ::Syslog::LOG_SECURITY, # described in 1.9.3 docu, but not defined
|
48
|
+
:syslog => ::Syslog::LOG_SYSLOG,
|
49
|
+
:user => ::Syslog::LOG_USER,
|
50
|
+
:uucp => ::Syslog::LOG_UUCP,
|
51
|
+
:local0 => ::Syslog::LOG_LOCAL0,
|
52
|
+
:local1 => ::Syslog::LOG_LOCAL1,
|
53
|
+
:local2 => ::Syslog::LOG_LOCAL2,
|
54
|
+
:local3 => ::Syslog::LOG_LOCAL3,
|
55
|
+
:local4 => ::Syslog::LOG_LOCAL4,
|
56
|
+
:local5 => ::Syslog::LOG_LOCAL5,
|
57
|
+
:local6 => ::Syslog::LOG_LOCAL6,
|
58
|
+
:local7 => ::Syslog::LOG_LOCAL7
|
59
|
+
}
|
60
|
+
|
61
|
+
def initialize( options = {}, &block )
|
62
|
+
ident options[:ident] || $0
|
63
|
+
options options[:options] || [:pid, :cons]
|
64
|
+
facility options[:facility]
|
65
|
+
|
66
|
+
super( options, &block )
|
67
|
+
end
|
68
|
+
|
69
|
+
def stream
|
70
|
+
@stream ||= _new_stream
|
71
|
+
end
|
72
|
+
|
73
|
+
def close
|
74
|
+
@stream.close if @stream.respond_to? :close
|
75
|
+
rescue
|
76
|
+
# do nothing
|
77
|
+
ensure
|
78
|
+
@stream = nil
|
79
|
+
end
|
80
|
+
|
81
|
+
# Identify the calling program
|
82
|
+
def ident( val = nil )
|
83
|
+
@ident = val
|
84
|
+
end
|
85
|
+
|
86
|
+
# Set the log facility for Syslog
|
87
|
+
#
|
88
|
+
# See {Yell::Adapters::Syslog::OptionMap OptionMap} for allowed values.
|
89
|
+
#
|
90
|
+
# @example Direct or Symbol
|
91
|
+
# facility( Syslog::LOG_NDELAY )
|
92
|
+
# facility( :ndelay )
|
93
|
+
#
|
94
|
+
# @example Multiple
|
95
|
+
# facility( :ndelay, Syslog::LOG_NDELAY ):
|
96
|
+
def options( *values )
|
97
|
+
@syslog_options = values.flatten.map do |v|
|
98
|
+
v.is_a?(Symbol) ? OptionMap[v] : v
|
99
|
+
end.inject { |a, b| a | b }
|
100
|
+
end
|
101
|
+
|
102
|
+
# Set the log facility for Syslog
|
103
|
+
#
|
104
|
+
# See {Yell::Adapters::Syslog::FacilityMap FacilityMap} for allowed values.
|
105
|
+
# @example Direct or Symbol
|
106
|
+
# facility( :user )
|
107
|
+
# facility( Syslog::LOG_CONSOLE )
|
108
|
+
#
|
109
|
+
# @example Multiple
|
110
|
+
# facility( :user, Syslog::LOG_CONSOLE )
|
111
|
+
def facility( *values )
|
112
|
+
@facility = values.flatten.map do |v|
|
113
|
+
v.is_a?(Symbol) ? FacilityMap[v] : v
|
114
|
+
end.inject { |a, b| a | b }
|
115
|
+
end
|
116
|
+
|
117
|
+
|
118
|
+
private
|
119
|
+
|
120
|
+
def write!( event )
|
121
|
+
stream.log( SeverityMap[event.level], clean(event.message) )
|
122
|
+
rescue Exception => e
|
123
|
+
close
|
124
|
+
|
125
|
+
# re-raise the exception
|
126
|
+
raise( e )
|
127
|
+
end
|
128
|
+
|
129
|
+
def _new_stream
|
130
|
+
return ::Syslog if ::Syslog.opened?
|
131
|
+
|
132
|
+
::Syslog.open( @ident, @syslog_options, @facility )
|
133
|
+
end
|
134
|
+
|
135
|
+
# Borrowed from [SyslogLogger](https://github.com/seattlerb/sysloglogger)
|
136
|
+
def clean( message )
|
137
|
+
message = message.to_s.dup
|
138
|
+
message.strip!
|
139
|
+
message.gsub!(/%/, '%%') # syslog(3) freaks on % (printf)
|
140
|
+
message.gsub!(/\e\[[^m]*m/, '') # remove useless ansi color codes
|
141
|
+
|
142
|
+
message
|
143
|
+
end
|
144
|
+
|
145
|
+
end
|
146
|
+
|
147
|
+
register( :syslog, Yell::Adapters::Syslog )
|
148
|
+
|
149
|
+
end
|
150
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
$:.unshift File.expand_path('..', __FILE__)
|
2
|
+
$:.unshift File.expand_path('../../lib', __FILE__)
|
3
|
+
|
4
|
+
require 'yell-adapters-syslog'
|
5
|
+
|
6
|
+
require 'rspec'
|
7
|
+
require 'rr'
|
8
|
+
require 'timecop'
|
9
|
+
|
10
|
+
RSpec.configure do |config|
|
11
|
+
config.mock_framework = :rr
|
12
|
+
|
13
|
+
end
|
14
|
+
|
@@ -0,0 +1,120 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Yell::Adapters::Syslog do
|
4
|
+
before do
|
5
|
+
Syslog.close if Syslog.opened?
|
6
|
+
end
|
7
|
+
|
8
|
+
shared_examples_for "a Syslog adapter" do
|
9
|
+
let( :adapter ) { Yell::Adapters::Syslog.new }
|
10
|
+
|
11
|
+
it "should call Syslog correctly" do
|
12
|
+
mock( Syslog ).log( Yell::Adapters::Syslog::SeverityMap[subject], "Hello World" )
|
13
|
+
|
14
|
+
adapter.write Yell::Event.new( subject, "Hello World" )
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
it_behaves_like( "a Syslog adapter" ) { subject { 'DEBUG' } }
|
19
|
+
it_behaves_like( "a Syslog adapter" ) { subject { 'INFO' } }
|
20
|
+
it_behaves_like( "a Syslog adapter" ) { subject { 'WARN' } }
|
21
|
+
it_behaves_like( "a Syslog adapter" ) { subject { 'ERROR' } }
|
22
|
+
it_behaves_like( "a Syslog adapter" ) { subject { 'FATAL' } }
|
23
|
+
it_behaves_like( "a Syslog adapter" ) { subject { 'UNKNOWN' } }
|
24
|
+
|
25
|
+
context "a new Yell::Adapters::Syslog instance" do
|
26
|
+
subject { Yell::Adapters::Syslog.new }
|
27
|
+
|
28
|
+
it { subject.instance_variable_get(:@ident).should == $0 }
|
29
|
+
it { subject.instance_variable_get(:@syslog_options).should == (Syslog::LOG_PID | Syslog::LOG_CONS) }
|
30
|
+
it { subject.instance_variable_get(:@facility).should be_nil }
|
31
|
+
end
|
32
|
+
|
33
|
+
context "OptionMap" do
|
34
|
+
subject { Yell::Adapters::Syslog::OptionMap }
|
35
|
+
|
36
|
+
it { subject[:cons].should == Syslog::LOG_CONS }
|
37
|
+
it { subject[:ndelay].should == Syslog::LOG_NDELAY }
|
38
|
+
it { subject[:nowait].should == Syslog::LOG_NOWAIT }
|
39
|
+
it { subject[:odelay].should == Syslog::LOG_ODELAY }
|
40
|
+
it { subject[:perror].should == Syslog::LOG_PERROR }
|
41
|
+
it { subject[:pid].should == Syslog::LOG_PID }
|
42
|
+
end
|
43
|
+
|
44
|
+
context "FacilityMap" do
|
45
|
+
subject { Yell::Adapters::Syslog::FacilityMap }
|
46
|
+
|
47
|
+
# :console => ::Syslog::LOG_CONSOLE, # described in 1.9.3 docu, but not defined
|
48
|
+
# :lrp => ::Syslog::LOG_LRP, # described in 1.9.3 docu, but not defined
|
49
|
+
# :ntp => ::Syslog::LOG_NTP, # described in 1.9.3 docu, but not defined
|
50
|
+
# :security => ::Syslog::LOG_SECURITY, # described in 1.9.3 docu, but not defined
|
51
|
+
it { subject[:auth].should == Syslog::LOG_AUTH }
|
52
|
+
it { subject[:authpriv].should == Syslog::LOG_AUTHPRIV }
|
53
|
+
it { subject[:cron].should == Syslog::LOG_CRON }
|
54
|
+
it { subject[:daemon].should == Syslog::LOG_DAEMON }
|
55
|
+
it { subject[:ftp].should == Syslog::LOG_FTP }
|
56
|
+
it { subject[:kern].should == Syslog::LOG_KERN }
|
57
|
+
it { subject[:mail].should == Syslog::LOG_MAIL }
|
58
|
+
it { subject[:news].should == Syslog::LOG_NEWS }
|
59
|
+
it { subject[:syslog].should == Syslog::LOG_SYSLOG }
|
60
|
+
it { subject[:user].should == Syslog::LOG_USER }
|
61
|
+
it { subject[:uucp].should == Syslog::LOG_UUCP }
|
62
|
+
it { subject[:local0].should == Syslog::LOG_LOCAL0 }
|
63
|
+
it { subject[:local1].should == Syslog::LOG_LOCAL1 }
|
64
|
+
it { subject[:local2].should == Syslog::LOG_LOCAL2 }
|
65
|
+
it { subject[:local3].should == Syslog::LOG_LOCAL3 }
|
66
|
+
it { subject[:local4].should == Syslog::LOG_LOCAL4 }
|
67
|
+
it { subject[:local5].should == Syslog::LOG_LOCAL5 }
|
68
|
+
it { subject[:local6].should == Syslog::LOG_LOCAL6 }
|
69
|
+
it { subject[:local7].should == Syslog::LOG_LOCAL7 }
|
70
|
+
end
|
71
|
+
|
72
|
+
context :ident do
|
73
|
+
subject { Yell::Adapters::Syslog.new }
|
74
|
+
|
75
|
+
it "should be passed" do
|
76
|
+
mock.proxy( Syslog ).open( "my ident", anything, anything )
|
77
|
+
|
78
|
+
subject.ident "my ident"
|
79
|
+
subject.write Yell::Event.new("INFO", "Hello World")
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context :options do
|
84
|
+
subject { Yell::Adapters::Syslog.new }
|
85
|
+
|
86
|
+
it "should be passed" do
|
87
|
+
mock.proxy( Syslog ).open( anything, Syslog::LOG_NDELAY, anything )
|
88
|
+
|
89
|
+
subject.options :ndelay
|
90
|
+
subject.write Yell::Event.new("INFO", "Hello World")
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should work with multiple params" do
|
94
|
+
mock.proxy( Syslog ).open( anything, Syslog::LOG_PID|Syslog::LOG_NDELAY, anything )
|
95
|
+
|
96
|
+
subject.options :pid, :ndelay
|
97
|
+
subject.write Yell::Event.new("INFO", "Hello World")
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
context :facility do
|
102
|
+
subject { Yell::Adapters::Syslog.new }
|
103
|
+
|
104
|
+
it "should be passed" do
|
105
|
+
mock.proxy( Syslog ).open( anything, anything, Syslog::LOG_USER )
|
106
|
+
|
107
|
+
subject.facility :user
|
108
|
+
subject.write Yell::Event.new("INFO", "Hello World")
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should work with multiple params" do
|
112
|
+
mock.proxy( Syslog ).open( anything, anything, Syslog::LOG_DAEMON|Syslog::LOG_USER )
|
113
|
+
|
114
|
+
subject.facility :daemon, :user
|
115
|
+
subject.write Yell::Event.new("INFO", "Hello World")
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "yell/adapters/syslog/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "yell-adapters-syslog"
|
7
|
+
s.version = Yell::Adapters::Syslog::VERSION
|
8
|
+
s.authors = ["Rudolf Schmidt"]
|
9
|
+
|
10
|
+
s.homepage = "http://rubygems.org/gems/yell"
|
11
|
+
s.summary = %q{Yell - Your Extensible Logging Library }
|
12
|
+
s.description = %q{Syslog adapter for Yell}
|
13
|
+
|
14
|
+
s.rubyforge_project = "yell"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_runtime_dependency "yell", "~> 0.4"
|
22
|
+
s.add_development_dependency "rspec"
|
23
|
+
s.add_development_dependency "rr"
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: yell-adapters-syslog
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.4.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Rudolf Schmidt
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-04-01 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: yell
|
16
|
+
requirement: &70357165504240 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0.4'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70357165504240
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rspec
|
27
|
+
requirement: &70357165503840 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70357165503840
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rr
|
38
|
+
requirement: &70357165503380 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70357165503380
|
47
|
+
description: Syslog adapter for Yell
|
48
|
+
email:
|
49
|
+
executables: []
|
50
|
+
extensions: []
|
51
|
+
extra_rdoc_files: []
|
52
|
+
files:
|
53
|
+
- .gitignore
|
54
|
+
- Gemfile
|
55
|
+
- LICENSE.txt
|
56
|
+
- Rakefile
|
57
|
+
- lib/yell-adapters-syslog.rb
|
58
|
+
- lib/yell/adapters/syslog.rb
|
59
|
+
- lib/yell/adapters/syslog/version.rb
|
60
|
+
- spec/spec_helper.rb
|
61
|
+
- spec/yell/adapters/syslog_spec.rb
|
62
|
+
- yell-adapters-syslog.gemspec
|
63
|
+
homepage: http://rubygems.org/gems/yell
|
64
|
+
licenses: []
|
65
|
+
post_install_message:
|
66
|
+
rdoc_options: []
|
67
|
+
require_paths:
|
68
|
+
- lib
|
69
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ! '>='
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
76
|
+
none: false
|
77
|
+
requirements:
|
78
|
+
- - ! '>='
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '0'
|
81
|
+
requirements: []
|
82
|
+
rubyforge_project: yell
|
83
|
+
rubygems_version: 1.8.17
|
84
|
+
signing_key:
|
85
|
+
specification_version: 3
|
86
|
+
summary: Yell - Your Extensible Logging Library
|
87
|
+
test_files:
|
88
|
+
- spec/spec_helper.rb
|
89
|
+
- spec/yell/adapters/syslog_spec.rb
|
90
|
+
has_rdoc:
|