SyslogLogger 1.4.1 → 2.0
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.
- data/History.txt +3 -4
- data/Manifest.txt +1 -1
- data/README.txt +7 -46
- data/Rakefile +2 -3
- data/lib/syslog/logger.rb +194 -0
- data/test/test_syslog_logger.rb +59 -29
- metadata +54 -90
- data.tar.gz.sig +0 -4
- data/lib/syslog_logger.rb +0 -230
- metadata.gz.sig +0 -0
data/History.txt
CHANGED
data/Manifest.txt
CHANGED
data/README.txt
CHANGED
@@ -1,56 +1,17 @@
|
|
1
1
|
= SyslogLogger
|
2
2
|
|
3
|
-
|
4
|
-
Source :: https://github.com/seattlerb/sysloglogger
|
5
|
-
Bugtracker :: https://github.com/seattlerb/sysloglogger/issues
|
3
|
+
* http://github.com/seattlerb/sysloglogger
|
6
4
|
|
7
|
-
==
|
5
|
+
== Description
|
8
6
|
|
9
7
|
SyslogLogger is a Logger replacement that logs to syslog. It is almost
|
10
|
-
drop-in with a few
|
8
|
+
drop-in with a few caveats.
|
11
9
|
|
12
|
-
==
|
10
|
+
== About
|
13
11
|
|
14
|
-
|
15
|
-
* Logs to syslog(3) mapping Logger levels to syslog(3) levels
|
12
|
+
See SyslogLogger
|
16
13
|
|
17
|
-
==
|
14
|
+
== Install
|
18
15
|
|
19
|
-
|
20
|
-
|
21
|
-
logger = SyslogLogger.new 'your_application_name'
|
22
|
-
|
23
|
-
logger.info 'did something cool'
|
24
|
-
|
25
|
-
== INSTALL
|
26
|
-
|
27
|
-
gem install SyslogLogger
|
28
|
-
|
29
|
-
You may need to configure your syslog.conf to place application logs in a
|
30
|
-
particular file. See SyslogLogger for details.
|
31
|
-
|
32
|
-
== LICENSE
|
33
|
-
|
34
|
-
(The MIT License)
|
35
|
-
|
36
|
-
Copyright (c) Eric Hodel
|
37
|
-
|
38
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
39
|
-
a copy of this software and associated documentation files (the
|
40
|
-
'Software'), to deal in the Software without restriction, including
|
41
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
42
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
43
|
-
permit persons to whom the Software is furnished to do so, subject to
|
44
|
-
the following conditions:
|
45
|
-
|
46
|
-
The above copyright notice and this permission notice shall be
|
47
|
-
included in all copies or substantial portions of the Software.
|
48
|
-
|
49
|
-
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
50
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
51
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
52
|
-
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
53
|
-
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
54
|
-
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
55
|
-
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
16
|
+
sudo gem install SyslogLogger
|
56
17
|
|
data/Rakefile
CHANGED
@@ -2,14 +2,13 @@
|
|
2
2
|
|
3
3
|
require 'hoe'
|
4
4
|
|
5
|
-
Hoe.plugin :
|
5
|
+
Hoe.plugin :seattlerb
|
6
6
|
Hoe.plugin :git
|
7
7
|
|
8
8
|
Hoe.spec 'SyslogLogger' do
|
9
9
|
developer 'Eric Hodel', 'drbrain@segment7.net'
|
10
10
|
|
11
|
-
|
12
|
-
'docs.seattlerb.org:/data/www/docs.seattlerb.org/SyslogLogger'
|
11
|
+
self.rubyforge_name = 'seattlerb'
|
13
12
|
end
|
14
13
|
|
15
14
|
# vim: syntax=Ruby
|
@@ -0,0 +1,194 @@
|
|
1
|
+
require 'syslog'
|
2
|
+
require 'logger'
|
3
|
+
|
4
|
+
##
|
5
|
+
# Syslog::Logger is a Logger work-alike that logs via syslog instead of to a
|
6
|
+
# file. You can use Syslog::Logger to aggregate logs between multiple
|
7
|
+
# machines.
|
8
|
+
#
|
9
|
+
# By default, Syslog::Logger uses the program name 'ruby', but this can be
|
10
|
+
# changed via the first argument to Syslog::Logger.new.
|
11
|
+
#
|
12
|
+
# NOTE! You can only set the Syslog::Logger program name when you initialize
|
13
|
+
# Syslog::Logger for the first time. This is a limitation of the way
|
14
|
+
# Syslog::Logger uses syslog (and in some ways, a limitation of the way
|
15
|
+
# syslog(3) works). Attempts to change Syslog::Logger's program name after
|
16
|
+
# the first initialization will be ignored.
|
17
|
+
#
|
18
|
+
# === Example
|
19
|
+
#
|
20
|
+
# The following will log to syslogd on your local machine:
|
21
|
+
#
|
22
|
+
# require 'syslog/logger'
|
23
|
+
#
|
24
|
+
# log = Syslog::Logger.new 'my_program'
|
25
|
+
# log.info 'this line will be logged via syslog(3)'
|
26
|
+
#
|
27
|
+
# You may need to perform some syslog.conf setup first. For a BSD machine add
|
28
|
+
# the following lines to /etc/syslog.conf:
|
29
|
+
#
|
30
|
+
# !my_program
|
31
|
+
# *.* /var/log/my_program.log
|
32
|
+
#
|
33
|
+
# Then touch /var/log/my_program.log and signal syslogd with a HUP
|
34
|
+
# (killall -HUP syslogd, on FreeBSD).
|
35
|
+
#
|
36
|
+
# If you wish to have logs automatically roll over and archive, see the
|
37
|
+
# newsyslog.conf(5) and newsyslog(8) man pages.
|
38
|
+
|
39
|
+
class Syslog::Logger
|
40
|
+
# Default formatter for log messages.
|
41
|
+
class Formatter
|
42
|
+
def call severity, time, progname, msg
|
43
|
+
clean msg
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
##
|
49
|
+
# Clean up messages so they're nice and pretty.
|
50
|
+
|
51
|
+
def clean message
|
52
|
+
message = message.to_s.strip
|
53
|
+
message.gsub!(/\e\[[0-9;]*m/, '') # remove useless ansi color codes
|
54
|
+
return message
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
##
|
59
|
+
# The version of Syslog::Logger you are using.
|
60
|
+
|
61
|
+
VERSION = '2.0'
|
62
|
+
|
63
|
+
##
|
64
|
+
# Maps Logger warning types to syslog(3) warning types.
|
65
|
+
#
|
66
|
+
# Messages from ruby applications are not considered as critical as messages
|
67
|
+
# from other system daemons using syslog(3), so most messages are reduced by
|
68
|
+
# one level. For example, a fatal message for ruby's Logger is considered
|
69
|
+
# an error for syslog(3).
|
70
|
+
|
71
|
+
LEVEL_MAP = {
|
72
|
+
::Logger::UNKNOWN => Syslog::LOG_ALERT,
|
73
|
+
::Logger::FATAL => Syslog::LOG_ERR,
|
74
|
+
::Logger::ERROR => Syslog::LOG_WARNING,
|
75
|
+
::Logger::WARN => Syslog::LOG_NOTICE,
|
76
|
+
::Logger::INFO => Syslog::LOG_INFO,
|
77
|
+
::Logger::DEBUG => Syslog::LOG_DEBUG,
|
78
|
+
}
|
79
|
+
|
80
|
+
##
|
81
|
+
# Returns the internal Syslog object that is initialized when the
|
82
|
+
# first instance is created.
|
83
|
+
|
84
|
+
def self.syslog
|
85
|
+
@@syslog
|
86
|
+
end
|
87
|
+
|
88
|
+
##
|
89
|
+
# Specifies the internal Syslog object to be used.
|
90
|
+
|
91
|
+
def self.syslog= syslog
|
92
|
+
@@syslog = syslog
|
93
|
+
end
|
94
|
+
|
95
|
+
##
|
96
|
+
# Builds a methods for level +meth+.
|
97
|
+
|
98
|
+
def self.make_methods meth
|
99
|
+
level = ::Logger.const_get(meth.upcase)
|
100
|
+
eval <<-EOM, nil, __FILE__, __LINE__ + 1
|
101
|
+
def #{meth}(message = nil, &block)
|
102
|
+
add(#{level}, message, &block)
|
103
|
+
end
|
104
|
+
|
105
|
+
def #{meth}?
|
106
|
+
@level <= #{level}
|
107
|
+
end
|
108
|
+
EOM
|
109
|
+
end
|
110
|
+
|
111
|
+
##
|
112
|
+
# :method: unknown
|
113
|
+
#
|
114
|
+
# Logs a +message+ at the unknown (syslog alert) log level, or logs the
|
115
|
+
# message returned from the block.
|
116
|
+
|
117
|
+
##
|
118
|
+
# :method: fatal
|
119
|
+
#
|
120
|
+
# Logs a +message+ at the fatal (syslog err) log level, or logs the message
|
121
|
+
# returned from the block.
|
122
|
+
|
123
|
+
##
|
124
|
+
# :method: error
|
125
|
+
#
|
126
|
+
# Logs a +message+ at the error (syslog warning) log level, or logs the
|
127
|
+
# message returned from the block.
|
128
|
+
|
129
|
+
##
|
130
|
+
# :method: warn
|
131
|
+
#
|
132
|
+
# Logs a +message+ at the warn (syslog notice) log level, or logs the
|
133
|
+
# message returned from the block.
|
134
|
+
|
135
|
+
##
|
136
|
+
# :method: info
|
137
|
+
#
|
138
|
+
# Logs a +message+ at the info (syslog info) log level, or logs the message
|
139
|
+
# returned from the block.
|
140
|
+
|
141
|
+
##
|
142
|
+
# :method: debug
|
143
|
+
#
|
144
|
+
# Logs a +message+ at the debug (syslog debug) log level, or logs the
|
145
|
+
# message returned from the block.
|
146
|
+
|
147
|
+
Logger::Severity::constants.each do |severity|
|
148
|
+
make_methods severity.downcase
|
149
|
+
end
|
150
|
+
|
151
|
+
##
|
152
|
+
# Log level for Logger compatibility.
|
153
|
+
|
154
|
+
attr_accessor :level
|
155
|
+
|
156
|
+
# Logging formatter, as a +Proc+ that will take four arguments and
|
157
|
+
# return the formatted message. The arguments are:
|
158
|
+
#
|
159
|
+
# +severity+:: The Severity of the log message.
|
160
|
+
# +time+:: A Time instance representing when the message was logged.
|
161
|
+
# +progname+:: The #progname configured, or passed to the logger method.
|
162
|
+
# +msg+:: The _Object_ the user passed to the log message; not necessarily a
|
163
|
+
# String.
|
164
|
+
#
|
165
|
+
# The block should return an Object that can be written to the logging
|
166
|
+
# device via +write+. The default formatter is used when no formatter is
|
167
|
+
# set.
|
168
|
+
attr_accessor :formatter
|
169
|
+
|
170
|
+
##
|
171
|
+
# Fills in variables for Logger compatibility. If this is the first
|
172
|
+
# instance of Syslog::Logger, +program_name+ may be set to change the logged
|
173
|
+
# program name.
|
174
|
+
#
|
175
|
+
# Due to the way syslog works, only one program name may be chosen.
|
176
|
+
|
177
|
+
def initialize program_name = 'ruby'
|
178
|
+
@level = ::Logger::DEBUG
|
179
|
+
@formatter = Formatter.new
|
180
|
+
|
181
|
+
@@syslog ||= Syslog.open(program_name)
|
182
|
+
end
|
183
|
+
|
184
|
+
##
|
185
|
+
# Almost duplicates Logger#add. +progname+ is ignored.
|
186
|
+
|
187
|
+
def add severity, message = nil, progname = nil, &block
|
188
|
+
severity ||= ::Logger::UNKNOWN
|
189
|
+
@level <= severity and
|
190
|
+
@@syslog.log LEVEL_MAP[severity], '%s', formatter.call(severity, Time.now, progname, (message || block.call))
|
191
|
+
true
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
data/test/test_syslog_logger.rb
CHANGED
@@ -1,37 +1,52 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require 'tempfile'
|
3
|
-
|
3
|
+
begin
|
4
|
+
require 'syslog/logger'
|
5
|
+
rescue LoadError
|
6
|
+
# skip. see the bottom of this file.
|
7
|
+
end
|
8
|
+
|
9
|
+
# These tests ensure Syslog::Logger works like Logger
|
10
|
+
|
11
|
+
class TestSyslogRootLogger < Test::Unit::TestCase
|
4
12
|
|
5
|
-
module MockSyslog
|
13
|
+
module MockSyslog
|
14
|
+
LEVEL_LABEL_MAP = {}
|
6
15
|
|
7
|
-
class <<
|
16
|
+
class << self
|
8
17
|
|
9
|
-
|
18
|
+
@line = nil
|
10
19
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
20
|
+
%w[ALERT ERR WARNING NOTICE INFO DEBUG].each do |name|
|
21
|
+
level = Syslog.const_get("LOG_#{name}")
|
22
|
+
LEVEL_LABEL_MAP[level] = name
|
23
|
+
|
24
|
+
eval <<-EOM
|
25
|
+
def #{name.downcase}(format, *args)
|
26
|
+
log(#{level}, format, *args)
|
27
|
+
end
|
28
|
+
EOM
|
15
29
|
end
|
16
|
-
EOM
|
17
|
-
end
|
18
30
|
|
19
|
-
|
20
|
-
|
31
|
+
def log(level, format, *args)
|
32
|
+
@line = "#{LEVEL_LABEL_MAP[level]} - #{format % args}"
|
33
|
+
end
|
21
34
|
|
22
|
-
|
23
|
-
|
24
|
-
end
|
35
|
+
attr_reader :line
|
36
|
+
attr_reader :program_name
|
25
37
|
|
26
|
-
|
27
|
-
|
28
|
-
|
38
|
+
def open(program_name)
|
39
|
+
@program_name = program_name
|
40
|
+
end
|
29
41
|
|
30
|
-
|
42
|
+
def reset
|
43
|
+
@line = ''
|
44
|
+
end
|
31
45
|
|
32
|
-
|
46
|
+
end
|
47
|
+
end
|
33
48
|
|
34
|
-
|
49
|
+
Syslog::Logger.syslog = MockSyslog
|
35
50
|
|
36
51
|
LEVEL_LABEL_MAP = {
|
37
52
|
Logger::DEBUG => 'DEBUG',
|
@@ -77,6 +92,16 @@ class TestLogger < Test::Unit::TestCase
|
|
77
92
|
assert_equal Logger::DEBUG, @logger.level
|
78
93
|
end
|
79
94
|
|
95
|
+
def test_custom_formatter
|
96
|
+
@logger.formatter = Class.new {
|
97
|
+
def call severity, time, progname, msg
|
98
|
+
"hi mom!"
|
99
|
+
end
|
100
|
+
}.new
|
101
|
+
|
102
|
+
assert_match(/hi mom!/, log_raw(:fatal, 'fatal level message'))
|
103
|
+
end
|
104
|
+
|
80
105
|
def test_add
|
81
106
|
msg = log_add nil, 'unknown level message' # nil == unknown
|
82
107
|
assert_equal LEVEL_LABEL_MAP[Logger::UNKNOWN], msg.severity
|
@@ -443,24 +468,30 @@ class TestLogger < Test::Unit::TestCase
|
|
443
468
|
assert_equal false, @logger.debug?
|
444
469
|
end
|
445
470
|
|
446
|
-
end
|
471
|
+
end if defined?(Syslog)
|
447
472
|
|
448
|
-
class TestSyslogLogger <
|
473
|
+
class TestSyslogLogger < TestSyslogRootLogger
|
449
474
|
|
450
475
|
def setup
|
451
476
|
super
|
452
|
-
@logger =
|
477
|
+
@logger = Syslog::Logger.new
|
453
478
|
end
|
454
479
|
|
480
|
+
SEVERITY_MAP = {}.tap { |map|
|
481
|
+
level2severity = Syslog::Logger::LEVEL_MAP.invert
|
482
|
+
|
483
|
+
MockSyslog::LEVEL_LABEL_MAP.each { |level, name|
|
484
|
+
map[name] = TestSyslogRootLogger::LEVEL_LABEL_MAP[level2severity[level]]
|
485
|
+
}
|
486
|
+
}
|
487
|
+
|
455
488
|
class Log
|
456
489
|
attr_reader :line, :label, :datetime, :pid, :severity, :progname, :msg
|
457
490
|
def initialize(line)
|
458
491
|
@line = line
|
459
492
|
return unless /\A(\w+) - (.*)\Z/ =~ @line
|
460
493
|
severity, @msg = $1, $2
|
461
|
-
severity =
|
462
|
-
@severity = severity.to_s.upcase
|
463
|
-
@severity = 'ANY' if @severity == 'UNKNOWN'
|
494
|
+
@severity = SEVERITY_MAP[severity]
|
464
495
|
end
|
465
496
|
end
|
466
497
|
|
@@ -487,5 +518,4 @@ class TestSyslogLogger < TestLogger
|
|
487
518
|
assert_equal false, @logger.unknown?
|
488
519
|
end
|
489
520
|
|
490
|
-
end
|
491
|
-
|
521
|
+
end if defined?(Syslog)
|
metadata
CHANGED
@@ -1,129 +1,93 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: SyslogLogger
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '2.0'
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 4
|
9
|
-
- 1
|
10
|
-
version: 1.4.1
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Eric Hodel
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
|
-
cert_chain:
|
17
|
-
-
|
18
|
-
|
19
|
-
|
20
|
-
YWluMRgwFgYKCZImiZPyLGQBGRYIc2VnbWVudDcxEzARBgoJkiaJk/IsZAEZFgNu
|
21
|
-
ZXQwHhcNMTIwMjI4MTc1NDI1WhcNMTMwMjI3MTc1NDI1WjBBMRAwDgYDVQQDDAdk
|
22
|
-
cmJyYWluMRgwFgYKCZImiZPyLGQBGRYIc2VnbWVudDcxEzARBgoJkiaJk/IsZAEZ
|
23
|
-
FgNuZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCbbgLrGLGIDE76
|
24
|
-
LV/cvxdEzCuYuS3oG9PrSZnuDweySUfdp/so0cDq+j8bqy6OzZSw07gdjwFMSd6J
|
25
|
-
U5ddZCVywn5nnAQ+Ui7jMW54CYt5/H6f2US6U0hQOjJR6cpfiymgxGdfyTiVcvTm
|
26
|
-
Gj/okWrQl0NjYOYBpDi+9PPmaH2RmLJu0dB/NylsDnW5j6yN1BEI8MfJRR+HRKZY
|
27
|
-
mUtgzBwF1V4KIZQ8EuL6I/nHVu07i6IkrpAgxpXUfdJQJi0oZAqXurAV3yTxkFwd
|
28
|
-
g62YrrW26mDe+pZBzR6bpLE+PmXCzz7UxUq3AE0gPHbiMXie3EFE0oxnsU3lIduh
|
29
|
-
sCANiQ8BAgMBAAGjezB5MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
|
30
|
-
BBS5k4Z75VSpdM0AclG2UvzFA/VW5DAfBgNVHREEGDAWgRRkcmJyYWluQHNlZ21l
|
31
|
-
bnQ3Lm5ldDAfBgNVHRIEGDAWgRRkcmJyYWluQHNlZ21lbnQ3Lm5ldDANBgkqhkiG
|
32
|
-
9w0BAQUFAAOCAQEAPeWzFnrcvC6eVzdlhmjUub2s6qieBkongKRDHQz5MEeQv4LS
|
33
|
-
SARnoHY+uCAVL/1xGAhmpzqQ3fJGWK9eBacW/e8E5GF9xQcV3mE1bA0WNaiDlX5j
|
34
|
-
U2aI+ZGSblqvHUCxKBHR1s7UMHsbz1saOmgdRTyPx0juJs68ocbUTeYBLWu9V4KP
|
35
|
-
zdGAG2JXO2gONg3b4tYDvpBLbry+KOX27iAJulUaH9TiTOULL4ITJVFsK0mYVqmR
|
36
|
-
Q8Tno9S3e4XGGP1ZWfLrTWEJbavFfhGHut2iMRwfC7s/YILAHNATopaJdH9DNpd1
|
37
|
-
U81zGHMUBOvz/VGT6wJwYJ3emS2nfA2NOHFfgA==
|
38
|
-
-----END CERTIFICATE-----
|
39
|
-
|
40
|
-
date: 2012-03-22 00:00:00 Z
|
41
|
-
dependencies:
|
42
|
-
- !ruby/object:Gem::Dependency
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-10-05 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
43
15
|
name: rdoc
|
44
|
-
|
45
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
46
17
|
none: false
|
47
|
-
requirements:
|
18
|
+
requirements:
|
48
19
|
- - ~>
|
49
|
-
- !ruby/object:Gem::Version
|
50
|
-
|
51
|
-
segments:
|
52
|
-
- 3
|
53
|
-
- 10
|
54
|
-
version: "3.10"
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3.10'
|
55
22
|
type: :development
|
56
|
-
version_requirements: *id001
|
57
|
-
- !ruby/object:Gem::Dependency
|
58
|
-
name: hoe
|
59
23
|
prerelease: false
|
60
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
61
25
|
none: false
|
62
|
-
requirements:
|
26
|
+
requirements:
|
63
27
|
- - ~>
|
64
|
-
- !ruby/object:Gem::Version
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '3.10'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: hoe
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '3.0'
|
70
38
|
type: :development
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '3.0'
|
46
|
+
description: ! 'SyslogLogger is a Logger replacement that logs to syslog. It is almost
|
47
|
+
|
48
|
+
drop-in with a few caveats.'
|
49
|
+
email:
|
76
50
|
- drbrain@segment7.net
|
77
51
|
executables: []
|
78
|
-
|
79
52
|
extensions: []
|
80
|
-
|
81
|
-
extra_rdoc_files:
|
53
|
+
extra_rdoc_files:
|
82
54
|
- History.txt
|
83
55
|
- Manifest.txt
|
84
56
|
- README.txt
|
85
|
-
files:
|
57
|
+
files:
|
86
58
|
- History.txt
|
87
59
|
- Manifest.txt
|
88
60
|
- README.txt
|
89
61
|
- Rakefile
|
90
62
|
- lib/analyzer_tools/syslog_logger.rb
|
91
|
-
- lib/
|
63
|
+
- lib/syslog/logger.rb
|
92
64
|
- test/test_syslog_logger.rb
|
93
65
|
- .gemtest
|
94
|
-
homepage: http://
|
66
|
+
homepage: http://github.com/seattlerb/sysloglogger
|
95
67
|
licenses: []
|
96
|
-
|
97
68
|
post_install_message:
|
98
|
-
rdoc_options:
|
69
|
+
rdoc_options:
|
99
70
|
- --main
|
100
71
|
- README.txt
|
101
|
-
require_paths:
|
72
|
+
require_paths:
|
102
73
|
- lib
|
103
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
74
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
104
75
|
none: false
|
105
|
-
requirements:
|
106
|
-
- -
|
107
|
-
- !ruby/object:Gem::Version
|
108
|
-
|
109
|
-
|
110
|
-
- 0
|
111
|
-
version: "0"
|
112
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ! '>='
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
81
|
none: false
|
114
|
-
requirements:
|
115
|
-
- -
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
|
118
|
-
segments:
|
119
|
-
- 0
|
120
|
-
version: "0"
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
121
86
|
requirements: []
|
122
|
-
|
123
|
-
|
124
|
-
rubygems_version: 1.8.21
|
87
|
+
rubyforge_project: seattlerb
|
88
|
+
rubygems_version: 1.8.24
|
125
89
|
signing_key:
|
126
90
|
specification_version: 3
|
127
91
|
summary: SyslogLogger is a Logger replacement that logs to syslog
|
128
|
-
test_files:
|
92
|
+
test_files:
|
129
93
|
- test/test_syslog_logger.rb
|
data.tar.gz.sig
DELETED
data/lib/syslog_logger.rb
DELETED
@@ -1,230 +0,0 @@
|
|
1
|
-
require 'syslog'
|
2
|
-
require 'logger'
|
3
|
-
|
4
|
-
##
|
5
|
-
# SyslogLogger is a Logger work-alike that logs via syslog instead of to a
|
6
|
-
# file. You can add SyslogLogger to your Rails production environment to
|
7
|
-
# aggregate logs between multiple machines.
|
8
|
-
#
|
9
|
-
# By default, SyslogLogger uses the program name 'rails', but this can be
|
10
|
-
# changed via the first argument to SyslogLogger.new.
|
11
|
-
#
|
12
|
-
# NOTE! You can only set the SyslogLogger program name when you initialize
|
13
|
-
# SyslogLogger for the first time. This is a limitation of the way
|
14
|
-
# SyslogLogger uses syslog (and in some ways, a limitation of the way
|
15
|
-
# syslog(3) works). Attempts to change SyslogLogger's program name after the
|
16
|
-
# first initialization will be ignored.
|
17
|
-
#
|
18
|
-
# = Sample usage with Rails
|
19
|
-
#
|
20
|
-
# == config/environment/production.rb
|
21
|
-
#
|
22
|
-
# Add the following lines:
|
23
|
-
#
|
24
|
-
# require 'syslog_logger'
|
25
|
-
# RAILS_DEFAULT_LOGGER = SyslogLogger.new
|
26
|
-
#
|
27
|
-
# == config/environment.rb
|
28
|
-
#
|
29
|
-
# In 0.10.0, change this line:
|
30
|
-
#
|
31
|
-
# RAILS_DEFAULT_LOGGER = Logger.new("#{RAILS_ROOT}/log/#{RAILS_ENV}.log")
|
32
|
-
#
|
33
|
-
# to:
|
34
|
-
#
|
35
|
-
# RAILS_DEFAULT_LOGGER ||= Logger.new("#{RAILS_ROOT}/log/#{RAILS_ENV}.log")
|
36
|
-
#
|
37
|
-
# Other versions of Rails should have a similar change.
|
38
|
-
#
|
39
|
-
# == BSD syslog setup
|
40
|
-
#
|
41
|
-
# === /etc/syslog.conf
|
42
|
-
#
|
43
|
-
# Add the following lines:
|
44
|
-
#
|
45
|
-
# !rails
|
46
|
-
# *.* /var/log/production.log
|
47
|
-
#
|
48
|
-
# Then touch /var/log/production.log and signal syslogd with a HUP
|
49
|
-
# (killall -HUP syslogd, on FreeBSD).
|
50
|
-
#
|
51
|
-
# === /etc/newsyslog.conf
|
52
|
-
#
|
53
|
-
# Add the following line:
|
54
|
-
#
|
55
|
-
# /var/log/production.log 640 7 * @T00 Z
|
56
|
-
#
|
57
|
-
# This creates a log file that is rotated every day at midnight, gzip'd, then
|
58
|
-
# kept for 7 days. Consult newsyslog.conf(5) for more details.
|
59
|
-
#
|
60
|
-
# == syslog-ng setup
|
61
|
-
#
|
62
|
-
# === syslog-ng.conf
|
63
|
-
#
|
64
|
-
# destination rails_log { file("/var/log/production.log"); };
|
65
|
-
# filter f_rails { program("rails.*"); };
|
66
|
-
# log { source(src); filter(f_rails); destination(rails_log); };
|
67
|
-
#
|
68
|
-
# == Starting
|
69
|
-
#
|
70
|
-
# Now restart your Rails app. Your production logs should now be showing up
|
71
|
-
# in /var/log/production.log. If you have mulitple machines, you can log them
|
72
|
-
# all to a central machine with remote syslog logging for analysis. Consult
|
73
|
-
# your syslogd(8) manpage for further details.
|
74
|
-
|
75
|
-
class SyslogLogger
|
76
|
-
|
77
|
-
##
|
78
|
-
# The version of SyslogLogger you are using.
|
79
|
-
|
80
|
-
VERSION = '1.4.1'
|
81
|
-
|
82
|
-
##
|
83
|
-
# Maps Logger warning types to syslog(3) warning types.
|
84
|
-
#
|
85
|
-
# Messages from ruby applications are not considered as critical as messages
|
86
|
-
# from other processes using syslog(3), so most messages are reduced by one
|
87
|
-
# level. For example, a fatal message for ruby's Logger is considered an
|
88
|
-
# error for syslog(3).
|
89
|
-
|
90
|
-
LOGGER_MAP = {
|
91
|
-
:unknown => :alert,
|
92
|
-
:fatal => :err,
|
93
|
-
:error => :warning,
|
94
|
-
:warn => :notice,
|
95
|
-
:info => :info,
|
96
|
-
:debug => :debug,
|
97
|
-
}
|
98
|
-
|
99
|
-
##
|
100
|
-
# Maps Logger log levels to their values so we can silence.
|
101
|
-
|
102
|
-
LOGGER_LEVEL_MAP = {}
|
103
|
-
|
104
|
-
LOGGER_MAP.each_key do |key|
|
105
|
-
LOGGER_LEVEL_MAP[key] = Logger.const_get key.to_s.upcase
|
106
|
-
end
|
107
|
-
|
108
|
-
##
|
109
|
-
# Maps Logger log level values to syslog log levels.
|
110
|
-
|
111
|
-
LEVEL_LOGGER_MAP = {}
|
112
|
-
|
113
|
-
LOGGER_LEVEL_MAP.invert.each do |level, severity|
|
114
|
-
LEVEL_LOGGER_MAP[level] = LOGGER_MAP[severity]
|
115
|
-
end
|
116
|
-
|
117
|
-
##
|
118
|
-
# Builds a methods for level +meth+.
|
119
|
-
|
120
|
-
def self.make_methods(meth)
|
121
|
-
eval <<-EOM, nil, __FILE__, __LINE__ + 1
|
122
|
-
def #{meth}(message = nil)
|
123
|
-
return true if #{LOGGER_LEVEL_MAP[meth]} < @level
|
124
|
-
SYSLOG.#{LOGGER_MAP[meth]} clean(message || yield)
|
125
|
-
return true
|
126
|
-
end
|
127
|
-
|
128
|
-
def #{meth}?
|
129
|
-
@level <= Logger::#{meth.to_s.upcase}
|
130
|
-
end
|
131
|
-
EOM
|
132
|
-
end
|
133
|
-
|
134
|
-
##
|
135
|
-
# :method: unknown
|
136
|
-
#
|
137
|
-
# Logs a +message+ at the unknown (syslog alert) log level, or logs the
|
138
|
-
# message returned from the block.
|
139
|
-
|
140
|
-
##
|
141
|
-
# :method: fatal
|
142
|
-
#
|
143
|
-
# Logs a +message+ at the fatal (syslog err) log level, or logs the message
|
144
|
-
# returned from the block.
|
145
|
-
|
146
|
-
##
|
147
|
-
# :method: error
|
148
|
-
#
|
149
|
-
# Logs a +message+ at the error (syslog warning) log level, or logs the
|
150
|
-
# message returned from the block.
|
151
|
-
|
152
|
-
##
|
153
|
-
# :method: warn
|
154
|
-
#
|
155
|
-
# Logs a +message+ at the warn (syslog notice) log level, or logs the
|
156
|
-
# message returned from the block.
|
157
|
-
|
158
|
-
##
|
159
|
-
# :method: info
|
160
|
-
#
|
161
|
-
# Logs a +message+ at the info (syslog info) log level, or logs the message
|
162
|
-
# returned from the block.
|
163
|
-
|
164
|
-
##
|
165
|
-
# :method: debug
|
166
|
-
#
|
167
|
-
# Logs a +message+ at the debug (syslog debug) log level, or logs the
|
168
|
-
# message returned from the block.
|
169
|
-
|
170
|
-
LOGGER_MAP.each_key do |level|
|
171
|
-
make_methods level
|
172
|
-
end
|
173
|
-
|
174
|
-
##
|
175
|
-
# Log level for Logger compatibility.
|
176
|
-
|
177
|
-
attr_accessor :level
|
178
|
-
|
179
|
-
##
|
180
|
-
# Fills in variables for Logger compatibility. If this is the first
|
181
|
-
# instance of SyslogLogger, +program_name+ may be set to change the logged
|
182
|
-
# program name.
|
183
|
-
#
|
184
|
-
# Due to the way syslog works, only one program name may be chosen.
|
185
|
-
|
186
|
-
def initialize(program_name = 'rails')
|
187
|
-
@level = Logger::DEBUG
|
188
|
-
|
189
|
-
return if defined? SYSLOG
|
190
|
-
self.class.const_set :SYSLOG, Syslog.open(program_name)
|
191
|
-
end
|
192
|
-
|
193
|
-
##
|
194
|
-
# Almost duplicates Logger#add. +progname+ is ignored.
|
195
|
-
|
196
|
-
def add(severity, message = nil, progname = nil, &block)
|
197
|
-
severity ||= Logger::UNKNOWN
|
198
|
-
return true if severity < @level
|
199
|
-
SYSLOG.send LEVEL_LOGGER_MAP[severity], clean(message || block.call)
|
200
|
-
return true
|
201
|
-
end
|
202
|
-
|
203
|
-
##
|
204
|
-
# Allows messages of a particular log level to be ignored temporarily.
|
205
|
-
#
|
206
|
-
# Can you say "Broken Windows"?
|
207
|
-
|
208
|
-
def silence(temporary_level = Logger::ERROR)
|
209
|
-
old_logger_level = @level
|
210
|
-
@level = temporary_level
|
211
|
-
yield
|
212
|
-
ensure
|
213
|
-
@level = old_logger_level
|
214
|
-
end
|
215
|
-
|
216
|
-
private
|
217
|
-
|
218
|
-
##
|
219
|
-
# Clean up messages so they're nice and pretty.
|
220
|
-
|
221
|
-
def clean(message)
|
222
|
-
message = message.to_s.dup
|
223
|
-
message.strip!
|
224
|
-
message.gsub!(/%/, '%%') # syslog(3) freaks on % (printf)
|
225
|
-
message.gsub!(/\e\[[^m]*m/, '') # remove useless ansi color codes
|
226
|
-
return message
|
227
|
-
end
|
228
|
-
|
229
|
-
end
|
230
|
-
|
metadata.gz.sig
DELETED
Binary file
|