cbdr-logfmtr 0.0.4

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: 810661cfa6c9c009628813acaa174a03f4703f65
4
+ data.tar.gz: 5db2ee395510cf26527155ad24c9817d60eeb06f
5
+ SHA512:
6
+ metadata.gz: d274de19da8f342d182618953c105d6cc63d6d5caaa81b433e0b048b27323affc81105a498668501094460578ab336d3b446b3b0e808ed335692cfc6e6a2f013
7
+ data.tar.gz: 3cf75ae94f4d34a0c9783eb7b82a3e2dd12b7573a7ddd2a1cadfc58778a5bfea41cd250c2a641fdeacc8220995343dba65ce27ba11f1a49658ce9487b438c703
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ pkg/
2
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'bundler'
4
+
5
+ gemspec
data/README.md ADDED
@@ -0,0 +1,67 @@
1
+ # logfmtr
2
+ The default ruby logger (`require 'logger'`) outputs in this format:
3
+ ```
4
+ I, [2015-07-01T11:47:45.157173 #29367] INFO -- : some message here (StandardError)
5
+ ```
6
+ This provides a replacement for the default Logger::Formatter class, and it formats logs in key=value format.
7
+
8
+ Logs a hash as:
9
+ ```
10
+ { one: 1, two: 2 } => one=1 two=2
11
+ ```
12
+ Everything else as:
13
+ ```
14
+ => msg="your message here"
15
+ ```
16
+ ## Usage
17
+ ### Example logging error
18
+ Errors have their own `.to_s` implementation.
19
+ ```ruby
20
+ require 'logger'
21
+ require 'cbdr-logfmtr'
22
+
23
+ logger = Logger.new($stdout)
24
+ logger.formatter = Logfmtr::LogfmtLogger.new
25
+
26
+ begin
27
+ raise StandardError.new('some output')
28
+ rescue => e
29
+ logger.error e
30
+ end
31
+
32
+ # output
33
+ # level=ERROR datetime="2015-07-01 08:29:52" -0500 progname= msg="some output"
34
+ ```
35
+ ### Example logging error with a custom datetime format
36
+ ```ruby
37
+ require 'logger'
38
+ require 'cbdr-logfmtr'
39
+
40
+ logger = Logger.new($stdout)
41
+ logger.formatter = Logfmtr::LogfmtLogger.new("%Y-%m-%d %H:%M %Z")
42
+
43
+ begin
44
+ raise StandardError.new('some output')
45
+ rescue => e
46
+ logger.error e
47
+ end
48
+
49
+ # output
50
+ # level=ERROR datetime="2015-07-01 08:29 CDT" progname= msg="some output"
51
+ ```
52
+ ### Example logging hash
53
+ It pulls out hash values into their own key=value pairs in logfmt.
54
+ ```ruby
55
+ require 'logger'
56
+ require 'cbdr-logfmtr'
57
+
58
+ logger = Logger.new($stdout)
59
+ logger.formatter = Logfmtr::LogfmtLogger.new
60
+
61
+ logger.info({ one: 1, two: 2 })
62
+
63
+ # output
64
+ # level=INFO datetime="2015-07-01 08:29 CDT" progname= one=1 two=2
65
+ ```
66
+ ### Note about datetime_format
67
+ The default datetime_format in Logger::Formatter appears to be `"%Y-%m-%d %H:%M:%S %z"`. When you set your `logger.datetime_format=`, it does not get used by the formatter class. Logger::Formatter appears to have its own default. This gem makes that explicit.
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new
5
+
6
+ task :default => :spec
7
+ task :test => :spec
@@ -0,0 +1 @@
1
+ require 'logfmtr/base'
@@ -0,0 +1,47 @@
1
+ module Logfmtr
2
+ class LogfmtLogger
3
+ def initialize(datetime_format=nil)
4
+ @datetime_format = datetime_format || "%Y-%m-%d %H:%M:%S %z"
5
+ end
6
+
7
+ def call(severity, datetime, progname, msg)
8
+ if msg.is_a? Hash
9
+ msg_str = logfmtify_hash(msg)
10
+ else
11
+ msg = add_quotes(escape_newlines(msg))
12
+ msg_str = %Q[msg=#{msg}]
13
+ end
14
+
15
+ %Q[level=#{severity} datetime="#{datetime.strftime(@datetime_format)}" progname=#{progname} #{msg_str}\n]
16
+ end
17
+
18
+ private
19
+
20
+ def logfmtify_hash(message)
21
+ message.collect do |key, value|
22
+ value = add_quotes(escape_newlines(value))
23
+ %Q[#{key}=#{value}]
24
+ end.join(' ')
25
+ end
26
+
27
+ def add_quotes(message)
28
+ if needs_quotes(message)
29
+ %Q["#{message}"]
30
+ else
31
+ %Q[#{message}]
32
+ end
33
+ end
34
+
35
+ def needs_quotes(message)
36
+ if message.to_s =~ /[^a-zA-Z0-9\-\.]/
37
+ true
38
+ else
39
+ false
40
+ end
41
+ end
42
+
43
+ def escape_newlines(message)
44
+ message.to_s.gsub(/\n/, "\\n")
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,3 @@
1
+ module Logfmtr
2
+ VERSION = "0.0.4"
3
+ end
data/logfmtr.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $LOAD_PATH << File.expand_path("../lib", __FILE__)
3
+ require "logfmtr/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "cbdr-logfmtr"
7
+ s.version = Logfmtr::VERSION
8
+ s.licenses = ['WTFPL']
9
+ s.platform = Gem::Platform::RUBY
10
+ s.date = %q{2015-09-25}
11
+ s.authors = ['Archana Sriram', 'Steven Thomas']
12
+ s.email = 'creativehandle@gmail.com'
13
+ s.homepage = "https://github.com/cbdr/logfmtr"
14
+ s.summary = %q{a replacement for Logger::Formatter}
15
+ s.description = %q{for formatting logs in logfmt}
16
+
17
+ s.add_dependency "rake", "~> 10.4"
18
+ s.add_development_dependency "rspec", "~> 3.3"
19
+ s.add_development_dependency 'logfmt', '~> 0.0.7'
20
+
21
+ s.files = `git ls-files`.split("\n")
22
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
23
+ s.require_paths = ['lib']
24
+ end
@@ -0,0 +1,95 @@
1
+ require 'spec_helper'
2
+ require 'logger'
3
+ require 'logfmt'
4
+ require 'stringio'
5
+
6
+ describe Logfmtr::LogfmtLogger do
7
+ it "exists" do
8
+ logfmtr = Logfmtr::LogfmtLogger.new
9
+ expect(logfmtr).to be
10
+ end
11
+
12
+ it "logs using default datetime format" do
13
+ dt_format = default_datetime_format
14
+ expect { log_error(nil) }.to output(%Q[level=ERROR datetime="#{Time.now.strftime(dt_format)}" progname= msg="some output"\n]).to_stdout
15
+ end
16
+
17
+ it "logs using custom datetime format" do
18
+ dt_format = custom_datetime_format
19
+ expect { log_error(dt_format) }.to output(%Q[level=ERROR datetime="#{Time.now.strftime(dt_format)}" progname= msg="some output"\n]).to_stdout
20
+ end
21
+
22
+ it "logs hashes basically" do
23
+ dt_format = default_datetime_format
24
+ expect { log_hash(dt_format) }.to output(%Q[level=INFO datetime="#{Time.now.strftime(dt_format)}" progname= one=1 two=2 three="!@#$$%^&*}"\n]).to_stdout
25
+ end
26
+
27
+ it "logs hashes in logfmt format" do
28
+ dt_format = default_datetime_format
29
+
30
+ output = log_to_buffer do |logger|
31
+ logger.formatter = Logfmtr::LogfmtLogger.new(dt_format)
32
+ logHash = { :foo => "bar", :baz => "hello world" }
33
+ logger.info logHash
34
+ end
35
+
36
+ expectedHash = {"level" => "INFO", "foo" => "bar", "baz" => "hello world"}
37
+ actualHash = Logfmt.parse output
38
+ expect(actualHash).to include(expectedHash)
39
+ end
40
+
41
+ it "puts quotes around values that need them" do
42
+ dt_format = default_datetime_format
43
+ expect { log_quotes_needed(dt_format) }.to output(%Q[level=INFO datetime="#{Time.now.strftime(dt_format)}" progname= msg="Testing some /stuff"\n]).to_stdout
44
+ end
45
+
46
+ it "escapes new lines in values" do
47
+ dt_format = default_datetime_format
48
+ expect { escape_newlines_needed(dt_format) }.to output(%Q[level=INFO datetime="#{Time.now.strftime(dt_format)}" progname= msg="Testing some\\nstuff"\n]).to_stdout
49
+ end
50
+ end
51
+
52
+ def custom_datetime_format
53
+ "%Y-%m-%d %H:%M %z"
54
+ end
55
+
56
+ def default_datetime_format
57
+ "%Y-%m-%d %H:%M:%S %z"
58
+ end
59
+
60
+ def log_to_buffer
61
+ buffer = StringIO.new
62
+ logger = Logger.new buffer
63
+ yield logger
64
+ buffer.string
65
+ end
66
+
67
+ def log_error(datetime_format)
68
+ begin
69
+ logger = logger_init(datetime_format)
70
+ raise StandardError.new('some output')
71
+ rescue => e
72
+ logger.error e
73
+ end
74
+ end
75
+
76
+ def log_hash(datetime_format)
77
+ logger = logger_init(datetime_format)
78
+ logger.info ({ one: 1, two: 2, three: "!@#$$%^&*}" })
79
+ end
80
+
81
+ def log_quotes_needed(datetime_format)
82
+ logger = logger_init(datetime_format)
83
+ logger.info ("Testing some /stuff")
84
+ end
85
+
86
+ def escape_newlines_needed(datetime_format)
87
+ logger = logger_init(datetime_format)
88
+ logger.info ("Testing some\nstuff")
89
+ end
90
+
91
+ def logger_init(datetime_format)
92
+ logger = Logger.new($stdout)
93
+ logger.formatter = Logfmtr::LogfmtLogger.new(datetime_format)
94
+ logger
95
+ end
@@ -0,0 +1 @@
1
+ require 'cbdr-logfmtr'
metadata ADDED
@@ -0,0 +1,98 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cbdr-logfmtr
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.4
5
+ platform: ruby
6
+ authors:
7
+ - Archana Sriram
8
+ - Steven Thomas
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2015-09-25 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '10.4'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '10.4'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rspec
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '3.3'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '3.3'
42
+ - !ruby/object:Gem::Dependency
43
+ name: logfmt
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: 0.0.7
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: 0.0.7
56
+ description: for formatting logs in logfmt
57
+ email: creativehandle@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - Gemfile
64
+ - README.md
65
+ - Rakefile
66
+ - lib/cbdr-logfmtr.rb
67
+ - lib/logfmtr/base.rb
68
+ - lib/logfmtr/version.rb
69
+ - logfmtr.gemspec
70
+ - spec/lib/logfmtr_spec.rb
71
+ - spec/spec_helper.rb
72
+ homepage: https://github.com/cbdr/logfmtr
73
+ licenses:
74
+ - WTFPL
75
+ metadata: {}
76
+ post_install_message:
77
+ rdoc_options: []
78
+ require_paths:
79
+ - lib
80
+ required_ruby_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ requirements: []
91
+ rubyforge_project:
92
+ rubygems_version: 2.4.6
93
+ signing_key:
94
+ specification_version: 4
95
+ summary: a replacement for Logger::Formatter
96
+ test_files:
97
+ - spec/lib/logfmtr_spec.rb
98
+ - spec/spec_helper.rb