syslog-logger 1.6.7 → 1.6.8
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/lib/syslog-formatter.rb +40 -0
- data/lib/syslog-logger.rb +161 -0
- metadata +4 -2
@@ -0,0 +1,40 @@
|
|
1
|
+
# Adds some default information to syslog messages.
|
2
|
+
# Log format:
|
3
|
+
# [Time.mSec] [SeverityLabel]: message
|
4
|
+
|
5
|
+
class Logger::SyslogFormatter < Logger::Formatter
|
6
|
+
Format = "[%s] [%5s]: %s\n"
|
7
|
+
|
8
|
+
attr_accessor :datetime_format
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@datetime_format = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def call(severity, time, progname, msg)
|
15
|
+
Format % [format_datetime(time), severity, msg2str(msg)]
|
16
|
+
end
|
17
|
+
|
18
|
+
protected
|
19
|
+
|
20
|
+
def format_datetime(time)
|
21
|
+
if @datetime_format.nil?
|
22
|
+
time.strftime("%H:%M:%S.") << "%06d " % time.usec
|
23
|
+
else
|
24
|
+
time.strftime(@datetime_format)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def msg2str(msg)
|
29
|
+
case msg
|
30
|
+
when ::String
|
31
|
+
msg
|
32
|
+
when ::Exception
|
33
|
+
"#{ msg.message } (#{ msg.class })\n" <<
|
34
|
+
(msg.backtrace || []).join("\n")
|
35
|
+
else
|
36
|
+
msg.inspect
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,161 @@
|
|
1
|
+
require 'syslog'
|
2
|
+
require 'logger'
|
3
|
+
require 'syslog-formatter'
|
4
|
+
|
5
|
+
class Logger::Syslog
|
6
|
+
include Logger::Severity
|
7
|
+
|
8
|
+
# The version of Logger::Syslog you are using.
|
9
|
+
VERSION = '1.6.8'
|
10
|
+
|
11
|
+
# From 'man syslog.h':
|
12
|
+
# LOG_EMERG A panic condition was reported to all processes.
|
13
|
+
# LOG_ALERT A condition that should be corrected immediately.
|
14
|
+
# LOG_CRIT A critical condition.
|
15
|
+
# LOG_ERR An error message.
|
16
|
+
# LOG_WARNING A warning message.
|
17
|
+
# LOG_NOTICE A condition requiring special handling.
|
18
|
+
# LOG_INFO A general information message.
|
19
|
+
# LOG_DEBUG A message useful for debugging programs.
|
20
|
+
|
21
|
+
# From logger rdoc:
|
22
|
+
# FATAL: an unhandleable error that results in a program crash
|
23
|
+
# ERROR: a handleable error condition
|
24
|
+
# WARN: a warning
|
25
|
+
# INFO: generic (useful) information about system operation
|
26
|
+
# DEBUG: low-level information for developers
|
27
|
+
|
28
|
+
# Maps Logger warning types to syslog(3) warning types.
|
29
|
+
LOGGER_MAP = {
|
30
|
+
:unknown => :alert,
|
31
|
+
:fatal => :crit,
|
32
|
+
:error => :err,
|
33
|
+
:warn => :warning,
|
34
|
+
:info => :info,
|
35
|
+
:debug => :debug
|
36
|
+
}
|
37
|
+
|
38
|
+
# Maps Logger log levels to their values so we can silence.
|
39
|
+
LOGGER_LEVEL_MAP = {}
|
40
|
+
|
41
|
+
LOGGER_MAP.each_key do |key|
|
42
|
+
LOGGER_LEVEL_MAP[key] = Logger.const_get key.to_s.upcase
|
43
|
+
end
|
44
|
+
|
45
|
+
# Maps Logger log level values to syslog log levels.
|
46
|
+
LEVEL_LOGGER_MAP = {}
|
47
|
+
|
48
|
+
LOGGER_LEVEL_MAP.invert.each do |level, severity|
|
49
|
+
LEVEL_LOGGER_MAP[level] = LOGGER_MAP[severity]
|
50
|
+
end
|
51
|
+
|
52
|
+
# Builds a methods for level +meth+.
|
53
|
+
for severity in Logger::Severity.constants
|
54
|
+
class_eval <<-EOT, __FILE__, __LINE__
|
55
|
+
def #{severity.downcase}(message = nil, progname = nil, &block) # def debug(message = nil, progname = nil, &block)
|
56
|
+
add(#{severity}, message, progname, &block) # add(DEBUG, message, progname, &block)
|
57
|
+
end # end
|
58
|
+
#
|
59
|
+
def #{severity.downcase}? # def debug?
|
60
|
+
@level <= #{severity} # @level <= DEBUG
|
61
|
+
end # end
|
62
|
+
EOT
|
63
|
+
end
|
64
|
+
|
65
|
+
# Log level for Logger compatibility.
|
66
|
+
attr_accessor :level
|
67
|
+
|
68
|
+
# Logging program name.
|
69
|
+
attr_accessor :progname
|
70
|
+
|
71
|
+
# Logging date-time format (string passed to +strftime+).
|
72
|
+
def datetime_format=(datetime_format)
|
73
|
+
@default_formatter.datetime_format = datetime_format
|
74
|
+
end
|
75
|
+
|
76
|
+
def datetime_format
|
77
|
+
@default_formatter.datetime_format
|
78
|
+
end
|
79
|
+
|
80
|
+
# Logging formatter. formatter#call is invoked with 4 arguments; severity,
|
81
|
+
# time, progname and msg for each log. Bear in mind that time is a Time and
|
82
|
+
# msg is an Object that user passed and it could not be a String. It is
|
83
|
+
# expected to return a logdev#write-able Object. Default formatter is used
|
84
|
+
# when no formatter is set.
|
85
|
+
attr_accessor :formatter
|
86
|
+
|
87
|
+
alias sev_threshold level
|
88
|
+
alias sev_threshold= level=
|
89
|
+
|
90
|
+
# Fills in variables for Logger compatibility. If this is the first
|
91
|
+
# instance of Logger::Syslog, +program_name+ may be set to change the logged
|
92
|
+
# program name and +facility+ may be set to specify a custom facility
|
93
|
+
# with your syslog daemon.
|
94
|
+
#
|
95
|
+
# Due to the way syslog works, only one program name may be chosen.
|
96
|
+
def initialize(program_name = 'rails', facility = Syslog::LOG_USER, logopts=nil)
|
97
|
+
@default_formatter = Logger::SyslogFormatter.new
|
98
|
+
@formatter = nil
|
99
|
+
@progname = nil
|
100
|
+
@level = Logger::DEBUG
|
101
|
+
|
102
|
+
return if defined? SYSLOG
|
103
|
+
self.class.const_set :SYSLOG, Syslog.open(program_name, logopts, facility)
|
104
|
+
end
|
105
|
+
|
106
|
+
# Almost duplicates Logger#add. +progname+ is ignored.
|
107
|
+
def add(severity, message = nil, progname = nil, &block)
|
108
|
+
severity ||= Logger::UNKNOWN
|
109
|
+
if severity < @level
|
110
|
+
return true
|
111
|
+
end
|
112
|
+
if message.nil?
|
113
|
+
if block_given?
|
114
|
+
message = yield
|
115
|
+
else
|
116
|
+
message = progname
|
117
|
+
progname = @progname
|
118
|
+
end
|
119
|
+
end
|
120
|
+
SYSLOG.send(LEVEL_LOGGER_MAP[severity], format_message(format_severity(severity), Time.now, progname, clean(message)))
|
121
|
+
true
|
122
|
+
end
|
123
|
+
|
124
|
+
# Allows messages of a particular log level to be ignored temporarily.
|
125
|
+
def silence(temporary_level = Logger::ERROR)
|
126
|
+
old_logger_level = @level
|
127
|
+
@level = temporary_level
|
128
|
+
yield
|
129
|
+
ensure
|
130
|
+
@level = old_logger_level
|
131
|
+
end
|
132
|
+
|
133
|
+
# In Logger, this dumps the raw message; the closest equivalent
|
134
|
+
# would be Logger::UNKNOWN
|
135
|
+
def <<(message)
|
136
|
+
add(Logger::UNKNOWN, message)
|
137
|
+
end
|
138
|
+
|
139
|
+
private
|
140
|
+
|
141
|
+
# Severity label for logging. (max 5 char)
|
142
|
+
SEV_LABEL = %w(DEBUG INFO WARN ERROR FATAL ANY)
|
143
|
+
|
144
|
+
def format_severity(severity)
|
145
|
+
SEV_LABEL[severity] || 'ANY'
|
146
|
+
end
|
147
|
+
|
148
|
+
def format_message(severity, datetime, progname, msg)
|
149
|
+
(@formatter || @default_formatter).call(severity, datetime, progname, msg)
|
150
|
+
end
|
151
|
+
|
152
|
+
# Clean up messages so they're nice and pretty.
|
153
|
+
def clean(message)
|
154
|
+
message = message.to_s.dup
|
155
|
+
message.strip!
|
156
|
+
message.gsub!(/%/, '%%') # syslog(3) freaks on % (printf)
|
157
|
+
message.gsub!(/\e\[[^m]*m/, '') # remove useless ansi color codes
|
158
|
+
return message
|
159
|
+
end
|
160
|
+
|
161
|
+
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 1
|
7
7
|
- 6
|
8
|
-
-
|
9
|
-
version: 1.6.
|
8
|
+
- 8
|
9
|
+
version: 1.6.8
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Eric Hodel; Chris Powell; Matthew Boeh; Ian Lesperance; Dana Danger; Brian Smith; Ashley Martens
|
@@ -28,6 +28,8 @@ extra_rdoc_files:
|
|
28
28
|
- README.rdoc
|
29
29
|
files:
|
30
30
|
- README.rdoc
|
31
|
+
- lib/syslog-formatter.rb
|
32
|
+
- lib/syslog-logger.rb
|
31
33
|
has_rdoc: true
|
32
34
|
homepage: http://github.com/ngmoco/syslog_logger
|
33
35
|
licenses: []
|