log4r-sequel 0.0.1
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 +7 -0
- data/.travis.yml +13 -0
- data/Gemfile +29 -0
- data/Gemfile.lock +70 -0
- data/README.md +45 -0
- data/Rakefile +34 -0
- data/VERSION +1 -0
- data/example/log2postgres.rb +18 -0
- data/example/log2sqlite.rb +22 -0
- data/example/log4r-postgres.yaml +53 -0
- data/example/log4r-sqlite.yaml +46 -0
- data/lib/log4r/outputter/sequeloutputter.rb +127 -0
- data/test/functional/test_sqlite.rb +49 -0
- data/test/log4r-sqlite_test.yaml +46 -0
- metadata +172 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 22db2c5c31f8fbb61fac792ab52976a26e6e0984
|
4
|
+
data.tar.gz: 2ea605f5b25ebc37a19c912403e6e502ca7751a4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: eb146d274d9e4bddeb666218f54edb4bda8d26fd95d5b36479c05f42727fb70ea7ce341d1a293b8d089723eb101e897d094dea0fd3720c54933a63ae9cc5f053
|
7
|
+
data.tar.gz: a791ae9d859a3854a88b38f174e8774d2ec53f577c5aa3d291fb4022a1a87c03d2f69053f76101ba8bc8be3a01c3bc0e2cde389819df095507cbe9dd9989f836
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
## travis really doesn't like this
|
2
|
+
#ruby '2.0.0'
|
3
|
+
|
4
|
+
source 'https://rubygems.org'
|
5
|
+
|
6
|
+
gem 'log4r', '~> 1.1.9', '> 1.1'
|
7
|
+
|
8
|
+
# ugh this is so stupid - jeweler pulls in the latest version of this -
|
9
|
+
# through it's own dependency, causing a hard requirement on ruby 2.3.x,
|
10
|
+
# locking it down this way
|
11
|
+
gem 'rack', '= 1.6.4'
|
12
|
+
|
13
|
+
gem 'sequel', '~> 4.6', '>= 4.6.0'
|
14
|
+
|
15
|
+
# making ruby 2.3.0 happy
|
16
|
+
gem 'hoe', '~> 3.15', '>= 3.15.1'
|
17
|
+
|
18
|
+
group :development do
|
19
|
+
gem 'jeweler', '~> 2.0', '>= 2.0.0'
|
20
|
+
gem 'test-unit', '~> 2.0', '>= 2.0.0'
|
21
|
+
end
|
22
|
+
|
23
|
+
group :sqlite do
|
24
|
+
gem 'sqlite3', '~> 1.3', '>= 1.3.11'
|
25
|
+
end
|
26
|
+
|
27
|
+
group :postgres do
|
28
|
+
gem 'pg', '~> 0.18', '>= 0.18.4'
|
29
|
+
end
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
GEM
|
2
|
+
remote: https://rubygems.org/
|
3
|
+
specs:
|
4
|
+
addressable (2.4.0)
|
5
|
+
builder (3.2.2)
|
6
|
+
descendants_tracker (0.0.4)
|
7
|
+
thread_safe (~> 0.3, >= 0.3.1)
|
8
|
+
faraday (0.9.2)
|
9
|
+
multipart-post (>= 1.2, < 3)
|
10
|
+
git (1.3.0)
|
11
|
+
github_api (0.13.1)
|
12
|
+
addressable (~> 2.4.0)
|
13
|
+
descendants_tracker (~> 0.0.4)
|
14
|
+
faraday (~> 0.8, < 0.10)
|
15
|
+
hashie (>= 3.4)
|
16
|
+
multi_json (>= 1.7.5, < 2.0)
|
17
|
+
oauth2
|
18
|
+
hashie (3.4.4)
|
19
|
+
highline (1.7.8)
|
20
|
+
hoe (3.15.1)
|
21
|
+
rake (>= 0.8, < 12.0)
|
22
|
+
jeweler (2.0.1)
|
23
|
+
builder
|
24
|
+
bundler (>= 1.0)
|
25
|
+
git (>= 1.2.5)
|
26
|
+
github_api
|
27
|
+
highline (>= 1.6.15)
|
28
|
+
nokogiri (>= 1.5.10)
|
29
|
+
rake
|
30
|
+
rdoc
|
31
|
+
json (1.8.3)
|
32
|
+
jwt (1.5.1)
|
33
|
+
log4r (1.1.10)
|
34
|
+
mini_portile2 (2.0.0)
|
35
|
+
multi_json (1.12.1)
|
36
|
+
multi_xml (0.5.5)
|
37
|
+
multipart-post (2.0.0)
|
38
|
+
nokogiri (1.6.7.2)
|
39
|
+
mini_portile2 (~> 2.0.0.rc2)
|
40
|
+
oauth2 (1.1.0)
|
41
|
+
faraday (>= 0.8, < 0.10)
|
42
|
+
jwt (~> 1.0, < 1.5.2)
|
43
|
+
multi_json (~> 1.3)
|
44
|
+
multi_xml (~> 0.5)
|
45
|
+
rack (>= 1.2, < 3)
|
46
|
+
pg (0.18.4)
|
47
|
+
rack (1.6.4)
|
48
|
+
rake (11.2.2)
|
49
|
+
rdoc (4.2.2)
|
50
|
+
json (~> 1.4)
|
51
|
+
sequel (4.37.0)
|
52
|
+
sqlite3 (1.3.11)
|
53
|
+
test-unit (2.0.0.0)
|
54
|
+
thread_safe (0.3.5)
|
55
|
+
|
56
|
+
PLATFORMS
|
57
|
+
ruby
|
58
|
+
|
59
|
+
DEPENDENCIES
|
60
|
+
hoe (~> 3.15, >= 3.15.1)
|
61
|
+
jeweler (~> 2.0, >= 2.0.0)
|
62
|
+
log4r (~> 1.1.9, > 1.1)
|
63
|
+
pg (~> 0.18, >= 0.18.4)
|
64
|
+
rack (= 1.6.4)
|
65
|
+
sequel (~> 4.6, >= 4.6.0)
|
66
|
+
sqlite3 (~> 1.3, >= 1.3.11)
|
67
|
+
test-unit (~> 2.0, >= 2.0.0)
|
68
|
+
|
69
|
+
BUNDLED WITH
|
70
|
+
1.12.5
|
data/README.md
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# log4r-sequel
|
2
|
+
Log4r outputter to a Sequel database handle
|
3
|
+
|
4
|
+
## usage
|
5
|
+
|
6
|
+
### pre-built gem installation (stable)
|
7
|
+
|
8
|
+
[](https://rubygems.org/gems/log4r-sequel)
|
9
|
+
|
10
|
+
```sh
|
11
|
+
gem install log4r-sequel
|
12
|
+
irb
|
13
|
+
...
|
14
|
+
irb(main):001:0> require 'log4r/outputter/sequeloutputter'
|
15
|
+
=> true
|
16
|
+
irb(main):002:0> logger = Log4r::Logger.new('foo')
|
17
|
+
=> #<Log4r::Logger:0x007f889b056df8 @fullname="foo" ...>
|
18
|
+
```
|
19
|
+
|
20
|
+
|
21
|
+
### from-source installation (latest)
|
22
|
+
|
23
|
+
[](https://travis-ci.org/chorankates/log4r-sequel)
|
24
|
+
|
25
|
+
```sh
|
26
|
+
git clone https://github.com/chorankates/log4r-sequel.git
|
27
|
+
cd log4r-sequel
|
28
|
+
rake clean build
|
29
|
+
gem install --local pkg/log4r-sequel*.gem
|
30
|
+
irb
|
31
|
+
...
|
32
|
+
irb(main):001:0> require 'log4r/outputter/sequeloutputter'
|
33
|
+
=> true
|
34
|
+
```
|
35
|
+
|
36
|
+
## supported databases
|
37
|
+
* sqlite3
|
38
|
+
* Postgres
|
39
|
+
|
40
|
+
## TODO
|
41
|
+
* allow database name to be semi-dynamically generated - via YAML config, not just by passing the hash directly
|
42
|
+
* tests
|
43
|
+
* unit tests
|
44
|
+
* marketing
|
45
|
+
* screencast / sample output in README.md
|
data/Rakefile
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'jeweler'
|
2
|
+
require 'rake'
|
3
|
+
require 'rake/clean'
|
4
|
+
require 'rake/testtask'
|
5
|
+
|
6
|
+
CLEAN.include('**/*.sqlite')
|
7
|
+
CLEAN.include('pkg/*')
|
8
|
+
|
9
|
+
Jeweler::Tasks.new do |gem|
|
10
|
+
gem.name = 'log4r-sequel'
|
11
|
+
gem.summary = 'Log4r::Outputter::Sequel'
|
12
|
+
gem.description = 'Log4r::Outputter that writes to a Sequel database'
|
13
|
+
gem.email = ['conor.code@gmail.com']
|
14
|
+
gem.homepage = 'http://github.com/chorankates/log4r-sequel'
|
15
|
+
gem.authors = ['Conor Horan-Kates']
|
16
|
+
gem.licenses = 'MIT'
|
17
|
+
|
18
|
+
gem.files.exclude 'examples/*'
|
19
|
+
gem.files.exclude 'pkg/*'
|
20
|
+
end
|
21
|
+
Jeweler::RubygemsDotOrgTasks.new
|
22
|
+
|
23
|
+
namespace :test do
|
24
|
+
|
25
|
+
Rake::TestTask.new do |t|
|
26
|
+
t.name = 'functional'
|
27
|
+
t.libs << 'lib'
|
28
|
+
t.test_files = FileList['test/functional/**/test_*.rb']
|
29
|
+
#t.verbose = true
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
desc 'run all tests'
|
34
|
+
task :test => ['clean', 'test:functional'] do; end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
@@ -0,0 +1,18 @@
|
|
1
|
+
$LOAD_PATH << sprintf('%s/../lib', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
#require 'log4r-sequel'
|
4
|
+
require 'log4r/outputter/sequeloutputter'
|
5
|
+
|
6
|
+
file = sprintf('%s/log4r-postgres.yaml', File.dirname(__FILE__))
|
7
|
+
Log4r::YamlConfigurator.load_yaml_file(file)
|
8
|
+
|
9
|
+
logger = Log4r::Logger.get('bar')
|
10
|
+
|
11
|
+
[logger].each do |l|
|
12
|
+
## log some garbage
|
13
|
+
l.debug('this is a debug message')
|
14
|
+
l.info('this is an info message')
|
15
|
+
l.warn('this is a warning')
|
16
|
+
l.error('this is an error')
|
17
|
+
l.fatal('this is a fatal')
|
18
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
$LOAD_PATH << sprintf('%s/../lib', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
require 'sqlite3'
|
4
|
+
|
5
|
+
#require 'log4r-sequel'
|
6
|
+
require 'log4r/outputter/sequeloutputter'
|
7
|
+
require 'log4r/yamlconfigurator'
|
8
|
+
|
9
|
+
## instantiate a logger following the log4r pattern
|
10
|
+
file = sprintf('%s/log4r-sqlite.yaml', File.dirname(__FILE__))
|
11
|
+
Log4r::YamlConfigurator.load_yaml_file(file)
|
12
|
+
|
13
|
+
logger = Log4r::Logger.get('foo')
|
14
|
+
|
15
|
+
[logger].each do |l|
|
16
|
+
## log some garbage
|
17
|
+
l.debug('this is a debug message')
|
18
|
+
l.info('this is an info message')
|
19
|
+
l.warn('this is a warning')
|
20
|
+
l.error('this is an error')
|
21
|
+
l.fatal('this is a fatal')
|
22
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
---
|
2
|
+
log4r_config:
|
3
|
+
loggers:
|
4
|
+
- name: 'bar'
|
5
|
+
outputters:
|
6
|
+
- sequel
|
7
|
+
- stdout
|
8
|
+
outputters:
|
9
|
+
# not needed, but feedback is useful
|
10
|
+
- type: StdoutOutputter
|
11
|
+
name: stdout
|
12
|
+
formatter:
|
13
|
+
type: PatternFormatter
|
14
|
+
date_pattern: '%Y/%m/%d %H:%M.%s'
|
15
|
+
pattern: '%d | %C | %l | %m'
|
16
|
+
|
17
|
+
- type: SequelOutputter
|
18
|
+
# traditional Log4r settings
|
19
|
+
name: sequel
|
20
|
+
level: DEBUG
|
21
|
+
formatter:
|
22
|
+
type: PatternFormatter
|
23
|
+
date_pattern: '%Y/%m/%d %H:%M.%s'
|
24
|
+
pattern: '%d!@#$%l!@#$%C!@#$%c!@#$%h!@#$%p!@#$%m' # kitchen sink
|
25
|
+
# log4r-sequel settings
|
26
|
+
engine: postgres
|
27
|
+
server: localhost
|
28
|
+
port: 5432
|
29
|
+
database: logs
|
30
|
+
table: logs
|
31
|
+
username: postgres
|
32
|
+
password: postgres
|
33
|
+
delimiter: '!@#$' # this is used to determine columns needed based on log4 configuration
|
34
|
+
map:
|
35
|
+
0: 'date'
|
36
|
+
1: 'level'
|
37
|
+
2: 'class'
|
38
|
+
3: 'relative_class'
|
39
|
+
4: 'thread'
|
40
|
+
5: 'pid'
|
41
|
+
6: 'message'
|
42
|
+
|
43
|
+
# truncated map from http://log4r.rubyforge.org/rdoc/Log4r/PatternFormatter.html
|
44
|
+
# %c - event short name
|
45
|
+
# %C - event fullname
|
46
|
+
# %d - date
|
47
|
+
# %g - Global Diagnostic Context (GDC)
|
48
|
+
# %t - trace
|
49
|
+
# %m - message
|
50
|
+
# %h - thread name
|
51
|
+
# %p - process ID aka PID
|
52
|
+
# %M - formatted message
|
53
|
+
# %l - Level in string form
|
@@ -0,0 +1,46 @@
|
|
1
|
+
---
|
2
|
+
log4r_config:
|
3
|
+
loggers:
|
4
|
+
- name: 'foo'
|
5
|
+
outputters:
|
6
|
+
- sequel
|
7
|
+
- stdout
|
8
|
+
outputters:
|
9
|
+
# not needed, but feedback is useful
|
10
|
+
- type: StdoutOutputter
|
11
|
+
name: stdout
|
12
|
+
formatter:
|
13
|
+
type: PatternFormatter
|
14
|
+
date_pattern: '%Y/%m/%d %H:%M.%s'
|
15
|
+
pattern: '%d | %C | %l | %m'
|
16
|
+
|
17
|
+
- type: SequelOutputter
|
18
|
+
# traditional Log4r settings
|
19
|
+
name: sequel
|
20
|
+
level: DEBUG
|
21
|
+
formatter:
|
22
|
+
type: PatternFormatter
|
23
|
+
date_pattern: '%Y/%m/%d %H:%M.%s'
|
24
|
+
pattern: '%d!@#$%C!@#$%l!@#$%m' # date|level|event/class fullname|message
|
25
|
+
# log4r-sequel settings
|
26
|
+
engine: sqlite
|
27
|
+
file: log.sqlite
|
28
|
+
table: logs
|
29
|
+
delimiter: '!@#$' # this is used to determine columns needed based on log4 configuration
|
30
|
+
map:
|
31
|
+
0: 'date'
|
32
|
+
1: 'level'
|
33
|
+
2: 'class'
|
34
|
+
3: 'message'
|
35
|
+
|
36
|
+
# truncated map from http://log4r.rubyforge.org/rdoc/Log4r/PatternFormatter.html
|
37
|
+
# %c - event short name
|
38
|
+
# %C - event fullname
|
39
|
+
# %d - date
|
40
|
+
# %g - Global Diagnostic Context (GDC)
|
41
|
+
# %t - trace
|
42
|
+
# %m - message
|
43
|
+
# %h - thread name
|
44
|
+
# %p - process ID aka PID
|
45
|
+
# %M - formatted message
|
46
|
+
# %l - Level in string form
|
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'log4r'
|
2
|
+
require 'log4r/yamlconfigurator'
|
3
|
+
require 'sequel'
|
4
|
+
require 'yaml'
|
5
|
+
|
6
|
+
# TODO should we move this to ../logger.rb
|
7
|
+
# TODO .. or should we remove this entirely? it was implemented to let us call connect/configure, but since we do that in initiliaze now, maybe we just pull it
|
8
|
+
class Log4r::Logger
|
9
|
+
# +method+ String or Symbol representing the name of the method in the Log4r::Outputter::SequelOutputter class you want to use
|
10
|
+
# +parameters+ arbitrary data type to be passed to :methods
|
11
|
+
def sequel(method, parameters = { })
|
12
|
+
# TODO support methods that take more than one parameter
|
13
|
+
self.outputters.each do |op|
|
14
|
+
next unless op.is_a?(SequelOutputter)
|
15
|
+
return op.send(method.to_sym, parameters)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# no parameters, returns the first Log4r::Outputter::Sequel object
|
20
|
+
# TODO is there ever a case where there would be more than one?
|
21
|
+
def get_outputter
|
22
|
+
self.outputters.each do |op|
|
23
|
+
next unless op.is_a?(SequelOutputter)
|
24
|
+
return op
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
class SequelOutputter < Log4r::Outputter
|
31
|
+
|
32
|
+
KNOWN_ENGINES = [
|
33
|
+
:postgres,
|
34
|
+
:sqlite,
|
35
|
+
]
|
36
|
+
|
37
|
+
attr_reader :database, :delimiter, :engine, :file, :map, :table
|
38
|
+
attr_accessor :dbh
|
39
|
+
|
40
|
+
def initialize(name, hash)
|
41
|
+
super(name, hash) # make us a real Log4r::Outputter object
|
42
|
+
dbh = configure(hash) # validate settings passed
|
43
|
+
connect(dbh) # actually connect to the DBH
|
44
|
+
end
|
45
|
+
|
46
|
+
# +input+ Hash of configuration options
|
47
|
+
def configure(input)
|
48
|
+
config = input
|
49
|
+
|
50
|
+
# convert all keys to symbols
|
51
|
+
new_config = Hash.new
|
52
|
+
config.keys.each do |key|
|
53
|
+
new_config[key.to_sym] = config[key]
|
54
|
+
end
|
55
|
+
config = new_config
|
56
|
+
|
57
|
+
@engine = config[:engine].to_sym
|
58
|
+
|
59
|
+
# error checking on table/column settings
|
60
|
+
@table = config[:table].to_sym
|
61
|
+
@map = config[:map]
|
62
|
+
@delimiter = config[:delimiter]
|
63
|
+
[@delimiter, @map, @table].each do |required|
|
64
|
+
raise Log4r::ConfigError.new(sprintf("required '%s' key missing from configuration", required)) if required.nil?
|
65
|
+
end
|
66
|
+
|
67
|
+
if @engine.eql?(:postgres)
|
68
|
+
@database = config[:database]
|
69
|
+
@file = nil
|
70
|
+
server = config[:server]
|
71
|
+
port = config[:port]
|
72
|
+
username = config[:username]
|
73
|
+
password = config[:password]
|
74
|
+
@dbh = Sequel.connect(sprintf('postgres://%s:%s@%s:%s/%s', username, password, server, port, @database))
|
75
|
+
elsif @engine.eql?(:sqlite)
|
76
|
+
@database = nil # sqlite has one DB per file
|
77
|
+
@file = config[:file]
|
78
|
+
@dbh = Sequel.connect(sprintf('sqlite://%s', @file))
|
79
|
+
else
|
80
|
+
raise Log4r::ConfigError.new(sprintf('unable to use engine[%s], allowed[%s]', @engine, KNOWN_ENGINES))
|
81
|
+
end
|
82
|
+
|
83
|
+
@dbh
|
84
|
+
end
|
85
|
+
|
86
|
+
# +dbh+ a Sequel::Database handle
|
87
|
+
## while not really supported, if you take care of the database/table creation, you could hack it in here by <your_logger>.outputters[<sequel outputter>].connect(<dbh>)
|
88
|
+
def connect(dbh)
|
89
|
+
raise StandardError.new(sprintf('invalid parameter class[%s] expecting[Sequel::Database]', dbh.class)) unless dbh.is_a?(Sequel::Database)
|
90
|
+
|
91
|
+
@dbh = dbh
|
92
|
+
|
93
|
+
# idempotently create table/columns
|
94
|
+
initialize_db
|
95
|
+
end
|
96
|
+
|
97
|
+
def connected?
|
98
|
+
# this is sufficient since we throw an exception during #connect if we don't get a good handle
|
99
|
+
! @dbh.nil?
|
100
|
+
end
|
101
|
+
|
102
|
+
private
|
103
|
+
|
104
|
+
def write(data)
|
105
|
+
raise StandardError.new(sprintf('%s is not connected, run %s.connect(yaml_file)', self.class, self.class)) unless connected?
|
106
|
+
# INSERT INTO `logs`(`id`,`date`,`level`,`class`,`message`) VALUES (1,NULL,NULL,NULL,NULL);
|
107
|
+
tokens = data.split(@delimiter)
|
108
|
+
hash = Hash.new
|
109
|
+
|
110
|
+
tokens.each_with_index do |token, i|
|
111
|
+
hash[@map[i].to_sym] = token
|
112
|
+
end
|
113
|
+
|
114
|
+
@dbh[@table].insert(hash)
|
115
|
+
end
|
116
|
+
|
117
|
+
def initialize_db
|
118
|
+
map = @map # we're in a different class in the block below, can't access
|
119
|
+
@dbh.create_table? @table do
|
120
|
+
primary_key :id
|
121
|
+
map.values.each do |v|
|
122
|
+
String v.to_sym
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
$LOAD_PATH << sprintf('%s/../../lib', File.dirname(__FILE__))
|
2
|
+
require 'log4r/outputter/sequeloutputter'
|
3
|
+
|
4
|
+
|
5
|
+
require 'test/unit'
|
6
|
+
|
7
|
+
class TestSqlite < Test::Unit::TestCase
|
8
|
+
|
9
|
+
def setup
|
10
|
+
@good_config = sprintf('%s/../log4r-sqlite_test.yaml', File.expand_path(File.dirname(__FILE__)))
|
11
|
+
@table = :logs
|
12
|
+
end
|
13
|
+
|
14
|
+
def teardown
|
15
|
+
# TODO remove the database.. assume it's just '*.sqlite' in this path?
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
def test_happy_yaml
|
20
|
+
file = @good_config
|
21
|
+
Log4r::YamlConfigurator.load_yaml_file(file)
|
22
|
+
|
23
|
+
logger = nil
|
24
|
+
|
25
|
+
assert_nothing_raised do
|
26
|
+
logger = Log4r::Logger.get('test')
|
27
|
+
end
|
28
|
+
|
29
|
+
assert_not_nil(logger)
|
30
|
+
assert_equal(0, logger.get_outputter.dbh[@table].count)
|
31
|
+
|
32
|
+
assert_nothing_raised do
|
33
|
+
logger.debug('this is a debug message')
|
34
|
+
logger.info('this is an info message')
|
35
|
+
logger.warn('this is a warning')
|
36
|
+
logger.error('this is an error')
|
37
|
+
logger.fatal('this is a fatal')
|
38
|
+
end
|
39
|
+
|
40
|
+
assert_not_equal(0, logger.get_outputter.dbh[@table].count)
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_sad_config
|
45
|
+
# TODO pass in bad configs as hashes
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
---
|
2
|
+
log4r_config:
|
3
|
+
loggers:
|
4
|
+
- name: 'test'
|
5
|
+
outputters:
|
6
|
+
- sequel
|
7
|
+
- stdout
|
8
|
+
outputters:
|
9
|
+
# not needed, but feedback is useful
|
10
|
+
- type: StdoutOutputter
|
11
|
+
name: stdout
|
12
|
+
formatter:
|
13
|
+
type: PatternFormatter
|
14
|
+
date_pattern: '%Y/%m/%d %H:%M.%s'
|
15
|
+
pattern: '%d | %C | %l | %m'
|
16
|
+
|
17
|
+
- type: SequelOutputter
|
18
|
+
# traditional Log4r settings
|
19
|
+
name: sequel
|
20
|
+
level: DEBUG
|
21
|
+
formatter:
|
22
|
+
type: PatternFormatter
|
23
|
+
date_pattern: '%Y/%m/%d %H:%M.%s'
|
24
|
+
pattern: '%d!@#$%C!@#$%l!@#$%m' # date|level|event/class fullname|message
|
25
|
+
# log4r-sequel settings
|
26
|
+
engine: sqlite
|
27
|
+
file: log.sqlite
|
28
|
+
table: logs
|
29
|
+
delimiter: '!@#$' # this is used to determine columns needed based on log4 configuration
|
30
|
+
map:
|
31
|
+
0: 'date'
|
32
|
+
1: 'level'
|
33
|
+
2: 'class'
|
34
|
+
3: 'message'
|
35
|
+
|
36
|
+
# truncated map from http://log4r.rubyforge.org/rdoc/Log4r/PatternFormatter.html
|
37
|
+
# %c - event short name
|
38
|
+
# %C - event fullname
|
39
|
+
# %d - date
|
40
|
+
# %g - Global Diagnostic Context (GDC)
|
41
|
+
# %t - trace
|
42
|
+
# %m - message
|
43
|
+
# %h - thread name
|
44
|
+
# %p - process ID aka PID
|
45
|
+
# %M - formatted message
|
46
|
+
# %l - Level in string form
|
metadata
ADDED
@@ -0,0 +1,172 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: log4r-sequel
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Conor Horan-Kates
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-08-27 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: log4r
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>'
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.1'
|
20
|
+
- - ~>
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.1.9
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - '>'
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.1'
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.1.9
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: rack
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - '='
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 1.6.4
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - '='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 1.6.4
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: sequel
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 4.6.0
|
54
|
+
- - ~>
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '4.6'
|
57
|
+
type: :runtime
|
58
|
+
prerelease: false
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - '>='
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: 4.6.0
|
64
|
+
- - ~>
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '4.6'
|
67
|
+
- !ruby/object:Gem::Dependency
|
68
|
+
name: hoe
|
69
|
+
requirement: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - '>='
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: 3.15.1
|
74
|
+
- - ~>
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '3.15'
|
77
|
+
type: :runtime
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: 3.15.1
|
84
|
+
- - ~>
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '3.15'
|
87
|
+
- !ruby/object:Gem::Dependency
|
88
|
+
name: jeweler
|
89
|
+
requirement: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 2.0.0
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '2.0'
|
97
|
+
type: :development
|
98
|
+
prerelease: false
|
99
|
+
version_requirements: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 2.0.0
|
104
|
+
- - ~>
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '2.0'
|
107
|
+
- !ruby/object:Gem::Dependency
|
108
|
+
name: test-unit
|
109
|
+
requirement: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - '>='
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: 2.0.0
|
114
|
+
- - ~>
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '2.0'
|
117
|
+
type: :development
|
118
|
+
prerelease: false
|
119
|
+
version_requirements: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - '>='
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: 2.0.0
|
124
|
+
- - ~>
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '2.0'
|
127
|
+
description: Log4r::Outputter that writes to a Sequel database
|
128
|
+
email:
|
129
|
+
- conor.code@gmail.com
|
130
|
+
executables: []
|
131
|
+
extensions: []
|
132
|
+
extra_rdoc_files:
|
133
|
+
- README.md
|
134
|
+
files:
|
135
|
+
- .travis.yml
|
136
|
+
- Gemfile
|
137
|
+
- Gemfile.lock
|
138
|
+
- README.md
|
139
|
+
- Rakefile
|
140
|
+
- VERSION
|
141
|
+
- example/log2postgres.rb
|
142
|
+
- example/log2sqlite.rb
|
143
|
+
- example/log4r-postgres.yaml
|
144
|
+
- example/log4r-sqlite.yaml
|
145
|
+
- lib/log4r/outputter/sequeloutputter.rb
|
146
|
+
- test/functional/test_sqlite.rb
|
147
|
+
- test/log4r-sqlite_test.yaml
|
148
|
+
homepage: http://github.com/chorankates/log4r-sequel
|
149
|
+
licenses:
|
150
|
+
- MIT
|
151
|
+
metadata: {}
|
152
|
+
post_install_message:
|
153
|
+
rdoc_options: []
|
154
|
+
require_paths:
|
155
|
+
- lib
|
156
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - '>='
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0'
|
161
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
162
|
+
requirements:
|
163
|
+
- - '>='
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
requirements: []
|
167
|
+
rubyforge_project:
|
168
|
+
rubygems_version: 2.4.8
|
169
|
+
signing_key:
|
170
|
+
specification_version: 4
|
171
|
+
summary: Log4r::Outputter::Sequel
|
172
|
+
test_files: []
|