sml-log4r 1.0.6
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/doc/content/contact.html +22 -0
- data/doc/content/contribute.html +21 -0
- data/doc/content/index.html +90 -0
- data/doc/content/license.html +56 -0
- data/doc/content/manual.html +449 -0
- data/doc/dev/README.developers +40 -0
- data/doc/dev/checklist +14 -0
- data/doc/dev/things-to-do +2 -0
- data/doc/images/crush/logo2.png +0 -0
- data/doc/images/log4r-logo.png +0 -0
- data/doc/images/logo2.png +0 -0
- data/doc/log4r.css +111 -0
- data/doc/old/manual.html +348 -0
- data/doc/templates/main.html +147 -0
- data/examples/README +19 -0
- data/examples/customlevels.rb +34 -0
- data/examples/fileroll.rb +40 -0
- data/examples/log4r_yaml.yaml +0 -0
- data/examples/logclient.rb +25 -0
- data/examples/logserver.rb +18 -0
- data/examples/moderate.xml +29 -0
- data/examples/moderateconfig.rb +66 -0
- data/examples/myformatter.rb +23 -0
- data/examples/outofthebox.rb +21 -0
- data/examples/rrconfig.xml +63 -0
- data/examples/rrsetup.rb +42 -0
- data/examples/simpleconfig.rb +39 -0
- data/examples/xmlconfig.rb +25 -0
- data/examples/yaml.rb +30 -0
- data/src/log4r.rb +17 -0
- data/src/log4r/base.rb +74 -0
- data/src/log4r/config.rb +9 -0
- data/src/log4r/configurator.rb +224 -0
- data/src/log4r/formatter/formatter.rb +105 -0
- data/src/log4r/formatter/patternformatter.rb +108 -0
- data/src/log4r/lib/drbloader.rb +52 -0
- data/src/log4r/lib/xmlloader.rb +24 -0
- data/src/log4r/logevent.rb +28 -0
- data/src/log4r/logger.rb +194 -0
- data/src/log4r/loggerfactory.rb +89 -0
- data/src/log4r/logserver.rb +28 -0
- data/src/log4r/outputter/consoleoutputters.rb +18 -0
- data/src/log4r/outputter/datefileoutputter.rb +110 -0
- data/src/log4r/outputter/emailoutputter.rb +115 -0
- data/src/log4r/outputter/fileoutputter.rb +49 -0
- data/src/log4r/outputter/iooutputter.rb +55 -0
- data/src/log4r/outputter/outputter.rb +132 -0
- data/src/log4r/outputter/outputterfactory.rb +59 -0
- data/src/log4r/outputter/remoteoutputter.rb +40 -0
- data/src/log4r/outputter/rollingfileoutputter.rb +126 -0
- data/src/log4r/outputter/staticoutputter.rb +30 -0
- data/src/log4r/outputter/syslogoutputter.rb +75 -0
- data/src/log4r/rdoc/configurator +243 -0
- data/src/log4r/rdoc/emailoutputter +103 -0
- data/src/log4r/rdoc/formatter +39 -0
- data/src/log4r/rdoc/log4r +89 -0
- data/src/log4r/rdoc/logger +175 -0
- data/src/log4r/rdoc/logserver +85 -0
- data/src/log4r/rdoc/outputter +108 -0
- data/src/log4r/rdoc/patternformatter +128 -0
- data/src/log4r/rdoc/syslogoutputter +29 -0
- data/src/log4r/rdoc/yamlconfigurator +20 -0
- data/src/log4r/repository.rb +65 -0
- data/src/log4r/staticlogger.rb +49 -0
- data/src/log4r/yamlconfigurator.rb +0 -0
- data/tests/include.rb +7 -0
- data/tests/runtest.rb +6 -0
- data/tests/testbase.rb +45 -0
- data/tests/testcustom.rb +33 -0
- data/tests/testdefault.rb +25 -0
- data/tests/testformatter.rb +29 -0
- data/tests/testlogger.rb +198 -0
- data/tests/testoutputter.rb +112 -0
- data/tests/testpatternformatter.rb +26 -0
- data/tests/testxmlconf.rb +51 -0
- data/tests/xml/testconf.xml +37 -0
- metadata +140 -0
@@ -0,0 +1,132 @@
|
|
1
|
+
# :include: ../rdoc/outputter
|
2
|
+
#
|
3
|
+
# == Other Info
|
4
|
+
#
|
5
|
+
# Version:: $Id: outputter.rb,v 1.6 2003/09/12 23:55:43 fando Exp $
|
6
|
+
# Author:: Leon Torres <leon@ugcs.caltech.edu>
|
7
|
+
|
8
|
+
require "thread"
|
9
|
+
|
10
|
+
require "log4r/outputter/outputterfactory"
|
11
|
+
require "log4r/formatter/formatter"
|
12
|
+
require "log4r/staticlogger"
|
13
|
+
|
14
|
+
module Log4r
|
15
|
+
|
16
|
+
class Outputter
|
17
|
+
attr_reader :name, :level, :formatter
|
18
|
+
@@outputters = Hash.new
|
19
|
+
|
20
|
+
# An Outputter needs a name. RootLogger will be loaded if not already
|
21
|
+
# done. The hash arguments are as follows:
|
22
|
+
#
|
23
|
+
# [<tt>:level</tt>] Logger level. Optional, defaults to root level
|
24
|
+
# [<tt>:formatter</tt>] A Formatter. Defaults to DefaultFormatter
|
25
|
+
|
26
|
+
def initialize(_name, hash={})
|
27
|
+
if _name.nil?
|
28
|
+
raise ArgumentError, "Bad arguments. Name and IO expected.", caller
|
29
|
+
end
|
30
|
+
@name = _name
|
31
|
+
validate_hash(hash)
|
32
|
+
@@outputters[@name] = self
|
33
|
+
end
|
34
|
+
|
35
|
+
# dynamically change the level
|
36
|
+
def level=(_level)
|
37
|
+
Log4rTools.validate_level(_level)
|
38
|
+
@level = _level
|
39
|
+
OutputterFactory.create_methods(self)
|
40
|
+
Logger.log_internal {"Outputter '#{@name}' level is #{LNAMES[_level]}"}
|
41
|
+
end
|
42
|
+
|
43
|
+
# Set the levels to log. All others will be ignored
|
44
|
+
def only_at(*levels)
|
45
|
+
raise ArgumentError, "Gimme some levels!", caller if levels.empty?
|
46
|
+
raise ArgumentError, "Can't log only_at ALL", caller if levels.include? ALL
|
47
|
+
levels.each {|level| Log4rTools.validate_level(level)}
|
48
|
+
@level = levels.sort.first
|
49
|
+
OutputterFactory.create_methods self, levels
|
50
|
+
Logger.log_internal {
|
51
|
+
"Outputter '#{@name}' writes only on " +\
|
52
|
+
levels.collect{|l| LNAMES[l]}.join(", ")
|
53
|
+
}
|
54
|
+
end
|
55
|
+
|
56
|
+
# Dynamically change the formatter. You can just specify a Class
|
57
|
+
# object and the formatter will invoke +new+ or +instance+
|
58
|
+
# on it as appropriate.
|
59
|
+
|
60
|
+
def formatter=(_formatter)
|
61
|
+
if _formatter.kind_of?(Formatter)
|
62
|
+
@formatter = _formatter
|
63
|
+
elsif _formatter.kind_of?(Class) and _formatter <= Formatter
|
64
|
+
if _formatter.respond_to? :instance
|
65
|
+
@formatter = _formatter.instance
|
66
|
+
else
|
67
|
+
@formatter = _formatter.new
|
68
|
+
end
|
69
|
+
else
|
70
|
+
raise TypeError, "Argument was not a Formatter!", caller
|
71
|
+
end
|
72
|
+
Logger.log_internal {"Outputter '#{@name}' using #{@formatter.class}"}
|
73
|
+
end
|
74
|
+
|
75
|
+
# Call flush to force an outputter to write out any buffered
|
76
|
+
# log events. Similar to IO#flush, so use in a similar fashion.
|
77
|
+
|
78
|
+
def flush
|
79
|
+
end
|
80
|
+
|
81
|
+
#########
|
82
|
+
protected
|
83
|
+
#########
|
84
|
+
|
85
|
+
# Validates the common hash arguments. For now, that would be
|
86
|
+
# +:level+, +:formatter+ and the string equivalents
|
87
|
+
def validate_hash(hash)
|
88
|
+
@mutex = Mutex.new
|
89
|
+
# default to root level and DefaultFormatter
|
90
|
+
if hash.empty?
|
91
|
+
self.level = Logger.root.level
|
92
|
+
@formatter = DefaultFormatter.new
|
93
|
+
return
|
94
|
+
end
|
95
|
+
self.level = (hash[:level] or hash['level'] or Logger.root.level)
|
96
|
+
self.formatter = (hash[:formatter] or hash['formatter'] or DefaultFormatter.new)
|
97
|
+
end
|
98
|
+
|
99
|
+
#######
|
100
|
+
private
|
101
|
+
#######
|
102
|
+
|
103
|
+
# This method handles all log events passed to a typical Outputter.
|
104
|
+
# Overload this to change the overall behavior of an outputter. Make
|
105
|
+
# sure that the new behavior is thread safe.
|
106
|
+
|
107
|
+
def canonical_log(logevent)
|
108
|
+
synch { write(format(logevent)) }
|
109
|
+
end
|
110
|
+
|
111
|
+
# Common method to format data. All it does is call the resident
|
112
|
+
# formatter's format method. If a different formatting behavior is
|
113
|
+
# needed, then overload this method.
|
114
|
+
|
115
|
+
def format(logevent)
|
116
|
+
# @formatter is guaranteed to be DefaultFormatter if no Formatter
|
117
|
+
# was specified
|
118
|
+
@formatter.format(logevent)
|
119
|
+
end
|
120
|
+
|
121
|
+
# Abstract method to actually write the data to a destination.
|
122
|
+
# Custom outputters should overload this to specify how the
|
123
|
+
# formatted data should be written and to where.
|
124
|
+
|
125
|
+
def write(data)
|
126
|
+
end
|
127
|
+
|
128
|
+
def synch; @mutex.synchronize { yield } end
|
129
|
+
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# :nodoc:
|
2
|
+
# Version: $Id: outputterfactory.rb,v 1.3 2002/01/28 16:05:05 cepheus Exp $
|
3
|
+
|
4
|
+
require "log4r/base"
|
5
|
+
require "log4r/repository"
|
6
|
+
require "log4r/logger"
|
7
|
+
|
8
|
+
module Log4r
|
9
|
+
class Outputter
|
10
|
+
|
11
|
+
class OutputterFactory #:nodoc:
|
12
|
+
include Singleton
|
13
|
+
|
14
|
+
# handles two cases: logging above a level (no second arg specified)
|
15
|
+
# or logging a set of levels (passed into the second argument)
|
16
|
+
def self.create_methods(out, levels=nil)
|
17
|
+
Logger.root # force levels to be loaded
|
18
|
+
|
19
|
+
# first, undefine all the log levels
|
20
|
+
for mname in LNAMES
|
21
|
+
undefine_log(mname.downcase, out)
|
22
|
+
end
|
23
|
+
if not levels.nil? and levels.include? OFF
|
24
|
+
raise TypeError, "Can't log only_at OFF", caller[1..-1]
|
25
|
+
end
|
26
|
+
return out if out.level == OFF
|
27
|
+
|
28
|
+
if levels.nil? # then define the log methods for lev >= outlev
|
29
|
+
for lev in out.level...LEVELS
|
30
|
+
define_log(LNAMES[lev].downcase, lev, out)
|
31
|
+
end
|
32
|
+
else # define the logs only for assigned levels
|
33
|
+
for lev in levels
|
34
|
+
define_log(LNAMES[lev].downcase, lev, out)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
return out
|
38
|
+
end
|
39
|
+
|
40
|
+
# we need to synch the actual write/format for thread safteyness
|
41
|
+
def self.define_log(mname, level, out)
|
42
|
+
return if mname == 'off' || mname == 'all'
|
43
|
+
mstr = %-
|
44
|
+
def out.#{mname}(logevent)
|
45
|
+
canonical_log(logevent)
|
46
|
+
end
|
47
|
+
-
|
48
|
+
module_eval mstr
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.undefine_log(mname, out)
|
52
|
+
return if mname == 'off' || mname == 'all'
|
53
|
+
mstr = "def out.#{mname}(logevent); end"
|
54
|
+
module_eval mstr
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# :nodoc:
|
2
|
+
require 'log4r/lib/drbloader'
|
3
|
+
require 'log4r/outputter/outputter'
|
4
|
+
|
5
|
+
module Log4r
|
6
|
+
# See log4r/logserver.rb
|
7
|
+
class RemoteOutputter < Outputter
|
8
|
+
|
9
|
+
def initialize(_name, hash={})
|
10
|
+
super(_name, hash)
|
11
|
+
@uri = (hash[:uri] or hash['uri'])
|
12
|
+
@buffsize = (hash[:buffsize] or hash['buffsize'] or 1).to_i
|
13
|
+
@buff = []
|
14
|
+
connect
|
15
|
+
end
|
16
|
+
|
17
|
+
if HAVE_ROMP
|
18
|
+
include ROMPClient
|
19
|
+
else
|
20
|
+
def initialize(*args)
|
21
|
+
raise RuntimeError, "LogServer not supported. ROMP is required", caller
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
# Call flush to send any remaining LogEvents to the remote server.
|
27
|
+
def flush
|
28
|
+
synch { send_buffer }
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def canonical_log(logevent)
|
34
|
+
synch {
|
35
|
+
@buff.push logevent
|
36
|
+
send_buffer if @buff.size >= @buffsize
|
37
|
+
}
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
|
2
|
+
# :nodoc:
|
3
|
+
# Version:: $Id: rollingfileoutputter.rb,v 1.4 2003/09/12 23:55:43 fando Exp $
|
4
|
+
|
5
|
+
require "log4r/outputter/fileoutputter"
|
6
|
+
require "log4r/staticlogger"
|
7
|
+
|
8
|
+
module Log4r
|
9
|
+
|
10
|
+
# RollingFileOutputter - subclass of FileOutputter that rolls files on size
|
11
|
+
# or time. Additional hash arguments are:
|
12
|
+
#
|
13
|
+
# [<tt>:maxsize</tt>] Maximum size of the file in bytes.
|
14
|
+
# [<tt>:trunc</tt>] Maximum age of the file in seconds.
|
15
|
+
class RollingFileOutputter < FileOutputter
|
16
|
+
|
17
|
+
attr_reader :count, :maxsize, :maxtime, :startTime#,i:baseFilename
|
18
|
+
|
19
|
+
def initialize(_name, hash={})
|
20
|
+
@count = 0
|
21
|
+
super(_name, hash)
|
22
|
+
if hash.has_key?(:maxsize) || hash.has_key?('maxsize')
|
23
|
+
_maxsize = (hash[:maxsize] or hash['maxsize']).to_i
|
24
|
+
if _maxsize.class != Fixnum
|
25
|
+
raise TypeError, "Argument 'maxsize' must be an Fixnum", caller
|
26
|
+
end
|
27
|
+
if _maxsize == 0
|
28
|
+
raise TypeError, "Argument 'maxsize' must be > 0", caller
|
29
|
+
end
|
30
|
+
@maxsize = _maxsize
|
31
|
+
end
|
32
|
+
if hash.has_key?(:maxtime) || hash.has_key?('maxtime')
|
33
|
+
_maxtime = (hash[:maxtime] or hash['maxtime']).to_i
|
34
|
+
if _maxtime.class != Fixnum
|
35
|
+
raise TypeError, "Argument 'maxtime' must be an Fixnum", caller
|
36
|
+
end
|
37
|
+
if _maxtime == 0
|
38
|
+
raise TypeError, "Argument 'maxtime' must be > 0", caller
|
39
|
+
end
|
40
|
+
@maxtime = _maxtime
|
41
|
+
@startTime = Time.now
|
42
|
+
end
|
43
|
+
@baseFilename = File.basename(@filename)
|
44
|
+
# roll immediately so all files are of the form "000001-@baseFilename"
|
45
|
+
roll
|
46
|
+
# initialize the file size counter
|
47
|
+
@datasize = 0
|
48
|
+
end
|
49
|
+
|
50
|
+
#######
|
51
|
+
private
|
52
|
+
#######
|
53
|
+
|
54
|
+
# perform the write
|
55
|
+
def write(data)
|
56
|
+
# we have to keep track of the file size ourselves - File.size doesn't
|
57
|
+
# seem to report the correct size when the size changes rapidly
|
58
|
+
@datasize += data.size + 1 # the 1 is for newline
|
59
|
+
super
|
60
|
+
roll if requiresRoll
|
61
|
+
end
|
62
|
+
|
63
|
+
# construct a new filename from the count and baseFilname
|
64
|
+
def makeNewFilename
|
65
|
+
# note use of hard coded 6 digit counter width - is this enough files?
|
66
|
+
pad = "0" * (6 - @count.to_s.length) + count.to_s
|
67
|
+
newbase = @baseFilename.sub(/(\.\w*)$/, pad + '\1')
|
68
|
+
@filename = File.join(File.dirname(@filename), newbase)
|
69
|
+
Logger.log_internal {"File #{@filename} created"}
|
70
|
+
end
|
71
|
+
|
72
|
+
# does the file require a roll?
|
73
|
+
def requiresRoll
|
74
|
+
if !@maxsize.nil? && @datasize > @maxsize
|
75
|
+
@datasize = 0
|
76
|
+
return true
|
77
|
+
end
|
78
|
+
if !@maxtime.nil? && (Time.now - @startTime) > @maxtime
|
79
|
+
@startTime = Time.now
|
80
|
+
return true
|
81
|
+
end
|
82
|
+
false
|
83
|
+
end
|
84
|
+
|
85
|
+
# roll the file
|
86
|
+
def roll
|
87
|
+
begin
|
88
|
+
@out.close
|
89
|
+
rescue
|
90
|
+
Logger.log_internal {
|
91
|
+
"RollingFileOutputter '#{@name}' could not close #{@filename}"
|
92
|
+
}
|
93
|
+
end
|
94
|
+
@count += 1
|
95
|
+
makeNewFilename
|
96
|
+
@out = File.new(@filename, (@trunc ? "w" : "a"))
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
|
103
|
+
# this can be found in examples/fileroll.rb as well
|
104
|
+
if __FILE__ == $0
|
105
|
+
require 'log4r'
|
106
|
+
include Log4r
|
107
|
+
|
108
|
+
|
109
|
+
timeLog = Logger.new 'WbExplorer'
|
110
|
+
timeLog.outputters = RollingFileOutputter.new("WbExplorer", { "filename" => "TestTime.log", "maxtime" => 10, "trunc" => true })
|
111
|
+
timeLog.level = DEBUG
|
112
|
+
|
113
|
+
100.times { |t|
|
114
|
+
timeLog.info "blah #{t}"
|
115
|
+
sleep(1.0)
|
116
|
+
}
|
117
|
+
|
118
|
+
sizeLog = Logger.new 'WbExplorer'
|
119
|
+
sizeLog.outputters = RollingFileOutputter.new("WbExplorer", { "filename" => "TestSize.log", "maxsize" => 16000, "trunc" => true })
|
120
|
+
sizeLog.level = DEBUG
|
121
|
+
|
122
|
+
10000.times { |t|
|
123
|
+
sizeLog.info "blah #{t}"
|
124
|
+
}
|
125
|
+
|
126
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# :nodoc:
|
2
|
+
module Log4r
|
3
|
+
|
4
|
+
class Outputter
|
5
|
+
# Retrieve an outputter.
|
6
|
+
def self.[](name)
|
7
|
+
out = @@outputters[name]
|
8
|
+
if out.nil?
|
9
|
+
return case name
|
10
|
+
when 'stdout' then StdoutOutputter.new 'stdout'
|
11
|
+
when 'stderr' then StderrOutputter.new 'stderr'
|
12
|
+
else nil end
|
13
|
+
end
|
14
|
+
out
|
15
|
+
end
|
16
|
+
def self.stdout; Outputter['stdout'] end
|
17
|
+
def self.stderr; Outputter['stderr'] end
|
18
|
+
# Set an outputter.
|
19
|
+
def self.[]=(name, outputter)
|
20
|
+
@@outputters[name] = outputter
|
21
|
+
end
|
22
|
+
# Yields each outputter's name and reference.
|
23
|
+
def self.each
|
24
|
+
@@outputters.each {|name, outputter| yield name, outputter}
|
25
|
+
end
|
26
|
+
def self.each_outputter
|
27
|
+
@@outputters.each_value {|outputter| yield outputter}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# :include: ../rdoc/syslogoutputter
|
2
|
+
#
|
3
|
+
# Version:: $Id: syslogoutputter.rb,v 1.5 2004/03/17 20:18:00 fando Exp $
|
4
|
+
# Author:: Steve Lumos
|
5
|
+
# Author:: Leon Torres
|
6
|
+
|
7
|
+
require 'log4r/formatter/formatter'
|
8
|
+
require 'log4r/outputter/outputter'
|
9
|
+
require 'log4r/configurator'
|
10
|
+
require 'syslog'
|
11
|
+
|
12
|
+
module Log4r
|
13
|
+
|
14
|
+
# syslog needs to set the custom levels
|
15
|
+
if LNAMES.size > 1
|
16
|
+
raise LoadError, "Must let syslogger.rb define custom levels"
|
17
|
+
end
|
18
|
+
# tune log4r to syslog priorities
|
19
|
+
Configurator.custom_levels("DEBUG", "INFO", "NOTICE", "WARNING", "ERR", "CRIT", "ALERT", "EMERG")
|
20
|
+
|
21
|
+
class SyslogOutputter < Outputter
|
22
|
+
include Syslog::Constants
|
23
|
+
|
24
|
+
# maps log4r levels to syslog priorities (logevents never see ALL and OFF)
|
25
|
+
SYSLOG_LEVELS = [
|
26
|
+
nil,
|
27
|
+
LOG_DEBUG,
|
28
|
+
LOG_INFO,
|
29
|
+
LOG_WARNING,
|
30
|
+
LOG_ERR,
|
31
|
+
LOG_CRIT,
|
32
|
+
nil
|
33
|
+
]
|
34
|
+
|
35
|
+
# There are 3 hash arguments
|
36
|
+
#
|
37
|
+
# [<tt>:ident</tt>] syslog ident, defaults to _name
|
38
|
+
# [<tt>:logopt</tt>] syslog logopt, defaults to LOG_PID | LOG_CONS
|
39
|
+
# [<tt>:facility</tt>] syslog facility, defaults to LOG_USER
|
40
|
+
def initialize(_name, hash={})
|
41
|
+
super(_name, hash)
|
42
|
+
ident = (hash[:ident] or hash['ident'] or _name)
|
43
|
+
logopt = (hash[:logopt] or hash['logopt'] or LOG_PID | LOG_CONS).to_i
|
44
|
+
facility = (hash[:facility] or hash['facility'] or LOG_USER).to_i
|
45
|
+
@syslog = Syslog.open(ident, logopt, facility)
|
46
|
+
end
|
47
|
+
|
48
|
+
def closed?
|
49
|
+
return !@syslog.opened?
|
50
|
+
end
|
51
|
+
|
52
|
+
def close
|
53
|
+
@syslog.close unless @syslog.nil?
|
54
|
+
@level = OFF
|
55
|
+
OutputterFactory.create_methods(self)
|
56
|
+
Logger.log_internal {"Outputter '#{@name}' closed Syslog and set to OFF"}
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def canonical_log(logevent)
|
62
|
+
pri = SYSLOG_LEVELS[logevent.level]
|
63
|
+
o = logevent.data
|
64
|
+
if o.kind_of? Exception then
|
65
|
+
msg = "#{o.class} at (#{o.backtrace[0]}): #{o.message}"
|
66
|
+
elsif o.respond_to? :to_str then
|
67
|
+
msg = o.to_str
|
68
|
+
else
|
69
|
+
msg = o.inspect
|
70
|
+
end
|
71
|
+
|
72
|
+
@syslog.log(pri, '%s', msg)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|