loggr 1.0.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/.gitignore +5 -0
- data/Gemfile +4 -0
- data/LICENSES.md +15 -0
- data/MIT-LICENSE +20 -0
- data/README.md +230 -0
- data/Rakefile +14 -0
- data/lib/logback-classic-0.9.29.jar +0 -0
- data/lib/logback-core-0.9.29.jar +0 -0
- data/lib/loggr.rb +38 -0
- data/lib/loggr/adapter.rb +114 -0
- data/lib/loggr/adapter/abstract.rb +25 -0
- data/lib/loggr/adapter/base.rb +54 -0
- data/lib/loggr/adapter/buffered.rb +25 -0
- data/lib/loggr/adapter/nop.rb +39 -0
- data/lib/loggr/adapter/rails.rb +36 -0
- data/lib/loggr/adapter/slf4j.rb +30 -0
- data/lib/loggr/factory.rb +9 -0
- data/lib/loggr/lint.rb +54 -0
- data/lib/loggr/severity.rb +16 -0
- data/lib/loggr/slf4j.rb +7 -0
- data/lib/loggr/slf4j/jars.rb +44 -0
- data/lib/loggr/slf4j/logger.rb +88 -0
- data/lib/loggr/slf4j/mdc.rb +35 -0
- data/lib/loggr/version.rb +3 -0
- data/lib/slf4j-api-1.6.1.jar +0 -0
- data/loggr.gemspec +26 -0
- data/test/logback_helper.rb +54 -0
- data/test/test_helper.rb +50 -0
- data/test/unit/adapter/abstract_test.rb +12 -0
- data/test/unit/adapter/base_test.rb +65 -0
- data/test/unit/adapter/buffered_test.rb +44 -0
- data/test/unit/adapter/nop_test.rb +24 -0
- data/test/unit/adapter/rails_test.rb +38 -0
- data/test/unit/adapter/slf4j_test.rb +25 -0
- data/test/unit/factory_test.rb +60 -0
- data/test/unit/slf4j/jars_test.rb +22 -0
- data/test/unit/slf4j/logger_test.rb +139 -0
- data/test/unit/slf4j/mdc_test.rb +77 -0
- metadata +151 -0
data/Gemfile
ADDED
data/LICENSES.md
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
Simple Logging Facade for Java (SLF4J)
|
2
|
+
--------------------------------------
|
3
|
+
|
4
|
+
- License: http://www.slf4j.org/license.html, MIT license, (c) by QOS.ch
|
5
|
+
- File: lib/slf4j-api-1.6.1.jar
|
6
|
+
- URL: http://www.slf4j.org/
|
7
|
+
- Source: https://github.com/ceki/slf4j
|
8
|
+
|
9
|
+
Logback
|
10
|
+
-------
|
11
|
+
|
12
|
+
- License: http://logback.qos.ch/license.html, EPL 1.0, (c) by QOS.ch
|
13
|
+
- Files: lib/logback-classic-0.9.29.jar, lib/logback-core-0.9.29.jar
|
14
|
+
- URL: http://logback.qos.ch/
|
15
|
+
- Source: https://github.com/ceki/logback
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 Lukas Westermann, at-point ag
|
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.
|
data/README.md
ADDED
@@ -0,0 +1,230 @@
|
|
1
|
+
Loggr
|
2
|
+
=====
|
3
|
+
|
4
|
+
Loggr provides a factory for creating logger instances. It:
|
5
|
+
|
6
|
+
- Provides a wrapper for SLF4J (on JRuby)
|
7
|
+
- Has adapters for Stdlib Logger and ActiveSupport::BufferedLogger
|
8
|
+
- Supports Rails
|
9
|
+
- Handles using a Mapped Diagnostic Context (MDC)
|
10
|
+
|
11
|
+
**So, why should I use a logger factory instead of just `Logger.new('out.log')`
|
12
|
+
or `Rails.logger`?** Deploying the same application to different environments,
|
13
|
+
with different logging requirements, might make such a step necessary. Or when
|
14
|
+
trying to take advante of SLF4J-only features like the MDC or markers.
|
15
|
+
|
16
|
+
Information
|
17
|
+
-----------
|
18
|
+
|
19
|
+
**Wiki** The Loggr Wiki will hopefully soon be filled with how-to articles and
|
20
|
+
frequently asked questions.
|
21
|
+
|
22
|
+
https://github.com/at-point/loggr/wiki
|
23
|
+
|
24
|
+
**Bug Reports** No software is without bugs, if you discover a problem please report the issue.
|
25
|
+
|
26
|
+
https://github.com/at-point/loggr/issues
|
27
|
+
|
28
|
+
**Documentation** The latest RDocs are available on rubydoc.info.
|
29
|
+
|
30
|
+
http://rubydoc.info/github/at-point/loggr/master/frames
|
31
|
+
|
32
|
+
Installation
|
33
|
+
------------
|
34
|
+
|
35
|
+
Like any gem, just add it to the Gemfile:
|
36
|
+
|
37
|
+
# stable version
|
38
|
+
gem 'loggr', '~> 1.0.0'
|
39
|
+
|
40
|
+
# latest development version
|
41
|
+
gem 'loggr', :git => 'git://github.com/at-point/loggr.git'
|
42
|
+
|
43
|
+
Getting started
|
44
|
+
===============
|
45
|
+
|
46
|
+
Guides through creating some sample Logger instances and integration with Rails, if interested
|
47
|
+
in using the SLF4J Logger directly (without the factory), skip to _The SLF4J Wrapper_.
|
48
|
+
|
49
|
+
An example, application runs in development on MRI and production in a Jetty container
|
50
|
+
(Java/JRuby), lets assume you want to log there SQL using a logger named `jruby.rails.ActiveRecord`.
|
51
|
+
|
52
|
+
# config/initializers/logging.rb:
|
53
|
+
LoggerFactory.adapter = Rails.env.production? ? :slf4j : :rails
|
54
|
+
ActiveRecord::Base.logger = LoggerFactory.logger 'jruby.rails.ActiveRecord'
|
55
|
+
|
56
|
+
Once an adapter has been specified new logger instances can be easily created using:
|
57
|
+
|
58
|
+
def logger
|
59
|
+
@logger ||= LoggerFactory.logger 'my.app.SomeClass', :marker => "WORKER"
|
60
|
+
end
|
61
|
+
|
62
|
+
The adapter then handles creating new logger instances and uses features like the ability
|
63
|
+
to set markers (if supported), or setting a logger name. Based on the adapter a new logger
|
64
|
+
will be returned with all things defined like the marker, or a custom logger name - if the
|
65
|
+
adapter supports it, else it just tries to return a logger which has an API compatible with
|
66
|
+
those found by Stdlibs Logger.
|
67
|
+
|
68
|
+
The LoggerFactory
|
69
|
+
------------------
|
70
|
+
|
71
|
+
Yap, is responsible for creating new loggers, a logger factory has an adapter, the adapter
|
72
|
+
defines how logger instances are really created.
|
73
|
+
|
74
|
+
### Creating new loggers
|
75
|
+
|
76
|
+
LoggerFactory.logger 'app' # create a logger with named app
|
77
|
+
LoggerFactory.logger 'app', :to => 'debug.out' # write to debug.out
|
78
|
+
LoggerFactory.logger 'app', :to => $stderr # write to stderr
|
79
|
+
|
80
|
+
**Note:** not all adapters support all options, so some adapters might just ignore certain
|
81
|
+
options, but this is intended :)
|
82
|
+
|
83
|
+
### Bundled Adapters
|
84
|
+
|
85
|
+
**<code>LoggerFactory.adapter = :base</code>**
|
86
|
+
|
87
|
+
The base adapter creates ruby stdlib `Logger` instances. Supported options for
|
88
|
+
`LoggerFactory.logger(name, options = {})` are:
|
89
|
+
|
90
|
+
- `:to`, String or IO, where to log should be written to (default: `"#{name}.log"`)
|
91
|
+
- `:level`, Fixnum, one of `Logger::Severity`, the minimum severity to log (default: `Logger::Severity::DEBUG`)
|
92
|
+
|
93
|
+
**<code>LoggerFactory.adapter = :buffered</code>**
|
94
|
+
|
95
|
+
Creates `ActiveSupport::BufferedLogger` instances and supports the same options
|
96
|
+
as the `:base` adapter.
|
97
|
+
|
98
|
+
**<code>LoggerFactory.adapter = :rails</code>**
|
99
|
+
|
100
|
+
This adapter alwasy returns the `Rails.logger`, which is very useful e.g. in development
|
101
|
+
environments or testing, where we just care that it's somewhere in our `logs/development.log`.
|
102
|
+
*Note:* Rails is automatically detected and the rails adapter is the default adapter when
|
103
|
+
`::Rails` is present - else the base adapter is the default.
|
104
|
+
|
105
|
+
**<code>LoggerFactory.adapter = :slf4j</code>**
|
106
|
+
|
107
|
+
SLF4J only works with JRuby (because it's Java) and you are responsible for a) having an
|
108
|
+
SLF4J implementation on the classpath and it's configuration. Furthermore slf4j supports
|
109
|
+
these options for `LoggerFactory.logger(name, options = {})`:
|
110
|
+
|
111
|
+
- `:marker`, String, additional marker logged with each statement (default: `nil`)
|
112
|
+
|
113
|
+
### Using the Mapped Diagnostic Context (MDC)
|
114
|
+
|
115
|
+
Some loggers provide a MDC (or mapped diagnostic context), which can be used to annotate
|
116
|
+
log outputs with additional bits of information. At the moment only SLF4J really can make
|
117
|
+
use of this. Though, to provide a clean and consistent API all adapters _must_ provide
|
118
|
+
access to an MDC, so the MDC can be used in code no matter the adapter, a sample use case
|
119
|
+
(in Rails):
|
120
|
+
|
121
|
+
# app/controllers/application_controller.rb
|
122
|
+
class ApplicationController < ActionController::Base
|
123
|
+
around_filter :push_ip_to_mdc
|
124
|
+
|
125
|
+
private
|
126
|
+
def push_ip_to_mdc
|
127
|
+
LoggerFactory.mdc[:ip] = request.ip
|
128
|
+
yield
|
129
|
+
ensure
|
130
|
+
LoggerFactory.mdc.delete(:ip)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
When using SLF4J all statements would now be annotated with the IP from where the request
|
135
|
+
was made from.
|
136
|
+
|
137
|
+
The _SLF4J_ Wrapper
|
138
|
+
===================
|
139
|
+
|
140
|
+
Apart from the logger factory, this gem provides a ruby wrapper for logging using SLF4J and
|
141
|
+
taking advantage of:
|
142
|
+
|
143
|
+
- Same API as exposed by Stdlib Logger or AS::BufferedLogger
|
144
|
+
- SLF4J markers
|
145
|
+
- The Mapped Diagnostic Context (MDC)
|
146
|
+
- Access to SLF4J & Logback implementation JARs
|
147
|
+
|
148
|
+
The Logger
|
149
|
+
----------
|
150
|
+
|
151
|
+
Creating a new logger is as simple as creating instances of `Loggr::SLF4J::Logger`:
|
152
|
+
|
153
|
+
# logger named "my.package.App"
|
154
|
+
@logger = Loggr::SLF4J::Logger.new 'my.package.App'
|
155
|
+
|
156
|
+
# logger named "some.sample.Application" => classes are converted to java notation
|
157
|
+
@logger = Loggr::SLF4J::Logger.new Some::Sample::Application
|
158
|
+
|
159
|
+
# logger with a default marker named "APP"
|
160
|
+
@logger = Loggr::SLF4J::Logger.new 'my.package.App', :marker => 'APP'
|
161
|
+
|
162
|
+
Logging events is like using Stdlib Logger:
|
163
|
+
|
164
|
+
# log with level INFO
|
165
|
+
@logger.info "some info message"
|
166
|
+
|
167
|
+
# log with level DEBUG, if enabled
|
168
|
+
@logger.debug "verbose information" if @logger.debug?
|
169
|
+
|
170
|
+
# log with level DEBUG and marker "QUEUE" (masking as progname)
|
171
|
+
@logger.debug "do something", "QUEUE"
|
172
|
+
|
173
|
+
The MDC
|
174
|
+
-------
|
175
|
+
|
176
|
+
A wrapper hash for SLF4Js Mapped Diagnostic Context is available using `Loggr::SLF4J::MDC`
|
177
|
+
like a hash:
|
178
|
+
|
179
|
+
begin
|
180
|
+
Loggr::SLF4J::MDC[:user] = username
|
181
|
+
do_some_stuff
|
182
|
+
ensure
|
183
|
+
Loggr::SLF4J::MDC.delete(:user)
|
184
|
+
end
|
185
|
+
|
186
|
+
It's a good practice to wrap MDC set/get into begin/ensure blocks to ensure the value
|
187
|
+
is cleared afterwards, even in case of errors. The user is responsible for getting rid
|
188
|
+
of these values. To just clear all values use `Loggr::SLF4J::MDC.clear`
|
189
|
+
|
190
|
+
Extending & Contributing
|
191
|
+
========================
|
192
|
+
|
193
|
+
Of course any custom adapters (e.g. for log4r or the logging gem) are greatly appreciated.
|
194
|
+
To write a custom adapter just do something like:
|
195
|
+
|
196
|
+
class MyModule::MyCustomAdapter < Loggr::Adpater::AbstractAdapter
|
197
|
+
def logger(name, options = {})
|
198
|
+
# build logger instances and return it
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
# use custom adapter
|
203
|
+
LoggerFactory.adapter = MyModule::MyCustomAdapter.new
|
204
|
+
|
205
|
+
Extending from `Loggr::Adapter::AbstractAdapter` provides the adapter with a default
|
206
|
+
MDC implementation (backed by a hash stored in a thread local).
|
207
|
+
|
208
|
+
Similar to ActiveModel there are also Lint tests available to verify if your adapter
|
209
|
+
and the logger and mdc returned adhere to the API.
|
210
|
+
|
211
|
+
class MyModule::MyCustomAdapterTest < Test::Unit::TestCase
|
212
|
+
include Loggr::Lint::Tests
|
213
|
+
|
214
|
+
def setup
|
215
|
+
# required, so the Lint Tests can pick it up
|
216
|
+
@adapter = MyModule::MyCustomAdapter.new
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
Contribute
|
221
|
+
----------
|
222
|
+
|
223
|
+
1. Fork this project and hack away
|
224
|
+
2. Ensure that the changes are well tested
|
225
|
+
3. Send pull request
|
226
|
+
|
227
|
+
License & Copyright
|
228
|
+
-------------------
|
229
|
+
|
230
|
+
Loggr is licensed under the MIT License, (c) 2011 by at-point ag.
|
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
require 'rake/testtask'
|
3
|
+
|
4
|
+
# to fix warnings
|
5
|
+
include Rake::DSL
|
6
|
+
|
7
|
+
Bundler::GemHelper.install_tasks
|
8
|
+
|
9
|
+
desc 'Test the loggr gem.'
|
10
|
+
Rake::TestTask.new(:test) do |t|
|
11
|
+
t.libs << 'test'
|
12
|
+
t.pattern = 'test/**/*_test.rb'
|
13
|
+
t.verbose = true
|
14
|
+
end
|
Binary file
|
Binary file
|
data/lib/loggr.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2011 Lukas Westermann, at-point ag
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
#++
|
23
|
+
|
24
|
+
module Loggr
|
25
|
+
autoload :Adapter, 'loggr/adapter'
|
26
|
+
autoload :Severity, 'loggr/severity'
|
27
|
+
autoload :Lint, 'loggr/lint'
|
28
|
+
|
29
|
+
autoload :SLF4J, 'loggr/slf4j'
|
30
|
+
|
31
|
+
autoload :VERSION, 'loggr/version'
|
32
|
+
|
33
|
+
# Ensure we've got the Log Levels covered
|
34
|
+
include Loggr::Severity
|
35
|
+
end
|
36
|
+
|
37
|
+
# Autoloading the factory into the root.
|
38
|
+
autoload :LoggerFactory, 'loggr/factory'
|
@@ -0,0 +1,114 @@
|
|
1
|
+
module Loggr
|
2
|
+
|
3
|
+
# The factory is responsible for getting Logger instances from
|
4
|
+
# the adapters.
|
5
|
+
#
|
6
|
+
# It delegates both the `logger` and `mdc` calls to the current
|
7
|
+
# adpater.
|
8
|
+
#
|
9
|
+
# The adpater can be changed by setting `adpater = ...`:
|
10
|
+
#
|
11
|
+
# Loggr.adapter = Loggr::Adapter::SLF4J
|
12
|
+
#
|
13
|
+
# @see #logger, #mdc
|
14
|
+
module Adapter
|
15
|
+
|
16
|
+
# An abstract base class, which provides a simple MDC implementation
|
17
|
+
autoload :AbstractAdapter, 'loggr/adapter/abstract'
|
18
|
+
|
19
|
+
# Adapter for Ruby Stdlib Logger
|
20
|
+
autoload :Base, 'loggr/adapter/base'
|
21
|
+
|
22
|
+
# Adapter for ActiveSupport::BufferedLogger, requires AS
|
23
|
+
autoload :Buffered, 'loggr/adapter/buffered'
|
24
|
+
|
25
|
+
# Adapter which uses Rails.logger
|
26
|
+
autoload :Rails, 'loggr/adapter/rails'
|
27
|
+
|
28
|
+
# Adpater for SLF4J
|
29
|
+
autoload :SLF4J, 'loggr/adapter/slf4j'
|
30
|
+
|
31
|
+
# Get the backend, if no backend is defined uses the default backend.
|
32
|
+
#
|
33
|
+
# If running in a rails environment, automatically chooses the rails
|
34
|
+
# adapter as a default, else base is used.
|
35
|
+
def adapter
|
36
|
+
@adapter ||= Object.const_defined?(:Rails) ? Loggr::Adapter::Rails : Loggr::Adapter::Base
|
37
|
+
end
|
38
|
+
|
39
|
+
# Set a new adapter, either as string, class or whatever :)
|
40
|
+
#
|
41
|
+
def adapter=(new_adapter)
|
42
|
+
@adapter = get_adapter(new_adapter)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Get a new logger instance for supplied named logger or class name.
|
46
|
+
#
|
47
|
+
# All adapters must ensure that they provide the same API for creating
|
48
|
+
# new loggers. Each logger has a name, further possible options are:
|
49
|
+
#
|
50
|
+
# - `:to`, filename or IO, where to write the output to
|
51
|
+
# - `:level`, Fixnum, starting log level, @see `Loggr::Severity`
|
52
|
+
# - `:marker`, String, name of the category/marker
|
53
|
+
#
|
54
|
+
# If an adapter does not support setting a specific option, just
|
55
|
+
# ignore it.
|
56
|
+
def logger(name, options = {}, &block)
|
57
|
+
use_adapter = options.key?(:adapter) ? get_adapter(options.delete(:adapter)) : self.adapter
|
58
|
+
use_adapter.logger(name, options).tap do |logger|
|
59
|
+
yield(logger) if block_given?
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# The Mapped Diagnostic Context is a basically a hash where values
|
64
|
+
# can be stored for certain keys, the context must be stored per thread.
|
65
|
+
#
|
66
|
+
# The most basic MDC implementation is `Thread.local['my_simple_mdc'] ||= Hash.new`.
|
67
|
+
#
|
68
|
+
# If a adapter provides a native MDC implementation ensure it does expose
|
69
|
+
# these methods:
|
70
|
+
#
|
71
|
+
# - `def []=(key, value)`, set a property in the MDC
|
72
|
+
# - `def [](key)`, get a property from the MDC
|
73
|
+
# - `def delete(key)`, delete a property in the MDC
|
74
|
+
# - `def clear()`, deletes all properties from the MDC
|
75
|
+
# - `def to_hash`, access MDC as standard ruby hash (might be clone, though!)
|
76
|
+
#
|
77
|
+
# Well it should basically behave like a Ruby Hash, eventhough not with all
|
78
|
+
# options.
|
79
|
+
def mdc
|
80
|
+
self.adapter.mdc
|
81
|
+
end
|
82
|
+
|
83
|
+
protected
|
84
|
+
|
85
|
+
# Try to get adapter class from Symbol, String or use Object as-is.
|
86
|
+
#
|
87
|
+
def get_adapter(adp)
|
88
|
+
adp = Loggr::Adapter::SLF4J if adp == :slf4j # okay, this is only because we can't camelize it :)
|
89
|
+
|
90
|
+
# Code adapter from ActiveSupport::Inflector#camelize
|
91
|
+
# https://github.com/rails/rails/blob/v3.0.9/activesupport/lib/active_support/inflector/methods.rb#L30
|
92
|
+
adp = adp.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase } if adp.is_a?(Symbol)
|
93
|
+
|
94
|
+
clazz = adp
|
95
|
+
|
96
|
+
if adp.respond_to?(:to_str)
|
97
|
+
const = begin Loggr::Adapter.const_get(adp.to_s) rescue nil end
|
98
|
+
unless const
|
99
|
+
# code adapter from ActiveSupport::Inflector#constantize
|
100
|
+
# https://github.com/rails/rails/blob/v3.0.9/activesupport/lib/active_support/inflector/methods.rb#L107
|
101
|
+
names = adp.to_s.split('::')
|
102
|
+
names.shift if names.empty? || names.first.empty?
|
103
|
+
|
104
|
+
const = ::Object
|
105
|
+
names.each { |n| const = const.const_get(n) }
|
106
|
+
end
|
107
|
+
clazz = const
|
108
|
+
end
|
109
|
+
|
110
|
+
raise "#{clazz}: an adapter must implement #logger and #mdc" unless clazz.respond_to?(:logger) && clazz.respond_to?(:mdc)
|
111
|
+
clazz
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|