logm 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/bin/logm +20 -0
- data/lib/logmerge.rb +90 -0
- metadata +59 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 95f1ee4be5ba2793172be713c0319c7760cad683174e64c0f65a5a3d4f75de81
|
4
|
+
data.tar.gz: fd4bbd15d6def17de5d0777675d9730e9b636100486578ce7d710283b7aac8d9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 35d6236a5b3bc7e64697988a4c447bb665782de1dcc185e70cbd4436a0a8d2627d6cc87395a2c16c5b24b974feb72450329cac807ca4096141267c4961a05e27
|
7
|
+
data.tar.gz: da1a9ecb778aebbd0d98e8ba6957a9c80141c09074189838a313d53fc1cb23fa657e691e7c87bc8d2239a30e5d2276e9f73bf27584cd8bcb0cdef16fa4659d8d
|
data/bin/logm
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'logmerge'
|
4
|
+
options = {}
|
5
|
+
|
6
|
+
OptionParser.new do |opts|
|
7
|
+
opts.banner = "Usage: logmerge.rb [options] [logs]"
|
8
|
+
opts.on("-sSTARTTIME", "--startTime=STARTTIME", "startTime") do |time|
|
9
|
+
options[:startTime] = DateTime.parse(time)
|
10
|
+
end
|
11
|
+
opts.on("-eENDTIME", "--endTime=ENDTIME", "endTime") do |time|
|
12
|
+
options[:endTime] = time
|
13
|
+
end
|
14
|
+
end.parse!
|
15
|
+
|
16
|
+
options[:startTime] ||= Time.at(0)
|
17
|
+
options[:endTime] ||= Time.at(2000000000000)
|
18
|
+
|
19
|
+
merge = LogMerge.new(ARGV, options[:startTime], options[:endTime])
|
20
|
+
merge.merge
|
data/lib/logmerge.rb
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'colored'
|
2
|
+
require 'date'
|
3
|
+
require 'optparse'
|
4
|
+
|
5
|
+
class Numeric
|
6
|
+
def minutes; self/1440.0 end
|
7
|
+
alias :minute :minutes
|
8
|
+
|
9
|
+
def seconds; self/86400.0 end
|
10
|
+
alias :second :seconds
|
11
|
+
|
12
|
+
def milliseconds; self/86400000.0 end
|
13
|
+
alias :millisecond :milliseconds
|
14
|
+
end
|
15
|
+
|
16
|
+
class Log
|
17
|
+
attr_accessor :file, :line, :offet, :timestamp, :finished
|
18
|
+
def initialize(path)
|
19
|
+
@offset = 0
|
20
|
+
if path.include?(':')
|
21
|
+
parts = path.split(':')
|
22
|
+
path = parts[0]
|
23
|
+
@offset = parts[1].to_i
|
24
|
+
end
|
25
|
+
@file = File.open(path)
|
26
|
+
@finished = false
|
27
|
+
buffer
|
28
|
+
end
|
29
|
+
|
30
|
+
def parseTimestamp(line)
|
31
|
+
# would be great to generalize this more
|
32
|
+
if line[0] == '['
|
33
|
+
# agent logs
|
34
|
+
ts = DateTime.parse(line[1...24])
|
35
|
+
ts = ts + @offset.seconds
|
36
|
+
line[1...24] = ts.to_s
|
37
|
+
else
|
38
|
+
#mms logs
|
39
|
+
ts = DateTime.parse(line[0...28])
|
40
|
+
ts = ts + @offset.seconds
|
41
|
+
line[0...28] = "[#{ts.to_s}]"
|
42
|
+
end
|
43
|
+
ts
|
44
|
+
end
|
45
|
+
|
46
|
+
def buffer
|
47
|
+
begin
|
48
|
+
@line = file.readline.strip
|
49
|
+
@timestamp = parseTimestamp(line)
|
50
|
+
rescue Date::Error
|
51
|
+
@timestamp = nil
|
52
|
+
end
|
53
|
+
rescue EOFError
|
54
|
+
@line = nil
|
55
|
+
@finished = true
|
56
|
+
@timestamp = nil
|
57
|
+
end
|
58
|
+
|
59
|
+
def take
|
60
|
+
ret = line
|
61
|
+
buffer
|
62
|
+
ret
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
class LogMerge
|
67
|
+
attr_reader :logs, :startTime, :endTime
|
68
|
+
def initialize(files, startTime=Time.at(0), endTime=Time.at(2000000000000))
|
69
|
+
@logs = files.map {|f| Log.new(f)}
|
70
|
+
@startTime = DateTime.parse(startTime.to_s)
|
71
|
+
@endTime = DateTime.parse(endTime.to_s)
|
72
|
+
end
|
73
|
+
|
74
|
+
def merge
|
75
|
+
colors = Colored::COLORS.keys.dup
|
76
|
+
colors.delete('black')
|
77
|
+
while true
|
78
|
+
min_log = logs.select {|l| !l.finished}.sort { |a,b| a.timestamp && b.timestamp ? a.timestamp <=> b.timestamp : b.timestamp ? -1 : 1 }.first #could be priority queue instead
|
79
|
+
break if min_log.nil?
|
80
|
+
next min_log.take unless min_log.timestamp
|
81
|
+
next min_log.take if min_log.timestamp < startTime
|
82
|
+
break if min_log.nil?
|
83
|
+
break if min_log.timestamp > endTime
|
84
|
+
index = logs.index(min_log)
|
85
|
+
color_index = index % colors.size
|
86
|
+
color = colors[color_index]
|
87
|
+
puts Colored.colorize(min_log.take, foreground: color)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
metadata
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: logm
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Peter Vertenten
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-10-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: colored
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.2'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.2'
|
27
|
+
description: A simple logmerge utility
|
28
|
+
email: peter.vertenten@gmail.com
|
29
|
+
executables:
|
30
|
+
- logm
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- bin/logm
|
35
|
+
- lib/logmerge.rb
|
36
|
+
homepage: https://github.com/pvertenten/logmerge/
|
37
|
+
licenses:
|
38
|
+
- MIT
|
39
|
+
metadata: {}
|
40
|
+
post_install_message:
|
41
|
+
rdoc_options: []
|
42
|
+
require_paths:
|
43
|
+
- lib
|
44
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
requirements: []
|
55
|
+
rubygems_version: 3.1.4
|
56
|
+
signing_key:
|
57
|
+
specification_version: 4
|
58
|
+
summary: Log Merge Utility!
|
59
|
+
test_files: []
|