logfmtr 0.0.3
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/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
|