logn 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.
- data/.travis.yml +3 -0
- data/README.md +13 -2
- data/bin/logn +6 -6
- data/lib/logn.rb +75 -2
- data/lib/logn/version.rb +1 -1
- data/logn.gemspec +3 -0
- metadata +54 -5
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# Logn
|
2
2
|
|
3
|
+
[](https://travis-ci.org/roqua/logn)
|
4
|
+
|
3
5
|
Why bother with complicated centralized logging servers with elastic searchers
|
4
6
|
when you have a powerful machine running idle on your desk, and you only have
|
5
7
|
a few million lines of logs anyway?
|
@@ -15,11 +17,20 @@ you want.
|
|
15
17
|
|
16
18
|
## Usage
|
17
19
|
|
20
|
+
Right now, your log files need to be formatted like this:
|
21
|
+
|
22
|
+
I, [2013-04-22T09:47:33.081972 #12790] INFO -- : sending.application.area:status {"optional":"json hash","with":"extra event data"}
|
23
|
+
|
24
|
+
This is obviously [the best log format ever](https://github.com/roqua/roqua-support), but pull requests that add support for customizable formats might be merged. ;)
|
25
|
+
|
26
|
+
If you happen to use this format, you can start `logn` like so.
|
27
|
+
|
18
28
|
$ logn *.log
|
19
29
|
|
20
|
-
|
30
|
+
After this, you'll end up in a pry session (for now) with the local variable `events` prefilled with items for each line from your logs. Then you can do cool things like:
|
21
31
|
|
22
|
-
|
32
|
+
[1] pry(main)> events.select { |e| e.timestamp > Time.new(2013,05,01) }.size
|
33
|
+
=> 27635
|
23
34
|
|
24
35
|
## Contributing
|
25
36
|
|
data/bin/logn
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'logn'
|
4
|
+
require 'ruby-progressbar'
|
4
5
|
|
5
|
-
events =
|
6
|
+
events = Logn::Events.new
|
6
7
|
|
7
8
|
ARGF.set_encoding 'utf-8'
|
8
|
-
puts start = Time.now
|
9
9
|
ARGF.each_line do |line|
|
10
|
-
events
|
10
|
+
events.add Logn::Event.new(line)
|
11
11
|
end
|
12
|
-
puts Time.now - start
|
13
12
|
|
14
|
-
|
15
|
-
|
13
|
+
STDIN.reopen(File.open('/dev/tty', 'r'))
|
14
|
+
|
15
|
+
Logn::Shell.new(events).start
|
data/lib/logn.rb
CHANGED
@@ -3,9 +3,82 @@ require "logn/version"
|
|
3
3
|
require 'ostruct'
|
4
4
|
require 'time'
|
5
5
|
require 'json'
|
6
|
-
require '
|
6
|
+
require 'pry'
|
7
|
+
require 'terminfo'
|
8
|
+
require 'rainbow'
|
7
9
|
|
8
10
|
module Logn
|
11
|
+
class Shell
|
12
|
+
attr_reader :events
|
13
|
+
|
14
|
+
def initialize(events)
|
15
|
+
@events = events
|
16
|
+
end
|
17
|
+
|
18
|
+
def start
|
19
|
+
binding.pry(quiet: true)
|
20
|
+
end
|
21
|
+
|
22
|
+
def filter(&block)
|
23
|
+
@events.add_filter &block
|
24
|
+
end
|
25
|
+
|
26
|
+
def show
|
27
|
+
formatter = EventFormatter.new(STDOUT)
|
28
|
+
@events.each {|e| formatter.print e }
|
29
|
+
nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class Events
|
34
|
+
include Enumerable
|
35
|
+
|
36
|
+
def initialize
|
37
|
+
@events = []
|
38
|
+
@filters = []
|
39
|
+
end
|
40
|
+
|
41
|
+
def add(event)
|
42
|
+
@events << event
|
43
|
+
end
|
44
|
+
|
45
|
+
def add_filter &block
|
46
|
+
@filters << block
|
47
|
+
end
|
48
|
+
|
49
|
+
def matching
|
50
|
+
@events.select do |event|
|
51
|
+
@filters.all? {|filter| filter.call event }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def each(*args, &block)
|
56
|
+
matching.each(*args, &block)
|
57
|
+
end
|
58
|
+
|
59
|
+
def size
|
60
|
+
return @events.size if @filters.empty?
|
61
|
+
matching.size
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
class EventFormatter
|
66
|
+
attr_reader :output
|
67
|
+
|
68
|
+
def initialize(output)
|
69
|
+
@output = output
|
70
|
+
@height, @width = TermInfo.screen_size
|
71
|
+
end
|
72
|
+
|
73
|
+
def print(event)
|
74
|
+
output.print event.timestamp.to_s.color(:yellow)
|
75
|
+
output.print ' '
|
76
|
+
output.print event.sender
|
77
|
+
output.print ":#{event.event}" if event.event
|
78
|
+
output.print "\n"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
9
82
|
class Event
|
10
83
|
LOG_LINE_REGEX = /^
|
11
84
|
(?<level>\w)
|
@@ -49,7 +122,7 @@ module Logn
|
|
49
122
|
end
|
50
123
|
|
51
124
|
def event
|
52
|
-
@event ||= (match[:event] and match[:event].gsub(/^:/, ''))
|
125
|
+
@event ||= (match[:event] and match[:event].gsub(/^:/, '').downcase.to_sym)
|
53
126
|
end
|
54
127
|
|
55
128
|
def metadata
|
data/lib/logn/version.rb
CHANGED
data/logn.gemspec
CHANGED
@@ -19,7 +19,10 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
21
|
spec.add_dependency 'pry'
|
22
|
+
spec.add_dependency 'ruby-terminfo'
|
23
|
+
spec.add_dependency 'rainbow'
|
22
24
|
|
23
25
|
spec.add_development_dependency "bundler", "~> 1.3"
|
24
26
|
spec.add_development_dependency "rake"
|
27
|
+
spec.add_development_dependency "rspec", "~> 2.13"
|
25
28
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-05-
|
12
|
+
date: 2013-05-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: pry
|
@@ -27,6 +27,38 @@ dependencies:
|
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: ruby-terminfo
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rainbow
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
30
62
|
- !ruby/object:Gem::Dependency
|
31
63
|
name: bundler
|
32
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -59,6 +91,22 @@ dependencies:
|
|
59
91
|
- - ! '>='
|
60
92
|
- !ruby/object:Gem::Version
|
61
93
|
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: rspec
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ~>
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '2.13'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '2.13'
|
62
110
|
description: Logn parses and filters log files
|
63
111
|
email:
|
64
112
|
- marten@veldthuis.com
|
@@ -69,6 +117,7 @@ extra_rdoc_files: []
|
|
69
117
|
files:
|
70
118
|
- .gitignore
|
71
119
|
- .rspec
|
120
|
+
- .travis.yml
|
72
121
|
- Gemfile
|
73
122
|
- LICENSE.txt
|
74
123
|
- README.md
|
@@ -93,7 +142,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
93
142
|
version: '0'
|
94
143
|
segments:
|
95
144
|
- 0
|
96
|
-
hash:
|
145
|
+
hash: 2449322827445016964
|
97
146
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
147
|
none: false
|
99
148
|
requirements:
|
@@ -102,10 +151,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
102
151
|
version: '0'
|
103
152
|
segments:
|
104
153
|
- 0
|
105
|
-
hash:
|
154
|
+
hash: 2449322827445016964
|
106
155
|
requirements: []
|
107
156
|
rubyforge_project:
|
108
|
-
rubygems_version: 1.8.
|
157
|
+
rubygems_version: 1.8.23
|
109
158
|
signing_key:
|
110
159
|
specification_version: 3
|
111
160
|
summary: With Logn you can easily grep through formatted logfiles to search and correlate
|