log2mail 0.0.1.pre2

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 49c942792863111482748c2728b262aac98222c7
4
+ data.tar.gz: b6dbfb965e80cc032ad80cf2e9c208be7847ad1c
5
+ SHA512:
6
+ metadata.gz: 06740c4944bfe2cd8f6f4d0ecfa01321c84ce99d2efc1c308b0055bf6f8dfa7ec0d0e495a7ca546106fdacfd501d28233b34376a226d1ca1be3f534c5eae134a
7
+ data.tar.gz: 27bf8b30600f937341290214b5f60dd8610b47a8ec9ac2240e1531aa33df68d55d518819f5504e99b9dfca1e4103ea646fdf1d17ad0f67457e72cbfcd37720d4
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
15
+ /example/
16
+ *.gem
17
+ *.log
18
+ /man/*.html
19
+ /bin/rake
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - "1.9.3"
4
+ - "2.0.0"
5
+ - "2.1"
6
+ - "2.2"
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in log2mail.gemspec
4
+ gemspec
data/INSTALL ADDED
@@ -0,0 +1,51 @@
1
+ log2mail.rb Installation
2
+ ========================
3
+
4
+ Requirements
5
+ ------------
6
+
7
+ * Ruby 1.9.3
8
+
9
+ Debian 7 (and higher)
10
+ ---------------------
11
+
12
+ To install Ruby:
13
+
14
+ sudo apt-get install ruby
15
+
16
+ To get this pre-release version of log2mail.rb:
17
+
18
+ rbenv shell system # if using rbenv
19
+ sudo gem install log2mail --pre
20
+
21
+ Next Steps
22
+ ----------
23
+
24
+ Create a configuration file, e.g. at `/usr/local/etc/log2mail.conf`:
25
+
26
+ cat > /usr/local/etc/log2mail.conf <<EOF
27
+ defaults
28
+ mailto = your@mail.address
29
+ file = /tmp/test.log
30
+ pattern = test
31
+ EOF
32
+
33
+ Test the configuration:
34
+
35
+ log2mail.rb configtest --config /usr/local/etc/log2mail.conf
36
+
37
+ should return:
38
+
39
+ +---------------+---------+-------------------+----------+
40
+ | File | Pattern | Recipient | Settings |
41
+ +---------------+---------+-------------------+----------+
42
+ | /tmp/test.log | test | your@mail.address | |
43
+ +---------------+---------+-------------------+----------+
44
+
45
+ Run *log2mail.rb* in foreground (`-N`) in verbose mode (`-v`) and 10 seconds sleep time in the processing loop:
46
+
47
+ log2mail.rb start --config /usr/local/etc/log2mail.conf -Nv --sleeptime 10
48
+
49
+ `echo "a first test" >> /tmp/test.log` should result in an email report after few seconds.
50
+
51
+ See `gem man log2mail` for more information.
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Markus Strauss
2
+
3
+ MIT License
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.
data/README.md ADDED
@@ -0,0 +1,123 @@
1
+ log2mail.rb(1) -- monitors (log) files for patterns and reports hits by mail
2
+ ============================================================================
3
+
4
+ ## SYNOPSIS
5
+
6
+ `log2mail.rb` (start|stop|status|configtest) [<var>options</var>]:
7
+
8
+ ## DESCRIPTION
9
+
10
+ `log2mail.rb` helps having an eye on your systems' log files. It efficiently monitors multiple files and reports as soon as specified (regular expression) patterns match.
11
+
12
+ On startup, `log2mail.rb` opens all files on the 'watch list' and seeks to EOF. All new data are parsed about once a minute (see `--sleeptime`). <!-- If necessary, i.e. when multiline patterns are set for the file, every new data is put into a fixed-size buffer. The buffer is rolled over when it gets full. --> Matched patterns are reported to the configured mail address(es) (see `mailto` configuration option).
13
+
14
+ Log files are reopened automatically when rotated.
15
+
16
+ `log2mail.rb` is a pure ruby clone of [log2mail](https://packages.debian.org/squeeze/log2mail) which supports most of the original's features and configuration syntax and adds multiline regular expression matching. Actually it should be possible to use `log2mail.rb` with your existing configuration you may have for log2mail(8).
17
+
18
+ ## OPTIONS
19
+
20
+ * `--config`=<var>path</var>, `-c` <var>path</var>:
21
+ Specifies the configuration file or directory path. If <var>path</var> is a directory, all files (except such ending in `~` or `#`) are parsed in sorted order. Sorting is by character code, i.e. 0-9 before A-Z followed by a-z.
22
+ Default value: `/etc/log2mail/conf`.
23
+ This can also be set by environment variable `LOG2MAIL_CONF`.
24
+
25
+ * `--sleeptime`=<var>seconds</var>:
26
+ Specifies at which interval (in seconds) the log files are parsed. Default value: 60.
27
+
28
+ ## ENVIRONMENT
29
+
30
+ `log2mail.rb` uses the environment variable `LOG2MAIL_CONF`, if present (see option `--config`). The value supplied by option takes precedence.
31
+
32
+ ## CONFIGURATION (OLD-STYLE)
33
+
34
+ The old-style configuration syntax is directly cloned from log2mail(8)'s behavior and should be mostly compatible. It may seem a bit awkward first, but this is how it works: There are two possible top-level 'sections', `defaults` and `file=`<var>path-to-log-file</var> sections. The only statement allowed after a `file=...` section are one or more `pattern=`<var>pattern</var> entries. After the `pattern=...` there may be one or more `mailto=`<var>single-mail-recipient</var> entries. After each `mailto=...` there may be options for that recipient. Also, these options are set from the special `defaults` section, if present (usually it is).
35
+
36
+ The basic layout looks like follows:
37
+
38
+ # comments start with pound sign (aka hash or number sign)
39
+
40
+ defaults
41
+ fromaddr = DEFAULT FROMADDR
42
+ sendtime = DEFAULT SENDTIME # seconds
43
+ resendtime = DEFAULT RESENDTIME # seconds
44
+ maxlines = DEFAULT MAXLINES # number of lines
45
+ template = DEFAULT TEMPLATE # filename or path
46
+ sendmail = DEFAULT SENDMAIL # path to executable with arguments
47
+ mailto = DEFAULT RECIPIENT # new to log2mail.rb
48
+ # awkward, not recommended, but possible:
49
+ pattern = DEFAULT PATTERN # this pattern would be applied to every file
50
+ mailto = DEFAULT RECIPIENT for previous DEFAULT PATTERN
51
+
52
+ # one or more file sections follow
53
+ file = FILENAME
54
+
55
+ # each file can have one or more patterns
56
+ pattern = PATTERN
57
+
58
+ # each pattern can have one or more mailto recipients
59
+ # each recipient gets its own mailto=... statement
60
+ mailto = MAIL
61
+
62
+ # every option NOT stated here is supplied from defaults
63
+ fromaddr = ...
64
+ sendtime = ...
65
+ resendtime = ...
66
+ maxlines = ...
67
+ template = ...
68
+ sendmail = ...
69
+
70
+ # "include" includes the contents of file at the exact place of the
71
+ # include statement
72
+ include = PATH TO FILE
73
+
74
+ Note that indentation is done for readability purposes only. It serves no role syntactically.
75
+
76
+ Splitting the configuration into multiple files is possible, and convenient when using automation tools to distribute settings. In opposition to classic log2mail, with `log2mail.rb` it does not matter at which place the `defaults` section is parsed. Keep in mind though, that later definitions may override earlier ones. In that case a warning is logged.
77
+
78
+ ## CONFIGURATION (NEW-STYLE)
79
+
80
+ None (yet). More features might warrant a new configuration syntax.
81
+
82
+ ## SECURITY CONSIDERATIONS
83
+
84
+ It is neither necessary nor recommended to run this software as root.
85
+
86
+ ## BUGS
87
+
88
+ Configuration options `sendtime`, `resendtime`, `maxlines` not implemented yet. Every match produces a single mail which is sent out immediately - which could produce a lot of mails.
89
+
90
+ ## HISTORY
91
+
92
+ December 2014:
93
+ This software is not feature-complete and in pre-release testing.
94
+
95
+ ## AUTHOR
96
+
97
+ Markus Strauss <<log2mail@dev.sieb.mx>>
98
+
99
+ ## THANKS
100
+
101
+ Many thanks to Michael Krax for writing the classic **log2mail** in the first place.
102
+
103
+ ## SEE ALSO
104
+
105
+ Documentation for the classic log2mail software by Michael Krax:
106
+
107
+ * log2mail(8), log2mail.conf(5)
108
+ * [Configuration notice from the Debian project]( https://raw.githubusercontent.com/lordlamer/log2mail/e6beb36644ce74639cbc453e664a08ed15f138b9/Configuration)
109
+
110
+
111
+ [SYNOPSIS]: #SYNOPSIS "SYNOPSIS"
112
+ [DESCRIPTION]: #DESCRIPTION "DESCRIPTION"
113
+ [OPTIONS]: #OPTIONS "OPTIONS"
114
+ [ENVIRONMENT]: #ENVIRONMENT "ENVIRONMENT"
115
+ [SECURITY CONSIDERATIONS]: #SECURITY-CONSIDERATIONS "SECURITY CONSIDERATIONS"
116
+ [BUGS]: #BUGS "BUGS"
117
+ [HISTORY]: #HISTORY "HISTORY"
118
+ [AUTHOR]: #AUTHOR "AUTHOR"
119
+ [THANKS]: #THANKS "THANKS"
120
+ [SEE ALSO]: #SEE-ALSO "SEE ALSO"
121
+
122
+
123
+ [log2mail.rb(1)]: log2mail.1.html
data/Rakefile ADDED
@@ -0,0 +1,20 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ require 'rspec/core/rake_task'
4
+ RSpec::Core::RakeTask.new('spec')
5
+
6
+ require 'cucumber/rake/task'
7
+ Cucumber::Rake::Task.new(:features) do |t|
8
+ t.cucumber_opts = "features --format pretty"
9
+ end
10
+
11
+ require 'rake/notes/rake_task'
12
+
13
+ task :default => [:spec, :features, :man]
14
+
15
+ desc 'Build the manual'
16
+ task :man do
17
+ require 'ronn'
18
+ sh "ronn -w -s toc -r5 --markdown man/*.ronn"
19
+ FileUtils.mv("man/log2mail.1.markdown", "README.md")
20
+ end
data/bin/log2mail.rb ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'log2mail'
4
+ require 'log2mail/main'
@@ -0,0 +1,22 @@
1
+ Feature: Configuration Examination
2
+ In order verify correct configuration
3
+ As a respnosible system administrator
4
+ I want to see a configuration summary
5
+
6
+ Scenario: Show configuration settings
7
+ Given I use mode "configtest"
8
+ And config "config_1"
9
+ When log2mail is run
10
+ Then the output should be:
11
+ | File | Pattern | Recipient | Settings |
12
+ | test.log | string pattern | recipient@test.itstrauss.eu | |
13
+ | test.log | /regexp pattern/ | recipient@test.itstrauss.eu | |
14
+ Scenario: Show effective configuration settings
15
+ Given I use mode "configtest"
16
+ And config "config_1"
17
+ And parameter "-e"
18
+ When log2mail is run
19
+ Then the output should be:
20
+ | File | Pattern | Recipient | Effective Settings |
21
+ | test.log | string pattern | recipient@test.itstrauss.eu | fromaddr=log2mail |
22
+ | test.log | /regexp pattern/ | recipient@test.itstrauss.eu | fromaddr=log2mail |
@@ -0,0 +1,7 @@
1
+ # old-style syntax
2
+ defaults
3
+ mailto = recipient@test.itstrauss.eu
4
+ fromaddr = log2mail
5
+ file = test.log
6
+ pattern = string pattern
7
+ pattern = /regexp pattern/
@@ -0,0 +1,41 @@
1
+ def parse_configtest_output( txt )
2
+ rows = []; keys = nil
3
+ first_line = true
4
+ txt.each_line do |line|
5
+ next if line =~ /[+-]+/
6
+ if first_line
7
+ keys = line.split('|').map(&:strip) - ['|', '']
8
+ first_line = false
9
+ else
10
+ values = line.split('|').map(&:strip) - ['|', '']
11
+ rows << Hash[keys.zip(values)]
12
+ end
13
+ end
14
+ rows
15
+ end
16
+
17
+ Given(/^I use mode "(.*?)"$/) do |mode|
18
+ @mode = mode
19
+ end
20
+
21
+ Given(/^config "(.*?)"$/) do |config|
22
+ @config = config
23
+ end
24
+
25
+ Given(/^parameter "(.*?)"$/) do |args|
26
+ @args = args
27
+ end
28
+
29
+ When(/^log(\d+)mail is run$/) do |arg1|
30
+ @output = `bundle exec bin/log2mail.rb #{@mode} --config features/log2mail_configurations/#{@config} #{@args}`
31
+ # puts @output.inspect
32
+ # puts parse_configtest_output(@output).inspect
33
+ end
34
+
35
+ Then(/^the output should be:$/) do |table|
36
+ # table is a Cucumber::Ast::Table
37
+ table.map_headers!
38
+ table.map_column!(:Settings) { |cell| cell.empty? ? nil : cell } \
39
+ if table.hashes.first[:Settings]
40
+ table.diff! parse_configtest_output(@output), :surplus_col => true
41
+ end
data/lib/ext/kernel.rb ADDED
@@ -0,0 +1,13 @@
1
+ unless Kernel.respond_to?(:Hash)
2
+ module Kernel
3
+ def Hash(arg)
4
+ if arg.respond_to?(:to_hash)
5
+ return arg.to_hash
6
+ elsif arg.nil?
7
+ return {}
8
+ else
9
+ fail TypeError, "TypeError: can't convert #{arg.class} into Hash"
10
+ end
11
+ end
12
+ end
13
+ end
data/lib/ext/main.rb ADDED
@@ -0,0 +1,24 @@
1
+ module Main
2
+ class Program
3
+ module InstanceMethods
4
+
5
+ def logger= log
6
+ unless(defined?(@logger) and @logger == log)
7
+ case log
8
+ when ::Logger, Logger, Syslog::Logger
9
+ @logger = log
10
+ else
11
+ if log.is_a?(Array)
12
+ @logger = Logger.new(*log)
13
+ else
14
+ @logger = Logger.new(log)
15
+ @logger.level = logger_level
16
+ end
17
+ end
18
+ end
19
+ @logger
20
+ end
21
+
22
+ end
23
+ end
24
+ end
data/lib/ext/string.rb ADDED
@@ -0,0 +1,23 @@
1
+ class String
2
+ # based on https://www.ruby-forum.com/topic/193809#844629
3
+ def to_r
4
+ if self.strip.match(/\A\/(.*)\/(.*)\Z/mx)
5
+ regexp, flags = $1, $2
6
+ fail "Not a valid regular expression. Valid flags in (/regexp/flags) are x, i and m" \
7
+ if !regexp || flags =~ /[^xim]/m
8
+
9
+ x = /x/.match(flags) && Regexp::EXTENDED
10
+ i = /i/.match(flags) && Regexp::IGNORECASE
11
+ m = /m/.match(flags) && Regexp::MULTILINE
12
+
13
+ rxp = Regexp.new regexp , [x,i,m].inject(0){|a,f| f ? a+f : a }
14
+ def rxp.from_string?; false end
15
+ rxp
16
+ else
17
+ # build regexp from regular string
18
+ rxp = Regexp.new( self )
19
+ def rxp.from_string?; true end
20
+ rxp
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,208 @@
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
+ # Also the facility may be set to specify the facility level which will be used:
28
+ #
29
+ # log.info 'this line will be logged using Syslog default facility level'
30
+ #
31
+ # log_local1 = Syslog::Logger.new 'my_program', Syslog::LOG_LOCAL1
32
+ # log_local1.info 'this line will be logged using local1 facility level'
33
+ #
34
+ #
35
+ # You may need to perform some syslog.conf setup first. For a BSD machine add
36
+ # the following lines to /etc/syslog.conf:
37
+ #
38
+ # !my_program
39
+ # *.* /var/log/my_program.log
40
+ #
41
+ # Then touch /var/log/my_program.log and signal syslogd with a HUP
42
+ # (killall -HUP syslogd, on FreeBSD).
43
+ #
44
+ # If you wish to have logs automatically roll over and archive, see the
45
+ # newsyslog.conf(5) and newsyslog(8) man pages.
46
+
47
+ class Syslog::Logger
48
+ # Default formatter for log messages.
49
+ class Formatter
50
+ def call severity, time, progname, msg
51
+ clean msg
52
+ end
53
+
54
+ private
55
+
56
+ ##
57
+ # Clean up messages so they're nice and pretty.
58
+
59
+ def clean message
60
+ message = message.to_s.strip
61
+ message.gsub!(/\e\[[0-9;]*m/, '') # remove useless ansi color codes
62
+ return message
63
+ end
64
+ end
65
+
66
+ ##
67
+ # The version of Syslog::Logger you are using.
68
+
69
+ VERSION = '2.1.0'
70
+
71
+ ##
72
+ # Maps Logger warning types to syslog(3) warning types.
73
+ #
74
+ # Messages from Ruby applications are not considered as critical as messages
75
+ # from other system daemons using syslog(3), so most messages are reduced by
76
+ # one level. For example, a fatal message for Ruby's Logger is considered
77
+ # an error for syslog(3).
78
+
79
+ LEVEL_MAP = {
80
+ ::Logger::UNKNOWN => Syslog::LOG_ALERT,
81
+ ::Logger::FATAL => Syslog::LOG_ERR,
82
+ ::Logger::ERROR => Syslog::LOG_WARNING,
83
+ ::Logger::WARN => Syslog::LOG_NOTICE,
84
+ ::Logger::INFO => Syslog::LOG_INFO,
85
+ ::Logger::DEBUG => Syslog::LOG_DEBUG,
86
+ }
87
+
88
+ ##
89
+ # Returns the internal Syslog object that is initialized when the
90
+ # first instance is created.
91
+
92
+ def self.syslog
93
+ @@syslog
94
+ end
95
+
96
+ ##
97
+ # Specifies the internal Syslog object to be used.
98
+
99
+ def self.syslog= syslog
100
+ @@syslog = syslog
101
+ end
102
+
103
+ ##
104
+ # Builds a methods for level +meth+.
105
+
106
+ def self.make_methods meth
107
+ level = ::Logger.const_get(meth.upcase)
108
+ eval <<-EOM, nil, __FILE__, __LINE__ + 1
109
+ def #{meth}(message = nil, &block)
110
+ add(#{level}, message, &block)
111
+ end
112
+
113
+ def #{meth}?
114
+ @level <= #{level}
115
+ end
116
+ EOM
117
+ end
118
+
119
+ ##
120
+ # :method: unknown
121
+ #
122
+ # Logs a +message+ at the unknown (syslog alert) log level, or logs the
123
+ # message returned from the block.
124
+
125
+ ##
126
+ # :method: fatal
127
+ #
128
+ # Logs a +message+ at the fatal (syslog err) log level, or logs the message
129
+ # returned from the block.
130
+
131
+ ##
132
+ # :method: error
133
+ #
134
+ # Logs a +message+ at the error (syslog warning) log level, or logs the
135
+ # message returned from the block.
136
+
137
+ ##
138
+ # :method: warn
139
+ #
140
+ # Logs a +message+ at the warn (syslog notice) log level, or logs the
141
+ # message returned from the block.
142
+
143
+ ##
144
+ # :method: info
145
+ #
146
+ # Logs a +message+ at the info (syslog info) log level, or logs the message
147
+ # returned from the block.
148
+
149
+ ##
150
+ # :method: debug
151
+ #
152
+ # Logs a +message+ at the debug (syslog debug) log level, or logs the
153
+ # message returned from the block.
154
+
155
+ Logger::Severity::constants.each do |severity|
156
+ make_methods severity.downcase
157
+ end
158
+
159
+ ##
160
+ # Log level for Logger compatibility.
161
+
162
+ attr_accessor :level
163
+
164
+ # Logging formatter, as a +Proc+ that will take four arguments and
165
+ # return the formatted message. The arguments are:
166
+ #
167
+ # +severity+:: The Severity of the log message.
168
+ # +time+:: A Time instance representing when the message was logged.
169
+ # +progname+:: The #progname configured, or passed to the logger method.
170
+ # +msg+:: The _Object_ the user passed to the log message; not necessarily a
171
+ # String.
172
+ #
173
+ # The block should return an Object that can be written to the logging
174
+ # device via +write+. The default formatter is used when no formatter is
175
+ # set.
176
+ attr_accessor :formatter
177
+
178
+ ##
179
+ # The facility argument is used to specify what type of program is logging the message.
180
+
181
+ attr_accessor :facility
182
+
183
+ ##
184
+ # Fills in variables for Logger compatibility. If this is the first
185
+ # instance of Syslog::Logger, +program_name+ may be set to change the logged
186
+ # program name. The +facility+ may be set to specify the facility level which will be used.
187
+ #
188
+ # Due to the way syslog works, only one program name may be chosen.
189
+
190
+ def initialize program_name = 'ruby', facility = nil
191
+ @level = ::Logger::DEBUG
192
+ @formatter = Formatter.new
193
+
194
+ @@syslog ||= Syslog.open(program_name)
195
+
196
+ @facility = (facility || @@syslog.facility)
197
+ end
198
+
199
+ ##
200
+ # Almost duplicates Logger#add. +progname+ is ignored.
201
+
202
+ def add severity, message = nil, progname = nil, &block
203
+ severity ||= ::Logger::UNKNOWN
204
+ @level <= severity and
205
+ @@syslog.log( (LEVEL_MAP[severity] | @facility), '%s', formatter.call(severity, Time.now, progname, (message || block.call)) )
206
+ true
207
+ end
208
+ end