Class: ApacheLogVisualizer

Inherits:
Object
  • Object
show all
Defined in:
lib/ip-world-map/apache_log_visualizer.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(log_files) ⇒ ApacheLogVisualizer

Returns a new instance of ApacheLogVisualizer.



4
5
6
# File 'lib/ip-world-map/apache_log_visualizer.rb', line 4

def initialize log_files
  @log_files = log_files
end

Class Method Details

.detect_time_format(times) ⇒ Object



8
9
10
11
12
13
14
15
# File 'lib/ip-world-map/apache_log_visualizer.rb', line 8

def self.detect_time_format times
  some_samples = times.sort[0..99]
  smallest_period = some_samples.each_cons(2).collect{ |time1, time2| (time1 - time2).abs }.min || 1

  return '%b %d %Y %H:%M' if smallest_period <  3600 # scale: minutes
  return '%b %d %Y %H:00' if smallest_period < 86400 # scale: hours
  return '%b %d %Y'                                  # scale: days
end

Instance Method Details

#generate_animationObject



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/ip-world-map/apache_log_visualizer.rb', line 27

def generate_animation
  analyzer = ApacheLogAnalyzer.new(@log_files)
  details = analyzer.analyze
  grouped_details = analyzer.group_by_time(details, $visualization_config.group_seconds)

  animation = Magick::ImageList.new
  visualization = Visualization.new
  time_format = $visualization_config.time_format || ApacheLogVisualizer.detect_time_format(grouped_details.keys)
  frame_number = 0

  puts "\nGenerating frames:" if $visualization_config.verbose
  grouped_details.sort.each do |time, details|
    frame_number += 1
    visualization.new_frame
    positions = details.collect{ |data| data[:coordinates] }.select{ |coords| coords.any? }
    p [time, details.size, positions.size] if $visualization_config.verbose
    image = visualization.draw_positions(positions)

    InformationDrawer.new.draw_info(image, visualization, time.strftime(time_format))
    save_image image, frame_number
  end

  render_frames_as_video
end

#generate_imageObject



17
18
19
20
21
22
23
24
25
# File 'lib/ip-world-map/apache_log_visualizer.rb', line 17

def generate_image
  analyzer = ApacheLogAnalyzer.new(@log_files)
  details = analyzer.analyze
  positions = details.collect{ |data| data[:coordinates] }.select{ |coords| coords.any? }

  visualization = Visualization.new
  image = visualization.draw_positions(positions)
  save_image image
end

#render_frames_as_videoObject



60
61
62
63
64
65
# File 'lib/ip-world-map/apache_log_visualizer.rb', line 60

def render_frames_as_video
  puts "\nGenerating video:" if $visualization_config.verbose
  output = `ffmpeg -r #{$visualization_config.frames_per_second} -qscale 1 -y -i animation.%09d.bmp animation.#{$visualization_config.output_format} 2>&1`
  puts output if $visualization_config.verbose
  raise 'could not create the animation' unless $?.exitstatus == 0
end

#save_image(image, frame_number = 0) ⇒ Object



52
53
54
55
56
57
58
# File 'lib/ip-world-map/apache_log_visualizer.rb', line 52

def save_image image, frame_number = 0
  if $visualization_config.animate
    image.write "animation.#{'%09d' % frame_number}.bmp"
  else
    image.write "snapshot.#{$visualization_config.output_format}"
  end
end

#visualizeObject



67
68
69
70
71
72
73
# File 'lib/ip-world-map/apache_log_visualizer.rb', line 67

def visualize
  if $visualization_config.animate
    generate_animation
  else
    generate_image
  end
end