omloga 0.0.1
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.
- checksums.yaml +7 -0
- data/README.md +4 -0
- data/bin/omloga +5 -0
- data/lib/omloga/request.rb +48 -0
- data/lib/omloga.rb +148 -0
- metadata +63 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0120863a25a06fc3a0f1071965b346b3e4d254c1
|
4
|
+
data.tar.gz: d7fa15b01f36a9a4e796e4c4e000c8d893bdb0eb
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 669be8047715977a016802a9a0e6723c1868591ee59c8a1c839d6067d2027a83406aeaea4b62e75b60d0a8c2f989c02e42d85cca6db5a79b37dca970fcf0a15c
|
7
|
+
data.tar.gz: ab4a597930ae7f02dbf7b563838b5257e06e45c60b12fbdd43d99525148100a86b6236518386f2e1c47469ad202ba94daf32d41ef83a5b4732e54ba35aca93ef
|
data/README.md
ADDED
data/bin/omloga
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
require 'moped'
|
4
|
+
|
5
|
+
module Omloga
|
6
|
+
class Request
|
7
|
+
attr_accessor :id, :pid, :saved, :lines, :count, :complete_count, :path, :status, :created_at, :updated_at
|
8
|
+
|
9
|
+
def initialize(pid, start_line)
|
10
|
+
@id = Moped::BSON::ObjectId.new
|
11
|
+
@pid = pid
|
12
|
+
@saved = false
|
13
|
+
@count = 1
|
14
|
+
@complete_count = 0
|
15
|
+
@lines = [start_line.to_s]
|
16
|
+
end
|
17
|
+
|
18
|
+
def mongo_doc
|
19
|
+
obj = {
|
20
|
+
'_id' => id,
|
21
|
+
'pid' => pid,
|
22
|
+
'count' => count,
|
23
|
+
'lines' => lines.join("")
|
24
|
+
}
|
25
|
+
|
26
|
+
if saved
|
27
|
+
obj['updated_at'] = Time.now
|
28
|
+
else
|
29
|
+
obj['created_at'] = obj['updated_at'] = Time.now
|
30
|
+
end
|
31
|
+
obj
|
32
|
+
end
|
33
|
+
|
34
|
+
def id_doc
|
35
|
+
{'_id' => id }
|
36
|
+
end
|
37
|
+
|
38
|
+
def add_line_special(line, pos)
|
39
|
+
line = line.to_s
|
40
|
+
lines.insert(line, pos.to_i)
|
41
|
+
rescue StandardError => e
|
42
|
+
puts "\nline = \n#{line} | is_last = #{is_last}"
|
43
|
+
puts e.message
|
44
|
+
puts e.backtrace.join("\n")
|
45
|
+
exit
|
46
|
+
end
|
47
|
+
end #__End of class Request__
|
48
|
+
end #__End of module Omloga__
|
data/lib/omloga.rb
ADDED
@@ -0,0 +1,148 @@
|
|
1
|
+
require 'moped'
|
2
|
+
require 'optparse'
|
3
|
+
require 'ostruct'
|
4
|
+
require 'omloga/request'
|
5
|
+
|
6
|
+
def omloga(args)
|
7
|
+
|
8
|
+
options = OpenStruct.new
|
9
|
+
|
10
|
+
opts_parser = OptionParser.new do |opts|
|
11
|
+
|
12
|
+
opts.banner = "\nUsage : omloga -d <mongodb-uri> -c <collection-name> [OPTIONS] <log-file-path>"
|
13
|
+
|
14
|
+
opts.separator ""
|
15
|
+
|
16
|
+
opts.on('-d', '--dburi Mongodb-URI', 'MongoDB URI with username/password (if needed) and DB name') do |uri|
|
17
|
+
options.dburi = uri
|
18
|
+
end
|
19
|
+
|
20
|
+
opts.on('-c', '--collection Collection-Name', 'Name of the collection where the log lines should be stored') do |c|
|
21
|
+
options.collection = c
|
22
|
+
end
|
23
|
+
|
24
|
+
opts.on('--log-skip SKIP-FILE-PATH', 'Logs the skipped lines to the specified file') do |sf|
|
25
|
+
options.skip_file_path = sf
|
26
|
+
end
|
27
|
+
|
28
|
+
opts.on_tail('-h', '--help', 'Show this help message') do
|
29
|
+
puts opts
|
30
|
+
exit
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
opts_parser.parse!(args)
|
35
|
+
|
36
|
+
if args.length < 1
|
37
|
+
puts "Insufficient number of arguments"
|
38
|
+
puts opts_parser
|
39
|
+
exit
|
40
|
+
end
|
41
|
+
|
42
|
+
def db_session
|
43
|
+
$DB_SESSION
|
44
|
+
end
|
45
|
+
|
46
|
+
def logs_collection
|
47
|
+
$DB_LOGS_COLLECTION
|
48
|
+
end
|
49
|
+
|
50
|
+
def request_hash
|
51
|
+
$REQUEST_HASH
|
52
|
+
end
|
53
|
+
|
54
|
+
$DB_SESSION = Moped::Session.connect(options.dburi)
|
55
|
+
$DB_LOGS_COLLECTION = db_session[options.collection]
|
56
|
+
$REQUEST_HASH = {}
|
57
|
+
$LOG_FILE = args[0]
|
58
|
+
|
59
|
+
def is_start_line?(line)
|
60
|
+
line = line.to_s
|
61
|
+
return false if line.nil? or line.length < 7 # "Started" is 7 characters long. It is minimal
|
62
|
+
|
63
|
+
if line.match(/Started/).nil?
|
64
|
+
false
|
65
|
+
else
|
66
|
+
true
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def is_complete_line?(line)
|
71
|
+
line = line.to_s
|
72
|
+
return false if line.nil? or line.length < 9 # "Completed" is 9 characters long. It is minimal
|
73
|
+
|
74
|
+
if line.match(/Completed/).nil?
|
75
|
+
false
|
76
|
+
else
|
77
|
+
true
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def get_pid(line)
|
82
|
+
match_data = line.match(/#([0-9]+)\]/)
|
83
|
+
if match_data
|
84
|
+
return match_data[1]
|
85
|
+
else
|
86
|
+
return nil
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
line_count = 0
|
91
|
+
request_count = 0
|
92
|
+
lines_skipped = 0
|
93
|
+
status_str = ''
|
94
|
+
$stdout.sync = true
|
95
|
+
log_skip = false
|
96
|
+
if options.skip_file_path
|
97
|
+
skipped_lines = File.open(options.skip_file_path, 'a')
|
98
|
+
log_skip = true
|
99
|
+
end
|
100
|
+
|
101
|
+
File.foreach($LOG_FILE) do |log_line|
|
102
|
+
pid = get_pid(log_line)
|
103
|
+
req = request_hash[pid]
|
104
|
+
|
105
|
+
if is_start_line?(log_line)
|
106
|
+
if req
|
107
|
+
req.lines << log_line
|
108
|
+
req.count+= 1
|
109
|
+
else
|
110
|
+
req = Omloga::Request.new(pid, log_line)
|
111
|
+
request_hash[pid] = req
|
112
|
+
end
|
113
|
+
else
|
114
|
+
unless req
|
115
|
+
lines_skipped+= 1
|
116
|
+
skipped_lines.print log_line if log_skip
|
117
|
+
next
|
118
|
+
end
|
119
|
+
is_complete = is_complete_line?(log_line)
|
120
|
+
req.lines << log_line
|
121
|
+
|
122
|
+
if is_complete
|
123
|
+
req.complete_count+= 1
|
124
|
+
|
125
|
+
if req.complete_count >= req.count
|
126
|
+
logs_collection.find(req.id_doc).upsert(req.mongo_doc)
|
127
|
+
request_hash.delete(pid)
|
128
|
+
request_count+= req.count
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
line_count+= 1
|
133
|
+
|
134
|
+
status_str.length.times { print "\b" }
|
135
|
+
|
136
|
+
status_str = "Lines Processed : #{line_count} | Requests found : #{request_count} | Lines Skipped : #{lines_skipped}"
|
137
|
+
print status_str
|
138
|
+
end
|
139
|
+
|
140
|
+
puts ""
|
141
|
+
|
142
|
+
if log_skip
|
143
|
+
puts "Skipped lines have been written to : #{options.skip_file_path}"
|
144
|
+
skipped_lines.close
|
145
|
+
end
|
146
|
+
|
147
|
+
puts "\nDone..!"
|
148
|
+
end
|
metadata
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: omloga
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Srirang G Doddihal
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-10-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: moped
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.4.3
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.4.3
|
27
|
+
description: Stitches together log lines of every request and inserts them as one
|
28
|
+
record in MongoDB for easier analysis
|
29
|
+
email: om.brahmana@gmail.com
|
30
|
+
executables:
|
31
|
+
- omloga
|
32
|
+
extensions: []
|
33
|
+
extra_rdoc_files: []
|
34
|
+
files:
|
35
|
+
- lib/omloga.rb
|
36
|
+
- lib/omloga/request.rb
|
37
|
+
- README.md
|
38
|
+
- bin/omloga
|
39
|
+
homepage: http://rubygems.org/gems/omloga
|
40
|
+
licenses:
|
41
|
+
- MIT
|
42
|
+
metadata: {}
|
43
|
+
post_install_message:
|
44
|
+
rdoc_options: []
|
45
|
+
require_paths:
|
46
|
+
- lib
|
47
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - '>='
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - '>='
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
requirements: []
|
58
|
+
rubyforge_project:
|
59
|
+
rubygems_version: 2.0.3
|
60
|
+
signing_key:
|
61
|
+
specification_version: 4
|
62
|
+
summary: A Ruby on Rails log parser and stitcher.
|
63
|
+
test_files: []
|