log4r-sequel 0.0.2 → 0.0.3
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 +4 -4
- data/Gemfile +5 -5
- data/Gemfile.lock +16 -13
- data/README.md +5 -8
- data/Rakefile +10 -3
- data/VERSION +1 -1
- data/lib/log4r/outputter/sequeloutputter.rb +3 -12
- data/log4r-sequel.gemspec +69 -0
- data/test/{log4r-postgres_test.yaml → config/log4r-postgres.yaml} +0 -0
- data/test/{log4r-sqlite_test.yaml → config/log4r-sqlite.yaml} +1 -1
- data/test/functional/test_postgres.rb +4 -8
- data/test/functional/test_sqlite.rb +4 -9
- data/test/helper.rb +19 -0
- data/test/unit/test_postgres.rb +119 -0
- data/test/unit/test_sqlite.rb +111 -0
- metadata +22 -22
- data/example/log2postgres.rb +0 -18
- data/example/log2sqlite.rb +0 -19
- data/example/log4r-postgres.yaml +0 -53
- data/example/log4r-sqlite.yaml +0 -46
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bbcb59ef938e2f81f26cc69a2d19499eab310e5b
|
4
|
+
data.tar.gz: 1a44bf191adb4e188142e2ddc4e3002ecbc0ee97
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dc8530fafb4a599c17eeab549cae77f9ed055dac763b237534a8fc3d0bf0cf2cc58cfc2b1311eb2889e4fdeaa99234a50d4be5eaea1781d9f4ef772af935f3d9
|
7
|
+
data.tar.gz: c9801a3ea103a0d0a3663e30a48e524594dc21b3dddb7fb297f36ceaa7906395ee54189c42168975fb698d6f2742791c52f1707458afbd0455505fb763511650
|
data/Gemfile
CHANGED
@@ -5,11 +5,6 @@ source 'https://rubygems.org'
|
|
5
5
|
|
6
6
|
gem 'log4r', '~> 1.1.9', '> 1.1'
|
7
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
8
|
gem 'sequel', '~> 4.6', '>= 4.6.0'
|
14
9
|
|
15
10
|
# making ruby 2.3.0 happy
|
@@ -18,6 +13,11 @@ gem 'hoe', '~> 3.15', '>= 3.15.1'
|
|
18
13
|
group :development do
|
19
14
|
gem 'jeweler', '~> 2.0', '>= 2.0.0'
|
20
15
|
gem 'test-unit', '~> 2.0', '>= 2.0.0'
|
16
|
+
|
17
|
+
# ugh this is so stupid - jeweler pulls in the latest version of this -
|
18
|
+
# through it's own dependency, causing a hard requirement on ruby 2.3.x,
|
19
|
+
# locking it down this way
|
20
|
+
gem 'rack', '= 1.6.4'
|
21
21
|
end
|
22
22
|
|
23
23
|
group :sqlite do
|
data/Gemfile.lock
CHANGED
@@ -8,18 +8,17 @@ GEM
|
|
8
8
|
faraday (0.9.2)
|
9
9
|
multipart-post (>= 1.2, < 3)
|
10
10
|
git (1.3.0)
|
11
|
-
github_api (0.
|
11
|
+
github_api (0.14.5)
|
12
12
|
addressable (~> 2.4.0)
|
13
13
|
descendants_tracker (~> 0.0.4)
|
14
14
|
faraday (~> 0.8, < 0.10)
|
15
15
|
hashie (>= 3.4)
|
16
|
-
|
17
|
-
|
18
|
-
hashie (3.4.4)
|
16
|
+
oauth2 (~> 1.0)
|
17
|
+
hashie (3.4.6)
|
19
18
|
highline (1.7.8)
|
20
19
|
hoe (3.15.1)
|
21
20
|
rake (>= 0.8, < 12.0)
|
22
|
-
jeweler (2.
|
21
|
+
jeweler (2.1.1)
|
23
22
|
builder
|
24
23
|
bundler (>= 1.0)
|
25
24
|
git (>= 1.2.5)
|
@@ -28,29 +27,33 @@ GEM
|
|
28
27
|
nokogiri (>= 1.5.10)
|
29
28
|
rake
|
30
29
|
rdoc
|
30
|
+
semver
|
31
31
|
json (1.8.3)
|
32
|
-
jwt (1.5.
|
32
|
+
jwt (1.5.6)
|
33
33
|
log4r (1.1.10)
|
34
|
-
mini_portile2 (2.
|
34
|
+
mini_portile2 (2.1.0)
|
35
35
|
multi_json (1.12.1)
|
36
36
|
multi_xml (0.5.5)
|
37
37
|
multipart-post (2.0.0)
|
38
|
-
nokogiri (1.6.
|
39
|
-
mini_portile2 (~> 2.
|
40
|
-
|
38
|
+
nokogiri (1.6.8)
|
39
|
+
mini_portile2 (~> 2.1.0)
|
40
|
+
pkg-config (~> 1.1.7)
|
41
|
+
oauth2 (1.2.0)
|
41
42
|
faraday (>= 0.8, < 0.10)
|
42
|
-
jwt (~> 1.0
|
43
|
+
jwt (~> 1.0)
|
43
44
|
multi_json (~> 1.3)
|
44
45
|
multi_xml (~> 0.5)
|
45
46
|
rack (>= 1.2, < 3)
|
46
47
|
pg (0.18.4)
|
48
|
+
pkg-config (1.1.7)
|
47
49
|
rack (1.6.4)
|
48
50
|
rake (11.2.2)
|
49
51
|
rdoc (4.2.2)
|
50
52
|
json (~> 1.4)
|
51
|
-
|
53
|
+
semver (1.0.1)
|
54
|
+
sequel (4.38.0)
|
52
55
|
sqlite3 (1.3.11)
|
53
|
-
test-unit (2.
|
56
|
+
test-unit (2.5.5)
|
54
57
|
thread_safe (0.3.5)
|
55
58
|
|
56
59
|
PLATFORMS
|
data/README.md
CHANGED
@@ -6,9 +6,9 @@ Log4r outputter to a Sequel database handle
|
|
6
6
|
- [from-source installation (latest)](#from-source-installation-latest)
|
7
7
|
- [demo](#demo)
|
8
8
|
- [supported databases](#supported-databases)
|
9
|
-
- [
|
9
|
+
- [notes](#notes)
|
10
10
|
|
11
|
-
the de-facto standard library for logging in Ruby, [log4r](https://github.com/colbygk/log4r) works very well for a wide array of logging targets:
|
11
|
+
the de-facto standard library for logging in Ruby, [log4r](https://github.com/colbygk/log4r), works very well for a wide array of logging targets:
|
12
12
|
* STDOUT / STDERR
|
13
13
|
* file
|
14
14
|
* email
|
@@ -16,6 +16,8 @@ the de-facto standard library for logging in Ruby, [log4r](https://github.com/co
|
|
16
16
|
|
17
17
|
and so on, but didn't have a way to output directly to a database - enter `log4r-sequel`
|
18
18
|
|
19
|
+
this project was inspired/motivated by the fact that [chainsaw](http://log4r.rubyforge.org/manual.html#chainsaw) isn't supported on recent versions of OSX.
|
20
|
+
|
19
21
|
## usage
|
20
22
|
|
21
23
|
### pre-built gem installation (stable)
|
@@ -51,7 +53,7 @@ irb(main):001:0> require 'log4r/outputter/sequeloutputter'
|
|
51
53
|
### demo
|
52
54
|
|
53
55
|
```
|
54
|
-
$ ruby example/
|
56
|
+
$ ruby example/log2sqlite.rb
|
55
57
|
2016/08/27 17:08.1472342938 | bar | DEBUG | this is a debug message
|
56
58
|
2016/08/27 17:08.1472342938 | bar | INFO | this is an info message
|
57
59
|
2016/08/27 17:08.1472342938 | bar | WARN | this is a warning
|
@@ -73,11 +75,6 @@ sqlite>
|
|
73
75
|
* sqlite3
|
74
76
|
* Postgres
|
75
77
|
|
76
|
-
## TODO
|
77
|
-
* tests
|
78
|
-
* unit tests
|
79
|
-
|
80
|
-
|
81
78
|
## notes
|
82
79
|
* `:database`, `:table`, and `:file` options are passed through `Time.now.strftime(%s)`
|
83
80
|
* sqlite filenames cannot contain underscores (`the scheme sqlite does not accept registry part`)
|
data/Rakefile
CHANGED
@@ -15,7 +15,7 @@ Jeweler::Tasks.new do |gem|
|
|
15
15
|
gem.authors = ['Conor Horan-Kates']
|
16
16
|
gem.licenses = 'MIT'
|
17
17
|
|
18
|
-
gem.files.exclude '
|
18
|
+
gem.files.exclude 'example/*'
|
19
19
|
gem.files.exclude 'pkg/*'
|
20
20
|
end
|
21
21
|
Jeweler::RubygemsDotOrgTasks.new
|
@@ -26,9 +26,16 @@ namespace :test do
|
|
26
26
|
t.name = 'functional'
|
27
27
|
t.libs << 'lib'
|
28
28
|
t.test_files = FileList['test/functional/**/test_*.rb']
|
29
|
-
|
29
|
+
t.verbose = false
|
30
|
+
end
|
31
|
+
|
32
|
+
Rake::TestTask.new do |t|
|
33
|
+
t.name = 'unit'
|
34
|
+
t.libs << 'lib'
|
35
|
+
t.test_files = FileList['test/unit/**/test_*.rb']
|
36
|
+
t.verbose = false
|
30
37
|
end
|
31
38
|
|
32
39
|
end
|
33
40
|
desc 'run all tests'
|
34
|
-
task :test => ['clean', 'test:functional'] do; end
|
41
|
+
task :test => ['clean', 'test:functional', 'test:unit'] do; end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.3
|
@@ -3,18 +3,6 @@ require 'log4r/yamlconfigurator'
|
|
3
3
|
require 'sequel'
|
4
4
|
require 'yaml'
|
5
5
|
|
6
|
-
class Log4r::Logger
|
7
|
-
|
8
|
-
# no parameters, returns the first Log4r::Outputter::Sequel object
|
9
|
-
def get_outputter
|
10
|
-
self.outputters.each do |op|
|
11
|
-
next unless op.is_a?(SequelOutputter)
|
12
|
-
return op
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
|
18
6
|
class SequelOutputter < Log4r::Outputter
|
19
7
|
|
20
8
|
KNOWN_ENGINES = [
|
@@ -51,6 +39,8 @@ class SequelOutputter < Log4r::Outputter
|
|
51
39
|
|
52
40
|
{
|
53
41
|
:delimiter => @delimiter,
|
42
|
+
:engine => @engine,
|
43
|
+
:formatter => config[:formatter], # feels a bit weird mixing instance variables and referencing the hash directly
|
54
44
|
:map => @map,
|
55
45
|
:table => @table,
|
56
46
|
}.each_pair do |key, value|
|
@@ -108,6 +98,7 @@ class SequelOutputter < Log4r::Outputter
|
|
108
98
|
|
109
99
|
def initialize_db
|
110
100
|
map = @map # we're in a different class in the block below, can't access
|
101
|
+
# TODO would be better to check to see if the DB is good rather than just throw an exception here
|
111
102
|
@dbh.create_table? @table do
|
112
103
|
primary_key :id
|
113
104
|
map.values.each do |v|
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
# stub: log4r-sequel 0.0.3 ruby lib
|
6
|
+
|
7
|
+
Gem::Specification.new do |s|
|
8
|
+
s.name = "log4r-sequel"
|
9
|
+
s.version = "0.0.3"
|
10
|
+
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
|
+
s.require_paths = ["lib"]
|
13
|
+
s.authors = ["Conor Horan-Kates"]
|
14
|
+
s.date = "2016-09-20"
|
15
|
+
s.description = "Log4r::Outputter that writes to a Sequel database"
|
16
|
+
s.email = ["conor.code@gmail.com"]
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"README.md"
|
19
|
+
]
|
20
|
+
s.files = [
|
21
|
+
".travis.yml",
|
22
|
+
"Gemfile",
|
23
|
+
"Gemfile.lock",
|
24
|
+
"README.md",
|
25
|
+
"Rakefile",
|
26
|
+
"VERSION",
|
27
|
+
"lib/log4r/outputter/sequeloutputter.rb",
|
28
|
+
"log4r-sequel.gemspec",
|
29
|
+
"test/config/log4r-postgres.yaml",
|
30
|
+
"test/config/log4r-sqlite.yaml",
|
31
|
+
"test/functional/test_postgres.rb",
|
32
|
+
"test/functional/test_sqlite.rb",
|
33
|
+
"test/helper.rb",
|
34
|
+
"test/unit/test_postgres.rb",
|
35
|
+
"test/unit/test_sqlite.rb"
|
36
|
+
]
|
37
|
+
s.homepage = "http://github.com/chorankates/log4r-sequel"
|
38
|
+
s.licenses = ["MIT"]
|
39
|
+
s.rubygems_version = "2.4.8"
|
40
|
+
s.summary = "Log4r::Outputter::Sequel"
|
41
|
+
|
42
|
+
if s.respond_to? :specification_version then
|
43
|
+
s.specification_version = 4
|
44
|
+
|
45
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
46
|
+
s.add_runtime_dependency(%q<log4r>, ["> 1.1", "~> 1.1.9"])
|
47
|
+
s.add_runtime_dependency(%q<sequel>, [">= 4.6.0", "~> 4.6"])
|
48
|
+
s.add_runtime_dependency(%q<hoe>, [">= 3.15.1", "~> 3.15"])
|
49
|
+
s.add_development_dependency(%q<jeweler>, [">= 2.0.0", "~> 2.0"])
|
50
|
+
s.add_development_dependency(%q<test-unit>, [">= 2.0.0", "~> 2.0"])
|
51
|
+
s.add_development_dependency(%q<rack>, ["= 1.6.4"])
|
52
|
+
else
|
53
|
+
s.add_dependency(%q<log4r>, ["> 1.1", "~> 1.1.9"])
|
54
|
+
s.add_dependency(%q<sequel>, [">= 4.6.0", "~> 4.6"])
|
55
|
+
s.add_dependency(%q<hoe>, [">= 3.15.1", "~> 3.15"])
|
56
|
+
s.add_dependency(%q<jeweler>, [">= 2.0.0", "~> 2.0"])
|
57
|
+
s.add_dependency(%q<test-unit>, [">= 2.0.0", "~> 2.0"])
|
58
|
+
s.add_dependency(%q<rack>, ["= 1.6.4"])
|
59
|
+
end
|
60
|
+
else
|
61
|
+
s.add_dependency(%q<log4r>, ["> 1.1", "~> 1.1.9"])
|
62
|
+
s.add_dependency(%q<sequel>, [">= 4.6.0", "~> 4.6"])
|
63
|
+
s.add_dependency(%q<hoe>, [">= 3.15.1", "~> 3.15"])
|
64
|
+
s.add_dependency(%q<jeweler>, [">= 2.0.0", "~> 2.0"])
|
65
|
+
s.add_dependency(%q<test-unit>, [">= 2.0.0", "~> 2.0"])
|
66
|
+
s.add_dependency(%q<rack>, ["= 1.6.4"])
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
File without changes
|
@@ -1,12 +1,12 @@
|
|
1
|
-
$LOAD_PATH << sprintf('%s
|
2
|
-
require 'log4r/outputter/sequeloutputter'
|
1
|
+
$LOAD_PATH << sprintf('%s/../', File.dirname(__FILE__))
|
3
2
|
|
4
|
-
require '
|
3
|
+
require 'helper'
|
5
4
|
|
6
5
|
class TestPostgres < Test::Unit::TestCase
|
7
6
|
|
8
7
|
def setup
|
9
|
-
|
8
|
+
# TODO move this to a helper class - or a function that returns one based on .. criteria
|
9
|
+
@good_config = sprintf('%s/../config/log4r-postgres.yaml', File.expand_path(File.dirname(__FILE__)))
|
10
10
|
@table = Time.now.strftime('logs-%Y/%m/%d-%H:%M').to_sym
|
11
11
|
|
12
12
|
begin
|
@@ -44,10 +44,6 @@ class TestPostgres < Test::Unit::TestCase
|
|
44
44
|
|
45
45
|
end
|
46
46
|
|
47
|
-
def test_sad_yaml
|
48
|
-
# TODO pass in bad configs as hashes
|
49
|
-
end
|
50
|
-
|
51
47
|
def test_happy_hash
|
52
48
|
logger = nil
|
53
49
|
|
@@ -1,12 +1,12 @@
|
|
1
|
-
$LOAD_PATH << sprintf('%s
|
2
|
-
|
1
|
+
$LOAD_PATH << sprintf('%s/../', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
require 'helper'
|
3
4
|
|
4
|
-
require 'test/unit'
|
5
5
|
|
6
6
|
class TestSqlite < Test::Unit::TestCase
|
7
7
|
|
8
8
|
def setup
|
9
|
-
@good_config = sprintf('%s/../log4r-
|
9
|
+
@good_config = sprintf('%s/../config/log4r-sqlite.yaml', File.expand_path(File.dirname(__FILE__)))
|
10
10
|
@table = :logs
|
11
11
|
|
12
12
|
begin
|
@@ -20,7 +20,6 @@ class TestSqlite < Test::Unit::TestCase
|
|
20
20
|
# TODO remove the database.. assume it's just '*.sqlite' in this path?
|
21
21
|
end
|
22
22
|
|
23
|
-
|
24
23
|
def test_happy_yaml
|
25
24
|
file = @good_config
|
26
25
|
Log4r::YamlConfigurator.load_yaml_file(file)
|
@@ -46,10 +45,6 @@ class TestSqlite < Test::Unit::TestCase
|
|
46
45
|
|
47
46
|
end
|
48
47
|
|
49
|
-
def test_sad_yaml
|
50
|
-
# TODO pass in bad configs as hashes
|
51
|
-
end
|
52
|
-
|
53
48
|
def test_happy_hash
|
54
49
|
logger = nil
|
55
50
|
|
data/test/helper.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
## helper.rb sets up pathing and common requires for tests
|
3
|
+
|
4
|
+
$LOAD_PATH << sprintf('%s/../lib', File.dirname(__FILE__))
|
5
|
+
require 'log4r/outputter/sequeloutputter'
|
6
|
+
|
7
|
+
require 'test/unit'
|
8
|
+
|
9
|
+
class Log4r::Logger
|
10
|
+
|
11
|
+
# no parameters, returns the first SequelOutputter object
|
12
|
+
def get_outputter
|
13
|
+
self.outputters.each do |op|
|
14
|
+
next unless op.is_a?(SequelOutputter)
|
15
|
+
return op
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
$LOAD_PATH << sprintf('%s/../', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
require 'helper'
|
4
|
+
|
5
|
+
class TestPostgresUnit < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
# TODO should this be a constant?
|
9
|
+
@good_config = File.expand_path(sprintf('%s/../config/log4r-postgres.yaml', File.dirname(__FILE__)))
|
10
|
+
@good_loggername = :test.to_s
|
11
|
+
@table = :logs
|
12
|
+
|
13
|
+
begin
|
14
|
+
require 'sqlite3'
|
15
|
+
rescue LoadError
|
16
|
+
omit('[sqlite3] not installed/configured') # TODO this really needs to omit the entire test
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def teardown
|
21
|
+
# TODO decide what we're doing here
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_happy_yaml
|
25
|
+
file = @good_config
|
26
|
+
Log4r::YamlConfigurator.load_yaml_file(file)
|
27
|
+
|
28
|
+
logger = nil
|
29
|
+
|
30
|
+
assert_nothing_raised do
|
31
|
+
logger = Log4r::Logger.get(@good_loggername)
|
32
|
+
end
|
33
|
+
|
34
|
+
assert_not_nil(logger)
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_sad_yaml
|
38
|
+
good_yaml = YAML.load_file(@good_config)
|
39
|
+
sad_yamls = Hash.new
|
40
|
+
|
41
|
+
# delete vital keys here and create an array of sad yamls, but cheating a little to find our config
|
42
|
+
fail(sprintf('invalid input to generate sad yaml[%s]', good_yaml)) unless good_yaml.has_key?('log4r_config') and
|
43
|
+
good_yaml['log4r_config'].has_key?('outputters') and
|
44
|
+
good_yaml['log4r_config']['outputters'].last['type'].eql?('SequelOutputter')
|
45
|
+
|
46
|
+
{
|
47
|
+
:formatter.to_s => Hash.new.class,
|
48
|
+
:map.to_s => Hash.new.class,
|
49
|
+
|
50
|
+
:delimiter.to_s => String.new.class,
|
51
|
+
:engine.to_s => String.new.class,
|
52
|
+
:table.to_s => String.new.class,
|
53
|
+
}.each_pair do |key, _klass|
|
54
|
+
candidate = Marshal.load(Marshal.dump(good_yaml))
|
55
|
+
candidate['log4r_config']['outputters'].last.delete(key)
|
56
|
+
sad_yamls[key] = candidate
|
57
|
+
end
|
58
|
+
|
59
|
+
sad_yamls.each_pair do |name, config|
|
60
|
+
|
61
|
+
logger = nil
|
62
|
+
|
63
|
+
e = assert_raises Log4r::ConfigError do
|
64
|
+
Log4r::YamlConfigurator.load_yaml_string(config.to_yaml) # it's valid YAML, just missing required options
|
65
|
+
logger = Log4r::Logger.get(@good_loggername)
|
66
|
+
end
|
67
|
+
|
68
|
+
assert_match(Regexp.new(sprintf('[%s]', name)), e.message)
|
69
|
+
assert_nil(logger)
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_happy_hash
|
76
|
+
logger = Log4r::Logger.new(@good_loggername)
|
77
|
+
|
78
|
+
table = 'logs-%Y/%m/%d-%H:%M'
|
79
|
+
fmt_table = Time.now.strftime(table)
|
80
|
+
|
81
|
+
hash = {
|
82
|
+
:type => 'SequelOutputter',
|
83
|
+
:name => 'sequel',
|
84
|
+
:formatter => Log4r::Formatter.new({
|
85
|
+
:type => 'PatternFormatter',
|
86
|
+
:date_pattern => '%Y/%m/%d %H:%M.%s',
|
87
|
+
:pattern => '%d!@#$%C!@#$%l!@#$%m',
|
88
|
+
}),
|
89
|
+
|
90
|
+
:engine => 'postgres',
|
91
|
+
:server => 'localhost',
|
92
|
+
:port => 5432,
|
93
|
+
:database => 'logs',
|
94
|
+
:table => table,
|
95
|
+
:username => 'postgres',
|
96
|
+
:password => 'postgres',
|
97
|
+
|
98
|
+
:delimiter => '!@#$',
|
99
|
+
:map => {
|
100
|
+
0 => 'date',
|
101
|
+
1 => 'level',
|
102
|
+
2 => 'class',
|
103
|
+
3 => 'message',
|
104
|
+
},
|
105
|
+
}
|
106
|
+
|
107
|
+
assert_nothing_raised do
|
108
|
+
outputter = Log4r::Outputter::SequelOutputter.new(
|
109
|
+
'sequel',
|
110
|
+
hash,
|
111
|
+
)
|
112
|
+
logger.add(outputter)
|
113
|
+
end
|
114
|
+
|
115
|
+
assert_not_equal(hash[:file], logger.get_outputter.file)
|
116
|
+
assert_not_equal(hash[:table], logger.get_outputter.table)
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
$LOAD_PATH << sprintf('%s/../', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
require 'helper'
|
4
|
+
|
5
|
+
class TestSqliteUnit < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
# TODO should this be a constant?
|
9
|
+
@good_config = File.expand_path(sprintf('%s/../config/log4r-sqlite.yaml', File.dirname(__FILE__)))
|
10
|
+
@good_loggername = :test.to_s
|
11
|
+
@table = :logs
|
12
|
+
|
13
|
+
begin
|
14
|
+
require 'sqlite3'
|
15
|
+
rescue LoadError
|
16
|
+
omit('[sqlite3] not installed/configured') # TODO this really needs to omit the entire test
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def teardown
|
21
|
+
# TODO remove the database.. assume it's just '*.sqlite' in this path?
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_happy_yaml
|
25
|
+
file = @good_config
|
26
|
+
Log4r::YamlConfigurator.load_yaml_file(file)
|
27
|
+
|
28
|
+
logger = nil
|
29
|
+
|
30
|
+
assert_nothing_raised do
|
31
|
+
logger = Log4r::Logger.get(@good_loggername)
|
32
|
+
end
|
33
|
+
|
34
|
+
assert_not_nil(logger)
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_sad_yaml
|
38
|
+
good_yaml = YAML.load_file(@good_config)
|
39
|
+
sad_yamls = Hash.new
|
40
|
+
|
41
|
+
# delete vital keys here and create an array of sad yamls, but cheating a little to find our config
|
42
|
+
fail(sprintf('invalid input to generate sad yaml[%s]', good_yaml)) unless good_yaml.has_key?('log4r_config') and
|
43
|
+
good_yaml['log4r_config'].has_key?('outputters') and
|
44
|
+
good_yaml['log4r_config']['outputters'].last['type'].eql?('SequelOutputter')
|
45
|
+
|
46
|
+
{
|
47
|
+
:formatter.to_s => Hash.new.class,
|
48
|
+
:map.to_s => Hash.new.class,
|
49
|
+
|
50
|
+
:delimiter.to_s => String.new.class,
|
51
|
+
:engine.to_s => String.new.class,
|
52
|
+
:table.to_s => String.new.class,
|
53
|
+
}.each_pair do |key, _klass|
|
54
|
+
candidate = Marshal.load(Marshal.dump(good_yaml))
|
55
|
+
candidate['log4r_config']['outputters'].last.delete(key)
|
56
|
+
sad_yamls[key] = candidate
|
57
|
+
end
|
58
|
+
|
59
|
+
sad_yamls.each_pair do |name, config|
|
60
|
+
|
61
|
+
logger = nil
|
62
|
+
|
63
|
+
e = assert_raises Log4r::ConfigError do
|
64
|
+
Log4r::YamlConfigurator.load_yaml_string(config.to_yaml) # it's valid YAML, just missing required options
|
65
|
+
logger = Log4r::Logger.get(@good_loggername)
|
66
|
+
end
|
67
|
+
|
68
|
+
assert_match(Regexp.new(sprintf('[%s]', name)), e.message)
|
69
|
+
assert_nil(logger)
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_happy_hash
|
76
|
+
logger = Log4r::Logger.new(@good_loggername)
|
77
|
+
|
78
|
+
hash = {
|
79
|
+
:type => 'SequelOutputter',
|
80
|
+
:name => 'sequel',
|
81
|
+
:formatter => Log4r::Formatter.new({
|
82
|
+
:type => 'PatternFormatter',
|
83
|
+
:date_pattern => '%Y/%m/%d %H:%M.%s',
|
84
|
+
:pattern => '%d!@#$%C!@#$%l!@#$%m',
|
85
|
+
}),
|
86
|
+
|
87
|
+
:engine => 'sqlite',
|
88
|
+
:file => 'log-%y-%m-%d-%H-%M.sqlite',
|
89
|
+
:table => 'logs_%y-%m-%d', # use the non-strftimed format here
|
90
|
+
:delimiter => '!@#$',
|
91
|
+
:map => {
|
92
|
+
0 => 'date',
|
93
|
+
1 => 'level',
|
94
|
+
2 => 'class',
|
95
|
+
3 => 'message',
|
96
|
+
},
|
97
|
+
}
|
98
|
+
|
99
|
+
assert_nothing_raised do
|
100
|
+
outputter = Log4r::Outputter::SequelOutputter.new(
|
101
|
+
'sequel',
|
102
|
+
hash,
|
103
|
+
)
|
104
|
+
logger.add(outputter)
|
105
|
+
end
|
106
|
+
|
107
|
+
assert_not_equal(hash[:file], logger.get_outputter.file)
|
108
|
+
assert_not_equal(hash[:table], logger.get_outputter.table)
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: log4r-sequel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Conor Horan-Kates
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: log4r
|
@@ -30,20 +30,6 @@ dependencies:
|
|
30
30
|
- - ~>
|
31
31
|
- !ruby/object:Gem::Version
|
32
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
33
|
- !ruby/object:Gem::Dependency
|
48
34
|
name: sequel
|
49
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -124,6 +110,20 @@ dependencies:
|
|
124
110
|
- - ~>
|
125
111
|
- !ruby/object:Gem::Version
|
126
112
|
version: '2.0'
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: rack
|
115
|
+
requirement: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - '='
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: 1.6.4
|
120
|
+
type: :development
|
121
|
+
prerelease: false
|
122
|
+
version_requirements: !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
124
|
+
- - '='
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: 1.6.4
|
127
127
|
description: Log4r::Outputter that writes to a Sequel database
|
128
128
|
email:
|
129
129
|
- conor.code@gmail.com
|
@@ -138,15 +138,15 @@ files:
|
|
138
138
|
- README.md
|
139
139
|
- Rakefile
|
140
140
|
- VERSION
|
141
|
-
- example/log2postgres.rb
|
142
|
-
- example/log2sqlite.rb
|
143
|
-
- example/log4r-postgres.yaml
|
144
|
-
- example/log4r-sqlite.yaml
|
145
141
|
- lib/log4r/outputter/sequeloutputter.rb
|
142
|
+
- log4r-sequel.gemspec
|
143
|
+
- test/config/log4r-postgres.yaml
|
144
|
+
- test/config/log4r-sqlite.yaml
|
146
145
|
- test/functional/test_postgres.rb
|
147
146
|
- test/functional/test_sqlite.rb
|
148
|
-
- test/
|
149
|
-
- test/
|
147
|
+
- test/helper.rb
|
148
|
+
- test/unit/test_postgres.rb
|
149
|
+
- test/unit/test_sqlite.rb
|
150
150
|
homepage: http://github.com/chorankates/log4r-sequel
|
151
151
|
licenses:
|
152
152
|
- MIT
|
data/example/log2postgres.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
$LOAD_PATH << sprintf('%s/../lib', File.dirname(__FILE__))
|
2
|
-
require 'log4r/outputter/sequeloutputter'
|
3
|
-
|
4
|
-
require 'pg'
|
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
|
data/example/log2sqlite.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
$LOAD_PATH << sprintf('%s/../lib', File.dirname(__FILE__))
|
2
|
-
require 'log4r/outputter/sequeloutputter'
|
3
|
-
|
4
|
-
require 'sqlite3'
|
5
|
-
|
6
|
-
## instantiate a logger following the log4r pattern
|
7
|
-
file = sprintf('%s/log4r-sqlite.yaml', File.dirname(__FILE__))
|
8
|
-
Log4r::YamlConfigurator.load_yaml_file(file)
|
9
|
-
|
10
|
-
logger = Log4r::Logger.get('foo')
|
11
|
-
|
12
|
-
[logger].each do |l|
|
13
|
-
## log some garbage
|
14
|
-
l.debug('this is a debug message')
|
15
|
-
l.info('this is an info message')
|
16
|
-
l.warn('this is a warning')
|
17
|
-
l.error('this is an error')
|
18
|
-
l.fatal('this is a fatal')
|
19
|
-
end
|
data/example/log4r-postgres.yaml
DELETED
@@ -1,53 +0,0 @@
|
|
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-%Y/%m/%d-%H:%M.%s
|
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
|
data/example/log4r-sqlite.yaml
DELETED
@@ -1,46 +0,0 @@
|
|
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-%Y-%m-%d-%H-%M-%s.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
|