cbdr-logfmtr 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +2 -0
- data/Gemfile +5 -0
- data/README.md +67 -0
- data/Rakefile +7 -0
- data/lib/cbdr-logfmtr.rb +1 -0
- data/lib/logfmtr/base.rb +47 -0
- data/lib/logfmtr/version.rb +3 -0
- data/logfmtr.gemspec +24 -0
- data/spec/lib/logfmtr_spec.rb +95 -0
- data/spec/spec_helper.rb +1 -0
- metadata +98 -0
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
data/Gemfile
ADDED
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
data/lib/cbdr-logfmtr.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'logfmtr/base'
|
data/lib/logfmtr/base.rb
ADDED
@@ -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
|
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
|
data/spec/spec_helper.rb
ADDED
@@ -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
|