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.
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: []