logfmtr 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 +7 -0
- data/.gitignore +2 -0
- data/Gemfile +5 -0
- data/README.md +67 -0
- data/Rakefile +7 -0
- data/lib/logfmtr.rb +1 -0
- data/lib/logfmtr/base.rb +41 -0
- data/lib/logfmtr/version.rb +3 -0
- data/logfmtr.gemspec +24 -0
- data/spec/lib/logfmtr_spec.rb +79 -0
- data/spec/spec_helper.rb +1 -0
- metadata +97 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 146cc26f000667e7b9b0e2f1bea127c978cb1779
|
4
|
+
data.tar.gz: e33b40c56b32aa4e8f2eda70a2739678e51e5337
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 75fd326021bec88056e151f8060d483abe0b2c02d606105dde69ffbca783c0b5639e6ca1861b3eeab3d5255c3f7f58a9cc61b01e227f5473b003e59cf16a7b60
|
7
|
+
data.tar.gz: f2a43274958e767f8b3dee197bfca8b19efc3f776c286be8c801cf352b7f55a403dc5cec166155d64b75d828a8ccf676bad7dd5f9165f1017c1f0d91323f263e
|
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 '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 '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 '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/logfmtr.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'logfmtr/base'
|
data/lib/logfmtr/base.rb
ADDED
@@ -0,0 +1,41 @@
|
|
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_str = %Q[msg=#{add_quotes(msg)}]
|
12
|
+
end
|
13
|
+
|
14
|
+
%Q[level=#{severity} datetime="#{datetime.strftime(@datetime_format)}" progname=#{progname} #{msg_str}\n]
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def logfmtify_hash(message)
|
20
|
+
message.collect do |key, value|
|
21
|
+
%Q[#{key}=#{add_quotes(value)}]
|
22
|
+
end.join(' ')
|
23
|
+
end
|
24
|
+
|
25
|
+
def add_quotes(message)
|
26
|
+
if needs_quotes(message)
|
27
|
+
%Q["#{message}"]
|
28
|
+
else
|
29
|
+
%Q[#{message}]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def needs_quotes(message)
|
34
|
+
if message.to_s =~ /[^a-zA-Z0-9\-\.]/
|
35
|
+
true
|
36
|
+
else
|
37
|
+
false
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
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 = "logfmtr"
|
7
|
+
s.version = Logfmtr::VERSION
|
8
|
+
s.licenses = ['WTFPL']
|
9
|
+
s.platform = Gem::Platform::RUBY
|
10
|
+
s.date = %q{2015-06-30}
|
11
|
+
s.authors = ['Archana Sriram']
|
12
|
+
s.email = 'creativehandle@gmail.com'
|
13
|
+
s.homepage = "https://github.com/arachnid-cb/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,79 @@
|
|
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
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def custom_datetime_format
|
47
|
+
"%Y-%m-%d %H:%M %z"
|
48
|
+
end
|
49
|
+
|
50
|
+
def default_datetime_format
|
51
|
+
"%Y-%m-%d %H:%M:%S %z"
|
52
|
+
end
|
53
|
+
|
54
|
+
def log_to_buffer
|
55
|
+
buffer = StringIO.new
|
56
|
+
logger = Logger.new buffer
|
57
|
+
yield logger
|
58
|
+
buffer.string
|
59
|
+
end
|
60
|
+
|
61
|
+
def log_error(datetime_format)
|
62
|
+
begin
|
63
|
+
logger = logger_init(datetime_format)
|
64
|
+
raise StandardError.new('some output')
|
65
|
+
rescue => e
|
66
|
+
logger.error e
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def log_hash(datetime_format)
|
71
|
+
logger = logger_init(datetime_format)
|
72
|
+
logger.info ({ one: 1, two: 2, three: "!@#$$%^&*}" })
|
73
|
+
end
|
74
|
+
|
75
|
+
def logger_init(datetime_format)
|
76
|
+
logger = Logger.new($stdout)
|
77
|
+
logger.formatter = Logfmtr::LogfmtLogger.new(datetime_format)
|
78
|
+
logger
|
79
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'logfmtr'
|
metadata
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: logfmtr
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Archana Sriram
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-06-30 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '10.4'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '10.4'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.3'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.3'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: logfmt
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.0.7
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.0.7
|
55
|
+
description: for formatting logs in logfmt
|
56
|
+
email: creativehandle@gmail.com
|
57
|
+
executables: []
|
58
|
+
extensions: []
|
59
|
+
extra_rdoc_files: []
|
60
|
+
files:
|
61
|
+
- ".gitignore"
|
62
|
+
- Gemfile
|
63
|
+
- README.md
|
64
|
+
- Rakefile
|
65
|
+
- lib/logfmtr.rb
|
66
|
+
- lib/logfmtr/base.rb
|
67
|
+
- lib/logfmtr/version.rb
|
68
|
+
- logfmtr.gemspec
|
69
|
+
- spec/lib/logfmtr_spec.rb
|
70
|
+
- spec/spec_helper.rb
|
71
|
+
homepage: https://github.com/arachnid-cb/logfmtr
|
72
|
+
licenses:
|
73
|
+
- WTFPL
|
74
|
+
metadata: {}
|
75
|
+
post_install_message:
|
76
|
+
rdoc_options: []
|
77
|
+
require_paths:
|
78
|
+
- lib
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
requirements: []
|
90
|
+
rubyforge_project:
|
91
|
+
rubygems_version: 2.4.6
|
92
|
+
signing_key:
|
93
|
+
specification_version: 4
|
94
|
+
summary: a replacement for Logger::Formatter
|
95
|
+
test_files:
|
96
|
+
- spec/lib/logfmtr_spec.rb
|
97
|
+
- spec/spec_helper.rb
|