logm 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/bin/logm +20 -0
  3. data/lib/logmerge.rb +90 -0
  4. metadata +59 -0
@@ -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
@@ -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
@@ -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: []