log_parser 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d0266c27679963d92c477416724cc2f4d6c6c31e
4
+ data.tar.gz: de90fce1a04226daed8bec5569f1ed346404affc
5
+ SHA512:
6
+ metadata.gz: 4017645035ace98a41365b214824fb574f43f8046e1b2bd7720da9b904294fea8db2ba54ea8ab8f9478e1ea627b55c94612ef23c42d5e4fcc6fac709fa4ae434
7
+ data.tar.gz: d20d3857914ae340fb92e4bbf8d1c09120cb761a2ac2d17bf0286fe8905317c26e2270e11a6036bbfbdd74fc5812a15cb2fe460dfae797c8b88f901427fb2072
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in log_parser.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Ryan Buckley
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # LogParser
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'log_parser'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install log_parser
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it ( https://github.com/[my-github-username]/log_parser/fork )
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,3 @@
1
+ class LogParser
2
+ VERSION = '0.0.1'.freeze
3
+ end
data/lib/log_parser.rb ADDED
@@ -0,0 +1,158 @@
1
+ require "log_parser/version"
2
+
3
+ class LogParser
4
+ #
5
+ # = Class
6
+ #
7
+ # Filter lines from the log file by chaining methods together:
8
+ #
9
+ # log = LogParser.new('open_table.log')
10
+ # log.errors.by_message('authentication failed').since(1.day.ago)
11
+ # #=> ["[2014-11-13T23:12:14-07:00] ERROR [page_id 95239] Authentication failed with token ..."]
12
+ #
13
+
14
+ LINE_PATTERN = %r{
15
+ \[(\d+-\d+-\d+T\d+:\d+:\d+-\d+:\d+)\] # timestamp
16
+ (\s(\w+):)? # type of message (ERROR, WARNING, INFO)
17
+ (\s\[(.+)\])? # prefix (introduced by log.rb)
18
+ \s(.+)$ # message body
19
+ }x
20
+
21
+ attr_reader :file_path
22
+ attr_writer :lines
23
+
24
+ # @param log [String|Pathname] The file name in the log directory or a pathname to a log file
25
+ # @param line_items [Array] (optional) An array of LineItems
26
+ def initialize(log = '', line_items = [])
27
+ @file_path = log.is_a?(String) ? Rails.root.join('log', log) : log
28
+ @lines = line_items
29
+ end
30
+
31
+ #
32
+ # Chainable
33
+ #
34
+
35
+ def errors
36
+ by_type('ERROR')
37
+ end
38
+
39
+ def warnings
40
+ by_type('WARNING')
41
+ end
42
+
43
+ def infos
44
+ by_type('INFO')
45
+ end
46
+
47
+ def by_message(text)
48
+ chain do |items|
49
+ for line in lines
50
+ items << line if line.message =~ Regexp.new(text, Regexp::IGNORECASE)
51
+ end
52
+ end
53
+ end
54
+
55
+ def since(timestamp)
56
+ chain do |items|
57
+ for line in lines
58
+ items << line if DateTime.parse(line.timestamp) > timestamp
59
+ end
60
+ end
61
+ end
62
+
63
+ def by_prefix(name)
64
+ chain do |items|
65
+ for line in lines
66
+ items << line if line.prefix == name
67
+ end
68
+ end
69
+ end
70
+
71
+ def by_type(name)
72
+ chain do |items|
73
+ for line in lines
74
+ items << line if line.type == name
75
+ end
76
+ end
77
+ end
78
+
79
+ #
80
+ # Helpers
81
+ #
82
+
83
+ def prefixes
84
+ items = Set.new
85
+ lines.each { |line| items << line.prefix }
86
+ items.to_a.compact
87
+ end
88
+
89
+ def timestamps
90
+ lines.map(&:timestamp)
91
+ end
92
+
93
+ def messages
94
+ lines.map(&:message)
95
+ end
96
+
97
+ def strings
98
+ lines.map(&:to_s)
99
+ end
100
+
101
+ def count
102
+ lines.count
103
+ end
104
+
105
+ def uniq
106
+ lines.uniq { |line| line.full_message }
107
+ end
108
+
109
+ def to_s
110
+ Array(@lines).map(&:to_s).to_s
111
+ end
112
+
113
+ alias inspect to_s
114
+
115
+ #
116
+ # Private
117
+ #
118
+
119
+ def scan
120
+ line_items = []
121
+ File.open(file_path) do |f|
122
+ while line = f.gets
123
+ line_items << LineItem.new($1, $3, $5, $6) if line =~ LINE_PATTERN
124
+ end
125
+ end
126
+ line_items
127
+ end
128
+
129
+ def chain
130
+ items = []
131
+ yield items
132
+ self.class.new(file_path, items)
133
+ end
134
+
135
+ def lines
136
+ @lines.presence || scan
137
+ end
138
+
139
+ alias to_a lines
140
+
141
+ class LineItem < Struct.new(:timestamp, :type, :prefix, :message)
142
+ def to_s
143
+ s = "[#{timestamp}] "
144
+ s << "#{type}: " if type
145
+ s << "[#{prefix}] " if prefix
146
+ s << "#{message}"
147
+ s
148
+ end
149
+
150
+ def full_message
151
+ prefix ? "[#{prefix}] #{message}" : message
152
+ end
153
+
154
+ def <=>(other)
155
+ timestamp <=> other.timestamp
156
+ end
157
+ end
158
+ end
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'log_parser/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "log_parser"
8
+ spec.version = LogParser::VERSION
9
+ spec.authors = ["Ryan Buckley"]
10
+ spec.email = ["arebuckley@gmail.com"]
11
+ spec.summary = %q{Easily search log files}
12
+ spec.description = %q{Scan through logs with some filter methods}
13
+ spec.homepage = 'https://github.com/ridiculous'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.6"
22
+ spec.add_development_dependency "rake"
23
+ end
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: log_parser
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Ryan Buckley
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-11-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Scan through logs with some filter methods
42
+ email:
43
+ - arebuckley@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - ".gitignore"
49
+ - Gemfile
50
+ - LICENSE.txt
51
+ - README.md
52
+ - Rakefile
53
+ - lib/log_parser.rb
54
+ - lib/log_parser/version.rb
55
+ - log_parser.gemspec
56
+ homepage: https://github.com/ridiculous
57
+ licenses:
58
+ - MIT
59
+ metadata: {}
60
+ post_install_message:
61
+ rdoc_options: []
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ requirements: []
75
+ rubyforge_project:
76
+ rubygems_version: 2.2.2
77
+ signing_key:
78
+ specification_version: 4
79
+ summary: Easily search log files
80
+ test_files: []