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 ADDED
@@ -0,0 +1,3 @@
1
+ rvm:
2
+ - 1.9.3
3
+ script: rspec spec
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
- Right now, your log files need to be formatted like this:
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
- I, [2013-04-22T09:47:33.081972 #12790] ERROR -- : sending.application.area:status {"optional":"json hash","with":"extra event data"}
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 << Logn::Event.new(line)
10
+ events.add Logn::Event.new(line)
11
11
  end
12
- puts Time.now - start
13
12
 
14
- require 'pry'
15
- binding.pry
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 'yajl'
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
@@ -1,3 +1,3 @@
1
1
  module Logn
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
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.1
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-21 00:00:00.000000000 Z
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: -487170330778638442
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: -487170330778638442
154
+ hash: 2449322827445016964
106
155
  requirements: []
107
156
  rubyforge_project:
108
- rubygems_version: 1.8.25
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