log4r-sequel 0.0.1 → 0.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 22db2c5c31f8fbb61fac792ab52976a26e6e0984
4
- data.tar.gz: 2ea605f5b25ebc37a19c912403e6e502ca7751a4
3
+ metadata.gz: 4e2df9143f88d2565644c34dd200a0c66a4d49f5
4
+ data.tar.gz: c76ec6079a80db159faac195d8890e8757794e25
5
5
  SHA512:
6
- metadata.gz: eb146d274d9e4bddeb666218f54edb4bda8d26fd95d5b36479c05f42727fb70ea7ce341d1a293b8d089723eb101e897d094dea0fd3720c54933a63ae9cc5f053
7
- data.tar.gz: a791ae9d859a3854a88b38f174e8774d2ec53f577c5aa3d291fb4022a1a87c03d2f69053f76101ba8bc8be3a01c3bc0e2cde389819df095507cbe9dd9989f836
6
+ metadata.gz: 6fbd50621319256bad2e8c8ca51a88e3df425c02da1abdcdfb525f0fa98474b0743aafa60427a081c4f43d503e4ad02b51abc63f27105c0cfa0655866acd3551
7
+ data.tar.gz: bc46f2fd5e8ef4a268f6ff5151e8f70ca21f03656ec7c720a51d556757ab2a1c8e2298661f669bc72772e66999c8c3f58116f1aa0bf051a1e0bc7cba98f1ba30
data/.travis.yml CHANGED
@@ -9,5 +9,11 @@ rvm:
9
9
  notifications:
10
10
  email: false
11
11
 
12
+ services:
13
+ - postgresql
14
+
15
+ before_script:
16
+ - psql -c 'create database logs;' -U postgres
17
+
12
18
  bundler_args: --without test --jobs 3 --retry 3
13
19
  script: bundle exec rake test
data/README.md CHANGED
@@ -1,6 +1,21 @@
1
1
  # log4r-sequel
2
2
  Log4r outputter to a Sequel database handle
3
3
 
4
+ - [usage](#usage)
5
+ - [pre-built gem installation (stable)](#pre-built-gem-installation-stable)
6
+ - [from-source installation (latest)](#from-source-installation-latest)
7
+ - [demo](#demo)
8
+ - [supported databases](#supported-databases)
9
+ - [TODO](#todo)
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:
12
+ * STDOUT / STDERR
13
+ * file
14
+ * email
15
+ * syslog
16
+
17
+ and so on, but didn't have a way to output directly to a database - enter `log4r-sequel`
18
+
4
19
  ## usage
5
20
 
6
21
  ### pre-built gem installation (stable)
@@ -33,13 +48,36 @@ irb(main):001:0> require 'log4r/outputter/sequeloutputter'
33
48
  => true
34
49
  ```
35
50
 
51
+ ### demo
52
+
53
+ ```
54
+ $ ruby example/log2postgres.rb
55
+ 2016/08/27 17:08.1472342938 | bar | DEBUG | this is a debug message
56
+ 2016/08/27 17:08.1472342938 | bar | INFO | this is an info message
57
+ 2016/08/27 17:08.1472342938 | bar | WARN | this is a warning
58
+ 2016/08/27 17:08.1472342938 | bar | ERROR | this is an error
59
+ 2016/08/27 17:08.1472342938 | bar | FATAL | this is a fatal
60
+ $ sqlite3 example/log.sqlite
61
+ SQLite version 3.8.10.2 2015-05-20 18:17:19
62
+ Enter ".help" for usage hints.
63
+ sqlite> select * from logs;
64
+ 1|2016/08/27 17:10.1472343022|foo|DEBUG|this is a debug message
65
+ 2|2016/08/27 17:10.1472343022|foo|INFO|this is an info message
66
+ 3|2016/08/27 17:10.1472343022|foo|WARN|this is a warning
67
+ 4|2016/08/27 17:10.1472343022|foo|ERROR|this is an error
68
+ 5|2016/08/27 17:10.1472343022|foo|FATAL|this is a fatal
69
+ sqlite>
70
+ ```
71
+
36
72
  ## supported databases
37
73
  * sqlite3
38
74
  * Postgres
39
-
75
+
40
76
  ## TODO
41
- * allow database name to be semi-dynamically generated - via YAML config, not just by passing the hash directly
42
77
  * tests
43
78
  * unit tests
44
- * marketing
45
- * screencast / sample output in README.md
79
+
80
+
81
+ ## notes
82
+ * `:database`, `:table`, and `:file` options are passed through `Time.now.strftime(%s)`
83
+ * sqlite filenames cannot contain underscores (`the scheme sqlite does not accept registry part`)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.2
@@ -1,8 +1,8 @@
1
1
  $LOAD_PATH << sprintf('%s/../lib', File.dirname(__FILE__))
2
-
3
- #require 'log4r-sequel'
4
2
  require 'log4r/outputter/sequeloutputter'
5
3
 
4
+ require 'pg'
5
+
6
6
  file = sprintf('%s/log4r-postgres.yaml', File.dirname(__FILE__))
7
7
  Log4r::YamlConfigurator.load_yaml_file(file)
8
8
 
@@ -1,11 +1,8 @@
1
1
  $LOAD_PATH << sprintf('%s/../lib', File.dirname(__FILE__))
2
+ require 'log4r/outputter/sequeloutputter'
2
3
 
3
4
  require 'sqlite3'
4
5
 
5
- #require 'log4r-sequel'
6
- require 'log4r/outputter/sequeloutputter'
7
- require 'log4r/yamlconfigurator'
8
-
9
6
  ## instantiate a logger following the log4r pattern
10
7
  file = sprintf('%s/log4r-sqlite.yaml', File.dirname(__FILE__))
11
8
  Log4r::YamlConfigurator.load_yaml_file(file)
@@ -27,7 +27,7 @@ log4r_config:
27
27
  server: localhost
28
28
  port: 5432
29
29
  database: logs
30
- table: logs
30
+ table: logs-%Y/%m/%d-%H:%M.%s
31
31
  username: postgres
32
32
  password: postgres
33
33
  delimiter: '!@#$' # this is used to determine columns needed based on log4 configuration
@@ -24,7 +24,7 @@ log4r_config:
24
24
  pattern: '%d!@#$%C!@#$%l!@#$%m' # date|level|event/class fullname|message
25
25
  # log4r-sequel settings
26
26
  engine: sqlite
27
- file: log.sqlite
27
+ file: log-%Y-%m-%d-%H-%M-%s.sqlite
28
28
  table: logs
29
29
  delimiter: '!@#$' # this is used to determine columns needed based on log4 configuration
30
30
  map:
@@ -3,21 +3,9 @@ require 'log4r/yamlconfigurator'
3
3
  require 'sequel'
4
4
  require 'yaml'
5
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
6
  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
7
 
19
8
  # no parameters, returns the first Log4r::Outputter::Sequel object
20
- # TODO is there ever a case where there would be more than one?
21
9
  def get_outputter
22
10
  self.outputters.each do |op|
23
11
  next unless op.is_a?(SequelOutputter)
@@ -57,16 +45,21 @@ class SequelOutputter < Log4r::Outputter
57
45
  @engine = config[:engine].to_sym
58
46
 
59
47
  # error checking on table/column settings
60
- @table = config[:table].to_sym
61
- @map = config[:map]
48
+ @table = Time.now.strftime(config[:table]).to_sym
49
+ @map = config[:map]
62
50
  @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?
51
+
52
+ {
53
+ :delimiter => @delimiter,
54
+ :map => @map,
55
+ :table => @table,
56
+ }.each_pair do |key, value|
57
+ raise Log4r::ConfigError.new(sprintf('required key[%s] missing from configuration', key)) if value.nil?
65
58
  end
66
59
 
67
60
  if @engine.eql?(:postgres)
68
- @database = config[:database]
69
- @file = nil
61
+ @database = Time.now.strftime(config[:database])
62
+ @file = @table # this is technically the.. table, but maintaining interface cleanliness
70
63
  server = config[:server]
71
64
  port = config[:port]
72
65
  username = config[:username]
@@ -74,7 +67,7 @@ class SequelOutputter < Log4r::Outputter
74
67
  @dbh = Sequel.connect(sprintf('postgres://%s:%s@%s:%s/%s', username, password, server, port, @database))
75
68
  elsif @engine.eql?(:sqlite)
76
69
  @database = nil # sqlite has one DB per file
77
- @file = config[:file]
70
+ @file = Time.now.strftime(config[:file])
78
71
  @dbh = Sequel.connect(sprintf('sqlite://%s', @file))
79
72
  else
80
73
  raise Log4r::ConfigError.new(sprintf('unable to use engine[%s], allowed[%s]', @engine, KNOWN_ENGINES))
@@ -90,7 +83,7 @@ class SequelOutputter < Log4r::Outputter
90
83
 
91
84
  @dbh = dbh
92
85
 
93
- # idempotently create table/columns
86
+ # idempotently create database/table
94
87
  initialize_db
95
88
  end
96
89
 
@@ -103,9 +96,8 @@ class SequelOutputter < Log4r::Outputter
103
96
 
104
97
  def write(data)
105
98
  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
99
+ tokens = data.chomp.split(@delimiter)
100
+ hash = Hash.new
109
101
 
110
102
  tokens.each_with_index do |token, i|
111
103
  hash[@map[i].to_sym] = token
@@ -0,0 +1,63 @@
1
+ $LOAD_PATH << sprintf('%s/../../lib', File.dirname(__FILE__))
2
+ require 'log4r/outputter/sequeloutputter'
3
+
4
+ require 'test/unit'
5
+
6
+ class TestPostgres < Test::Unit::TestCase
7
+
8
+ def setup
9
+ @good_config = sprintf('%s/../log4r-postgres_test.yaml', File.expand_path(File.dirname(__FILE__)))
10
+ @table = Time.now.strftime('logs-%Y/%m/%d-%H:%M').to_sym
11
+
12
+ begin
13
+ require 'pg'
14
+ rescue LoadError
15
+ omit('[pg] not installed/configured')
16
+ end
17
+
18
+ end
19
+
20
+ def teardown; end
21
+
22
+ def test_happy_yaml
23
+ file = @good_config
24
+ Log4r::YamlConfigurator.load_yaml_file(file)
25
+
26
+ logger = nil
27
+
28
+ assert_nothing_raised do
29
+ logger = Log4r::Logger.get('test')
30
+ end
31
+
32
+ assert_not_nil(logger)
33
+ assert_equal(0, logger.get_outputter.dbh[@table].count)
34
+
35
+ assert_nothing_raised do
36
+ logger.debug('this is a debug message')
37
+ logger.info('this is an info message')
38
+ logger.warn('this is a warning')
39
+ logger.error('this is an error')
40
+ logger.fatal('this is a fatal')
41
+ end
42
+
43
+ assert_not_equal(0, logger.get_outputter.dbh[@table].count)
44
+
45
+ end
46
+
47
+ def test_sad_yaml
48
+ # TODO pass in bad configs as hashes
49
+ end
50
+
51
+ def test_happy_hash
52
+ logger = nil
53
+
54
+ assert_nothing_raised do
55
+ #logger = Logger::Log4r.new()
56
+ p 'DBGZ' if nil?
57
+ end
58
+
59
+ #assert_equal(0, logger.get_outputter.dbh[@table].count)
60
+
61
+ end
62
+
63
+ end
@@ -1,7 +1,6 @@
1
1
  $LOAD_PATH << sprintf('%s/../../lib', File.dirname(__FILE__))
2
2
  require 'log4r/outputter/sequeloutputter'
3
3
 
4
-
5
4
  require 'test/unit'
6
5
 
7
6
  class TestSqlite < Test::Unit::TestCase
@@ -9,6 +8,12 @@ class TestSqlite < Test::Unit::TestCase
9
8
  def setup
10
9
  @good_config = sprintf('%s/../log4r-sqlite_test.yaml', File.expand_path(File.dirname(__FILE__)))
11
10
  @table = :logs
11
+
12
+ begin
13
+ require 'sqlite3'
14
+ rescue LoadError
15
+ omit('[sqlite3] not installed/configured')
16
+ end
12
17
  end
13
18
 
14
19
  def teardown
@@ -41,9 +46,20 @@ class TestSqlite < Test::Unit::TestCase
41
46
 
42
47
  end
43
48
 
44
- def test_sad_config
49
+ def test_sad_yaml
45
50
  # TODO pass in bad configs as hashes
46
51
  end
47
52
 
53
+ def test_happy_hash
54
+ logger = nil
55
+
56
+ assert_nothing_raised do
57
+ #logger = Logger::Log4r.new()
58
+ end
59
+
60
+ #assert_equal(0, logger.get_outputter.dbh[@table].count)
61
+
62
+
63
+ end
48
64
 
49
65
  end
@@ -0,0 +1,42 @@
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!@#$%l!@#$%C!@#$%c!@#$%h!@#$%p!@#$%m'
25
+
26
+ # log4r-sequel settings
27
+ engine: postgres
28
+ server: localhost
29
+ port: 5432
30
+ database: logs
31
+ table: logs-%Y/%m/%d-%H:%M
32
+ username: postgres
33
+ password: postgres
34
+ delimiter: '!@#$'
35
+ map:
36
+ 0: 'date'
37
+ 1: 'level'
38
+ 2: 'class'
39
+ 3: 'relative_class'
40
+ 4: 'thread'
41
+ 5: 'pid'
42
+ 6: 'message'
@@ -21,26 +21,15 @@ log4r_config:
21
21
  formatter:
22
22
  type: PatternFormatter
23
23
  date_pattern: '%Y/%m/%d %H:%M.%s'
24
- pattern: '%d!@#$%C!@#$%l!@#$%m' # date|level|event/class fullname|message
24
+ pattern: '%d!@#$%C!@#$%l!@#$%m'
25
+
25
26
  # log4r-sequel settings
26
27
  engine: sqlite
27
- file: log.sqlite
28
+ file: log-%Y-%m-%d-%H-%M.sqlite # underscores are apparently 'invalid'
28
29
  table: logs
29
- delimiter: '!@#$' # this is used to determine columns needed based on log4 configuration
30
+ delimiter: '!@#$'
30
31
  map:
31
32
  0: 'date'
32
33
  1: 'level'
33
34
  2: 'class'
34
35
  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 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.1
4
+ version: 0.0.2
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-08-27 00:00:00.000000000 Z
11
+ date: 2016-09-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: log4r
@@ -143,7 +143,9 @@ files:
143
143
  - example/log4r-postgres.yaml
144
144
  - example/log4r-sqlite.yaml
145
145
  - lib/log4r/outputter/sequeloutputter.rb
146
+ - test/functional/test_postgres.rb
146
147
  - test/functional/test_sqlite.rb
148
+ - test/log4r-postgres_test.yaml
147
149
  - test/log4r-sqlite_test.yaml
148
150
  homepage: http://github.com/chorankates/log4r-sequel
149
151
  licenses: