logn 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![Build Status](https://travis-ci.org/roqua/logn.png)](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
|